@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.
Files changed (533) hide show
  1. package/.turbo/turbo-build.log +2 -2
  2. package/dist/generated/entities/channel_ingest_dead_letter/index.js +25 -0
  3. package/dist/generated/entities/channel_ingest_dead_letter/index.js.map +7 -0
  4. package/dist/generated/entities/channel_thread_mapping/index.js +25 -0
  5. package/dist/generated/entities/channel_thread_mapping/index.js.map +7 -0
  6. package/dist/generated/entities/channel_thread_token/index.js +17 -0
  7. package/dist/generated/entities/channel_thread_token/index.js.map +7 -0
  8. package/dist/generated/entities/communication_channel/index.js +43 -0
  9. package/dist/generated/entities/communication_channel/index.js.map +7 -0
  10. package/dist/generated/entities/customer_interaction/index.js +4 -0
  11. package/dist/generated/entities/customer_interaction/index.js.map +2 -2
  12. package/dist/generated/entities/external_conversation/index.js +25 -0
  13. package/dist/generated/entities/external_conversation/index.js.map +7 -0
  14. package/dist/generated/entities/external_message/index.js +25 -0
  15. package/dist/generated/entities/external_message/index.js.map +7 -0
  16. package/dist/generated/entities/integration_credentials/index.js +3 -1
  17. package/dist/generated/entities/integration_credentials/index.js.map +2 -2
  18. package/dist/generated/entities/message/index.js +2 -0
  19. package/dist/generated/entities/message/index.js.map +2 -2
  20. package/dist/generated/entities/message_channel_link/index.js +33 -0
  21. package/dist/generated/entities/message_channel_link/index.js.map +7 -0
  22. package/dist/generated/entities/message_reaction/index.js +25 -0
  23. package/dist/generated/entities/message_reaction/index.js.map +7 -0
  24. package/dist/generated/entities.ids.generated.js +11 -0
  25. package/dist/generated/entities.ids.generated.js.map +2 -2
  26. package/dist/generated/entity-fields-registry.js +117 -0
  27. package/dist/generated/entity-fields-registry.js.map +2 -2
  28. package/dist/helpers/integration/authFixtures.js +2 -1
  29. package/dist/helpers/integration/authFixtures.js.map +2 -2
  30. package/dist/helpers/integration/communicationChannelsFixtures.js +58 -0
  31. package/dist/helpers/integration/communicationChannelsFixtures.js.map +7 -0
  32. package/dist/modules/communication_channels/acl.js +47 -0
  33. package/dist/modules/communication_channels/acl.js.map +7 -0
  34. package/dist/modules/communication_channels/api/delete/channels/[id]/route.js +133 -0
  35. package/dist/modules/communication_channels/api/delete/channels/[id]/route.js.map +7 -0
  36. package/dist/modules/communication_channels/api/delete/messages/[messageId]/reactions/[reactionId]/route.js +113 -0
  37. package/dist/modules/communication_channels/api/delete/messages/[messageId]/reactions/[reactionId]/route.js.map +7 -0
  38. package/dist/modules/communication_channels/api/get/channels/[id]/health/route.js +138 -0
  39. package/dist/modules/communication_channels/api/get/channels/[id]/health/route.js.map +7 -0
  40. package/dist/modules/communication_channels/api/get/channels/[id]/route.js +93 -0
  41. package/dist/modules/communication_channels/api/get/channels/[id]/route.js.map +7 -0
  42. package/dist/modules/communication_channels/api/get/channels/route.js +96 -0
  43. package/dist/modules/communication_channels/api/get/channels/route.js.map +7 -0
  44. package/dist/modules/communication_channels/api/get/me/channels/route.js +82 -0
  45. package/dist/modules/communication_channels/api/get/me/channels/route.js.map +7 -0
  46. package/dist/modules/communication_channels/api/get/oauth/[provider]/callback/route.js +274 -0
  47. package/dist/modules/communication_channels/api/get/oauth/[provider]/callback/route.js.map +7 -0
  48. package/dist/modules/communication_channels/api/post/channels/[id]/import-history/route.js +168 -0
  49. package/dist/modules/communication_channels/api/post/channels/[id]/import-history/route.js.map +7 -0
  50. package/dist/modules/communication_channels/api/post/channels/[id]/poll-now/route.js +143 -0
  51. package/dist/modules/communication_channels/api/post/channels/[id]/poll-now/route.js.map +7 -0
  52. package/dist/modules/communication_channels/api/post/channels/[id]/push/register/route.js +127 -0
  53. package/dist/modules/communication_channels/api/post/channels/[id]/push/register/route.js.map +7 -0
  54. package/dist/modules/communication_channels/api/post/channels/[id]/set-primary/route.js +99 -0
  55. package/dist/modules/communication_channels/api/post/channels/[id]/set-primary/route.js.map +7 -0
  56. package/dist/modules/communication_channels/api/post/channels/[id]/test-send/route.js +197 -0
  57. package/dist/modules/communication_channels/api/post/channels/[id]/test-send/route.js.map +7 -0
  58. package/dist/modules/communication_channels/api/post/channels/connect/credentials/route.js +124 -0
  59. package/dist/modules/communication_channels/api/post/channels/connect/credentials/route.js.map +7 -0
  60. package/dist/modules/communication_channels/api/post/messages/[messageId]/reactions/route.js +120 -0
  61. package/dist/modules/communication_channels/api/post/messages/[messageId]/reactions/route.js.map +7 -0
  62. package/dist/modules/communication_channels/api/post/oauth/[provider]/initiate/route.js +157 -0
  63. package/dist/modules/communication_channels/api/post/oauth/[provider]/initiate/route.js.map +7 -0
  64. package/dist/modules/communication_channels/api/post/send-as-user/route.js +115 -0
  65. package/dist/modules/communication_channels/api/post/send-as-user/route.js.map +7 -0
  66. package/dist/modules/communication_channels/api/post/test-seed/route.js +217 -0
  67. package/dist/modules/communication_channels/api/post/test-seed/route.js.map +7 -0
  68. package/dist/modules/communication_channels/api/post/webhook/[provider]/route.js +175 -0
  69. package/dist/modules/communication_channels/api/post/webhook/[provider]/route.js.map +7 -0
  70. package/dist/modules/communication_channels/api/post/webhooks/gmail/route.js +123 -0
  71. package/dist/modules/communication_channels/api/post/webhooks/gmail/route.js.map +7 -0
  72. package/dist/modules/communication_channels/api/put/threads/[threadId]/assign/route.js +117 -0
  73. package/dist/modules/communication_channels/api/put/threads/[threadId]/assign/route.js.map +7 -0
  74. package/dist/modules/communication_channels/backend/communication_channels/channels/[id]/page.js +180 -0
  75. package/dist/modules/communication_channels/backend/communication_channels/channels/[id]/page.js.map +7 -0
  76. package/dist/modules/communication_channels/backend/communication_channels/channels/[id]/page.meta.js +36 -0
  77. package/dist/modules/communication_channels/backend/communication_channels/channels/[id]/page.meta.js.map +7 -0
  78. package/dist/modules/communication_channels/backend/communication_channels/channels/page.js +107 -0
  79. package/dist/modules/communication_channels/backend/communication_channels/channels/page.js.map +7 -0
  80. package/dist/modules/communication_channels/backend/communication_channels/channels/page.meta.js +38 -0
  81. package/dist/modules/communication_channels/backend/communication_channels/channels/page.meta.js.map +7 -0
  82. package/dist/modules/communication_channels/backend/profile/communication-channels/page.js +727 -0
  83. package/dist/modules/communication_channels/backend/profile/communication-channels/page.js.map +7 -0
  84. package/dist/modules/communication_channels/backend/profile/communication-channels/page.meta.js +38 -0
  85. package/dist/modules/communication_channels/backend/profile/communication-channels/page.meta.js.map +7 -0
  86. package/dist/modules/communication_channels/commands/connect-credential-channel.js +154 -0
  87. package/dist/modules/communication_channels/commands/connect-credential-channel.js.map +7 -0
  88. package/dist/modules/communication_channels/commands/delete-channel.js +137 -0
  89. package/dist/modules/communication_channels/commands/delete-channel.js.map +7 -0
  90. package/dist/modules/communication_channels/commands/deliver-outbound-message.js +400 -0
  91. package/dist/modules/communication_channels/commands/deliver-outbound-message.js.map +7 -0
  92. package/dist/modules/communication_channels/commands/disconnect-channel.js +163 -0
  93. package/dist/modules/communication_channels/commands/disconnect-channel.js.map +7 -0
  94. package/dist/modules/communication_channels/commands/ingest-inbound-message.js +413 -0
  95. package/dist/modules/communication_channels/commands/ingest-inbound-message.js.map +7 -0
  96. package/dist/modules/communication_channels/commands/interceptors.js +68 -0
  97. package/dist/modules/communication_channels/commands/interceptors.js.map +7 -0
  98. package/dist/modules/communication_channels/commands/process-inbound-reaction.js +198 -0
  99. package/dist/modules/communication_channels/commands/process-inbound-reaction.js.map +7 -0
  100. package/dist/modules/communication_channels/commands/push-register.js +146 -0
  101. package/dist/modules/communication_channels/commands/push-register.js.map +7 -0
  102. package/dist/modules/communication_channels/commands/push-renew.js +23 -0
  103. package/dist/modules/communication_channels/commands/push-renew.js.map +7 -0
  104. package/dist/modules/communication_channels/commands/push-unregister.js +108 -0
  105. package/dist/modules/communication_channels/commands/push-unregister.js.map +7 -0
  106. package/dist/modules/communication_channels/commands/queue-import-history.js +113 -0
  107. package/dist/modules/communication_channels/commands/queue-import-history.js.map +7 -0
  108. package/dist/modules/communication_channels/commands/reassign-conversation.js +193 -0
  109. package/dist/modules/communication_channels/commands/reassign-conversation.js.map +7 -0
  110. package/dist/modules/communication_channels/commands/set-primary-channel.js +114 -0
  111. package/dist/modules/communication_channels/commands/set-primary-channel.js.map +7 -0
  112. package/dist/modules/communication_channels/commands/toggle-outbound-reaction.js +260 -0
  113. package/dist/modules/communication_channels/commands/toggle-outbound-reaction.js.map +7 -0
  114. package/dist/modules/communication_channels/data/enrichers.js +286 -0
  115. package/dist/modules/communication_channels/data/enrichers.js.map +7 -0
  116. package/dist/modules/communication_channels/data/entities.js +447 -0
  117. package/dist/modules/communication_channels/data/entities.js.map +7 -0
  118. package/dist/modules/communication_channels/data/extensions.js +67 -0
  119. package/dist/modules/communication_channels/data/extensions.js.map +7 -0
  120. package/dist/modules/communication_channels/data/validators.js +123 -0
  121. package/dist/modules/communication_channels/data/validators.js.map +7 -0
  122. package/dist/modules/communication_channels/di.js +35 -0
  123. package/dist/modules/communication_channels/di.js.map +7 -0
  124. package/dist/modules/communication_channels/encryption.js +12 -0
  125. package/dist/modules/communication_channels/encryption.js.map +7 -0
  126. package/dist/modules/communication_channels/events.js +124 -0
  127. package/dist/modules/communication_channels/events.js.map +7 -0
  128. package/dist/modules/communication_channels/index.js +20 -0
  129. package/dist/modules/communication_channels/index.js.map +7 -0
  130. package/dist/modules/communication_channels/lib/access-control.js +43 -0
  131. package/dist/modules/communication_channels/lib/access-control.js.map +7 -0
  132. package/dist/modules/communication_channels/lib/adapter-compat.js +36 -0
  133. package/dist/modules/communication_channels/lib/adapter-compat.js.map +7 -0
  134. package/dist/modules/communication_channels/lib/adapter-registry-singleton.js +22 -0
  135. package/dist/modules/communication_channels/lib/adapter-registry-singleton.js.map +7 -0
  136. package/dist/modules/communication_channels/lib/adapter.js +1 -0
  137. package/dist/modules/communication_channels/lib/adapter.js.map +7 -0
  138. package/dist/modules/communication_channels/lib/connect-channel.js +95 -0
  139. package/dist/modules/communication_channels/lib/connect-channel.js.map +7 -0
  140. package/dist/modules/communication_channels/lib/contact-resolver.js +79 -0
  141. package/dist/modules/communication_channels/lib/contact-resolver.js.map +7 -0
  142. package/dist/modules/communication_channels/lib/credential-refresh.js +97 -0
  143. package/dist/modules/communication_channels/lib/credential-refresh.js.map +7 -0
  144. package/dist/modules/communication_channels/lib/dead-letter.js +62 -0
  145. package/dist/modules/communication_channels/lib/dead-letter.js.map +7 -0
  146. package/dist/modules/communication_channels/lib/email-capabilities.js +47 -0
  147. package/dist/modules/communication_channels/lib/email-capabilities.js.map +7 -0
  148. package/dist/modules/communication_channels/lib/email-contact.js +14 -0
  149. package/dist/modules/communication_channels/lib/email-contact.js.map +7 -0
  150. package/dist/modules/communication_channels/lib/email-mime.js +259 -0
  151. package/dist/modules/communication_channels/lib/email-mime.js.map +7 -0
  152. package/dist/modules/communication_channels/lib/error-classification.js +101 -0
  153. package/dist/modules/communication_channels/lib/error-classification.js.map +7 -0
  154. package/dist/modules/communication_channels/lib/gmail-pubsub-jwt.js +185 -0
  155. package/dist/modules/communication_channels/lib/gmail-pubsub-jwt.js.map +7 -0
  156. package/dist/modules/communication_channels/lib/mutation-guards.js +114 -0
  157. package/dist/modules/communication_channels/lib/mutation-guards.js.map +7 -0
  158. package/dist/modules/communication_channels/lib/oauth-client-config.js +32 -0
  159. package/dist/modules/communication_channels/lib/oauth-client-config.js.map +7 -0
  160. package/dist/modules/communication_channels/lib/oauth-state.js +128 -0
  161. package/dist/modules/communication_channels/lib/oauth-state.js.map +7 -0
  162. package/dist/modules/communication_channels/lib/oauth-token.js +45 -0
  163. package/dist/modules/communication_channels/lib/oauth-token.js.map +7 -0
  164. package/dist/modules/communication_channels/lib/pg-errors.js +11 -0
  165. package/dist/modules/communication_channels/lib/pg-errors.js.map +7 -0
  166. package/dist/modules/communication_channels/lib/provider-health.js +24 -0
  167. package/dist/modules/communication_channels/lib/provider-health.js.map +7 -0
  168. package/dist/modules/communication_channels/lib/push-state.js +19 -0
  169. package/dist/modules/communication_channels/lib/push-state.js.map +7 -0
  170. package/dist/modules/communication_channels/lib/queue.js +54 -0
  171. package/dist/modules/communication_channels/lib/queue.js.map +7 -0
  172. package/dist/modules/communication_channels/lib/reaction-processor-types.js +5 -0
  173. package/dist/modules/communication_channels/lib/reaction-processor-types.js.map +7 -0
  174. package/dist/modules/communication_channels/lib/reaction-semantics.js +11 -0
  175. package/dist/modules/communication_channels/lib/reaction-semantics.js.map +7 -0
  176. package/dist/modules/communication_channels/lib/registry.js +67 -0
  177. package/dist/modules/communication_channels/lib/registry.js.map +7 -0
  178. package/dist/modules/communication_channels/lib/route-mutation-guard.js +43 -0
  179. package/dist/modules/communication_channels/lib/route-mutation-guard.js.map +7 -0
  180. package/dist/modules/communication_channels/lib/sanitize-channel-html.js +96 -0
  181. package/dist/modules/communication_channels/lib/sanitize-channel-html.js.map +7 -0
  182. package/dist/modules/communication_channels/lib/send-as-user.js +194 -0
  183. package/dist/modules/communication_channels/lib/send-as-user.js.map +7 -0
  184. package/dist/modules/communication_channels/lib/system-user.js +22 -0
  185. package/dist/modules/communication_channels/lib/system-user.js.map +7 -0
  186. package/dist/modules/communication_channels/lib/test-seed.js +68 -0
  187. package/dist/modules/communication_channels/lib/test-seed.js.map +7 -0
  188. package/dist/modules/communication_channels/lib/thread-matcher.js +263 -0
  189. package/dist/modules/communication_channels/lib/thread-matcher.js.map +7 -0
  190. package/dist/modules/communication_channels/lib/thread-token.js +219 -0
  191. package/dist/modules/communication_channels/lib/thread-token.js.map +7 -0
  192. package/dist/modules/communication_channels/lib/use-connect-channel.js +61 -0
  193. package/dist/modules/communication_channels/lib/use-connect-channel.js.map +7 -0
  194. package/dist/modules/communication_channels/migrations/Migration20260526134719_communication_channels.js +50 -0
  195. package/dist/modules/communication_channels/migrations/Migration20260526134719_communication_channels.js.map +7 -0
  196. package/dist/modules/communication_channels/migrations/Migration20260527195446_communication_channels.js +19 -0
  197. package/dist/modules/communication_channels/migrations/Migration20260527195446_communication_channels.js.map +7 -0
  198. package/dist/modules/communication_channels/migrations/Migration20260529231848_communication_channels.js +13 -0
  199. package/dist/modules/communication_channels/migrations/Migration20260529231848_communication_channels.js.map +7 -0
  200. package/dist/modules/communication_channels/migrations/Migration20260531120000_communication_channels.js +17 -0
  201. package/dist/modules/communication_channels/migrations/Migration20260531120000_communication_channels.js.map +7 -0
  202. package/dist/modules/communication_channels/notifications.client.js +51 -0
  203. package/dist/modules/communication_channels/notifications.client.js.map +7 -0
  204. package/dist/modules/communication_channels/notifications.handlers.js +53 -0
  205. package/dist/modules/communication_channels/notifications.handlers.js.map +7 -0
  206. package/dist/modules/communication_channels/notifications.js +56 -0
  207. package/dist/modules/communication_channels/notifications.js.map +7 -0
  208. package/dist/modules/communication_channels/setup.js +105 -0
  209. package/dist/modules/communication_channels/setup.js.map +7 -0
  210. package/dist/modules/communication_channels/subscribers/channel-requires-reauth-notification.js +71 -0
  211. package/dist/modules/communication_channels/subscribers/channel-requires-reauth-notification.js.map +7 -0
  212. package/dist/modules/communication_channels/subscribers/outbound-bridge.js +103 -0
  213. package/dist/modules/communication_channels/subscribers/outbound-bridge.js.map +7 -0
  214. package/dist/modules/communication_channels/subscribers/user-deleted-cascade.js +51 -0
  215. package/dist/modules/communication_channels/subscribers/user-deleted-cascade.js.map +7 -0
  216. package/dist/modules/communication_channels/widgets/components.js +7 -0
  217. package/dist/modules/communication_channels/widgets/components.js.map +7 -0
  218. package/dist/modules/communication_channels/widgets/injection/channel-badge/widget.client.js +18 -0
  219. package/dist/modules/communication_channels/widgets/injection/channel-badge/widget.client.js.map +7 -0
  220. package/dist/modules/communication_channels/widgets/injection/channel-badge/widget.js +30 -0
  221. package/dist/modules/communication_channels/widgets/injection/channel-badge/widget.js.map +7 -0
  222. package/dist/modules/communication_channels/widgets/injection/channel-info-panel/widget.client.js +185 -0
  223. package/dist/modules/communication_channels/widgets/injection/channel-info-panel/widget.client.js.map +7 -0
  224. package/dist/modules/communication_channels/widgets/injection/channel-info-panel/widget.js +17 -0
  225. package/dist/modules/communication_channels/widgets/injection/channel-info-panel/widget.js.map +7 -0
  226. package/dist/modules/communication_channels/widgets/injection/channel-payload-renderer/widget.client.js +44 -0
  227. package/dist/modules/communication_channels/widgets/injection/channel-payload-renderer/widget.client.js.map +7 -0
  228. package/dist/modules/communication_channels/widgets/injection/channel-payload-renderer/widget.js +17 -0
  229. package/dist/modules/communication_channels/widgets/injection/channel-payload-renderer/widget.js.map +7 -0
  230. package/dist/modules/communication_channels/widgets/injection/profile-channels-menu/widget.js +23 -0
  231. package/dist/modules/communication_channels/widgets/injection/profile-channels-menu/widget.js.map +7 -0
  232. package/dist/modules/communication_channels/widgets/injection/reaction-bar/widget.client.js +141 -0
  233. package/dist/modules/communication_channels/widgets/injection/reaction-bar/widget.client.js.map +7 -0
  234. package/dist/modules/communication_channels/widgets/injection/reaction-bar/widget.js +17 -0
  235. package/dist/modules/communication_channels/widgets/injection/reaction-bar/widget.js.map +7 -0
  236. package/dist/modules/communication_channels/widgets/injection-table.js +38 -0
  237. package/dist/modules/communication_channels/widgets/injection-table.js.map +7 -0
  238. package/dist/modules/communication_channels/widgets/notifications/ChannelRequiresReauthRenderer.js +25 -0
  239. package/dist/modules/communication_channels/widgets/notifications/ChannelRequiresReauthRenderer.js.map +7 -0
  240. package/dist/modules/communication_channels/widgets/notifications/MessageReceivedRenderer.js +19 -0
  241. package/dist/modules/communication_channels/widgets/notifications/MessageReceivedRenderer.js.map +7 -0
  242. package/dist/modules/communication_channels/widgets/notifications/index.js +7 -0
  243. package/dist/modules/communication_channels/widgets/notifications/index.js.map +7 -0
  244. package/dist/modules/communication_channels/workers/channel-import-history.js +185 -0
  245. package/dist/modules/communication_channels/workers/channel-import-history.js.map +7 -0
  246. package/dist/modules/communication_channels/workers/gmail-history-sync.js +154 -0
  247. package/dist/modules/communication_channels/workers/gmail-history-sync.js.map +7 -0
  248. package/dist/modules/communication_channels/workers/gmail-renew-watch.js +95 -0
  249. package/dist/modules/communication_channels/workers/gmail-renew-watch.js.map +7 -0
  250. package/dist/modules/communication_channels/workers/inbound-processor.js +56 -0
  251. package/dist/modules/communication_channels/workers/inbound-processor.js.map +7 -0
  252. package/dist/modules/communication_channels/workers/outbound-delivery.js +85 -0
  253. package/dist/modules/communication_channels/workers/outbound-delivery.js.map +7 -0
  254. package/dist/modules/communication_channels/workers/poll-channel.js +240 -0
  255. package/dist/modules/communication_channels/workers/poll-channel.js.map +7 -0
  256. package/dist/modules/communication_channels/workers/poll-tick.js +132 -0
  257. package/dist/modules/communication_channels/workers/poll-tick.js.map +7 -0
  258. package/dist/modules/communication_channels/workers/reaction-processor.js +192 -0
  259. package/dist/modules/communication_channels/workers/reaction-processor.js.map +7 -0
  260. package/dist/modules/customers/acl.js +18 -0
  261. package/dist/modules/customers/acl.js.map +2 -2
  262. package/dist/modules/customers/api/activities/route.js +9 -0
  263. package/dist/modules/customers/api/activities/route.js.map +2 -2
  264. package/dist/modules/customers/api/companies/[id]/route.js +18 -7
  265. package/dist/modules/customers/api/companies/[id]/route.js.map +2 -2
  266. package/dist/modules/customers/api/interactions/[id]/visibility/route.js +151 -0
  267. package/dist/modules/customers/api/interactions/[id]/visibility/route.js.map +7 -0
  268. package/dist/modules/customers/api/interactions/counts/route.js +6 -0
  269. package/dist/modules/customers/api/interactions/counts/route.js.map +2 -2
  270. package/dist/modules/customers/api/interactions/route.js +26 -7
  271. package/dist/modules/customers/api/interactions/route.js.map +2 -2
  272. package/dist/modules/customers/api/people/[id]/email-threads/route.js +82 -0
  273. package/dist/modules/customers/api/people/[id]/email-threads/route.js.map +7 -0
  274. package/dist/modules/customers/api/people/[id]/emails/route.js +157 -0
  275. package/dist/modules/customers/api/people/[id]/emails/route.js.map +7 -0
  276. package/dist/modules/customers/api/people/[id]/route.js +12 -4
  277. package/dist/modules/customers/api/people/[id]/route.js.map +2 -2
  278. package/dist/modules/customers/backend/customers/people-v2/[id]/page.js +10 -0
  279. package/dist/modules/customers/backend/customers/people-v2/[id]/page.js.map +2 -2
  280. package/dist/modules/customers/commands/deals.js +46 -5
  281. package/dist/modules/customers/commands/deals.js.map +2 -2
  282. package/dist/modules/customers/commands/interactions.js +16 -0
  283. package/dist/modules/customers/commands/interactions.js.map +2 -2
  284. package/dist/modules/customers/components/detail/ActivityCard.js +32 -0
  285. package/dist/modules/customers/components/detail/ActivityCard.js.map +2 -2
  286. package/dist/modules/customers/components/detail/ComposeEmailDialog.js +242 -0
  287. package/dist/modules/customers/components/detail/ComposeEmailDialog.js.map +7 -0
  288. package/dist/modules/customers/components/detail/DealForm.js +2 -1
  289. package/dist/modules/customers/components/detail/DealForm.js.map +2 -2
  290. package/dist/modules/customers/components/detail/DealsSection.js +10 -0
  291. package/dist/modules/customers/components/detail/DealsSection.js.map +2 -2
  292. package/dist/modules/customers/components/detail/EmailCardActions.js +179 -0
  293. package/dist/modules/customers/components/detail/EmailCardActions.js.map +7 -0
  294. package/dist/modules/customers/components/detail/EmailReplyForwardActions.js +52 -0
  295. package/dist/modules/customers/components/detail/EmailReplyForwardActions.js.map +7 -0
  296. package/dist/modules/customers/components/detail/PersonDetailTabs.js +7 -1
  297. package/dist/modules/customers/components/detail/PersonDetailTabs.js.map +2 -2
  298. package/dist/modules/customers/components/detail/PersonEmailThreadsTab.js +366 -0
  299. package/dist/modules/customers/components/detail/PersonEmailThreadsTab.js.map +7 -0
  300. package/dist/modules/customers/data/enrichers.js +133 -2
  301. package/dist/modules/customers/data/enrichers.js.map +2 -2
  302. package/dist/modules/customers/data/entities.js +18 -0
  303. package/dist/modules/customers/data/entities.js.map +2 -2
  304. package/dist/modules/customers/data/extensions.js +16 -0
  305. package/dist/modules/customers/data/extensions.js.map +7 -0
  306. package/dist/modules/customers/encryption.js +11 -0
  307. package/dist/modules/customers/encryption.js.map +2 -2
  308. package/dist/modules/customers/events.js +4 -1
  309. package/dist/modules/customers/events.js.map +2 -2
  310. package/dist/modules/customers/lib/findPeopleByAddresses.js +64 -0
  311. package/dist/modules/customers/lib/findPeopleByAddresses.js.map +7 -0
  312. package/dist/modules/customers/lib/kysely.js.map +2 -2
  313. package/dist/modules/customers/lib/link-channel-message-handler.js +303 -0
  314. package/dist/modules/customers/lib/link-channel-message-handler.js.map +7 -0
  315. package/dist/modules/customers/lib/personEmailThreads.js +205 -0
  316. package/dist/modules/customers/lib/personEmailThreads.js.map +7 -0
  317. package/dist/modules/customers/lib/visibilityFilter.js +51 -0
  318. package/dist/modules/customers/lib/visibilityFilter.js.map +7 -0
  319. package/dist/modules/customers/migrations/Migration20260527012240_customers.js +20 -0
  320. package/dist/modules/customers/migrations/Migration20260527012240_customers.js.map +7 -0
  321. package/dist/modules/customers/setup.js +2 -1
  322. package/dist/modules/customers/setup.js.map +2 -2
  323. package/dist/modules/customers/subscribers/link-channel-message-received.js +12 -0
  324. package/dist/modules/customers/subscribers/link-channel-message-received.js.map +7 -0
  325. package/dist/modules/customers/subscribers/link-channel-message-sent.js +12 -0
  326. package/dist/modules/customers/subscribers/link-channel-message-sent.js.map +7 -0
  327. package/dist/modules/integrations/data/entities.js +8 -1
  328. package/dist/modules/integrations/data/entities.js.map +2 -2
  329. package/dist/modules/integrations/lib/credentials-service.js +29 -14
  330. package/dist/modules/integrations/lib/credentials-service.js.map +2 -2
  331. package/dist/modules/integrations/migrations/Migration20260526154136_integrations.js +15 -0
  332. package/dist/modules/integrations/migrations/Migration20260526154136_integrations.js.map +7 -0
  333. package/dist/modules/messages/commands/messages.js +70 -8
  334. package/dist/modules/messages/commands/messages.js.map +2 -2
  335. package/dist/modules/messages/components/ComposeMessagePageClient.js +24 -13
  336. package/dist/modules/messages/components/ComposeMessagePageClient.js.map +2 -2
  337. package/dist/modules/messages/components/MessageDetailPageClient.js +39 -2
  338. package/dist/modules/messages/components/MessageDetailPageClient.js.map +2 -2
  339. package/dist/modules/messages/components/MessagesInboxPageClient.js +1 -0
  340. package/dist/modules/messages/components/MessagesInboxPageClient.js.map +2 -2
  341. package/dist/modules/messages/data/entities.js +8 -1
  342. package/dist/modules/messages/data/entities.js.map +2 -2
  343. package/dist/modules/messages/migrations/Migration20260531130000.js +15 -0
  344. package/dist/modules/messages/migrations/Migration20260531130000.js.map +7 -0
  345. package/dist/modules/messages/widgets/injection-table.js +7 -0
  346. package/dist/modules/messages/widgets/injection-table.js.map +7 -0
  347. package/generated/entities/channel_ingest_dead_letter/index.ts +11 -0
  348. package/generated/entities/channel_thread_mapping/index.ts +11 -0
  349. package/generated/entities/channel_thread_token/index.ts +7 -0
  350. package/generated/entities/communication_channel/index.ts +20 -0
  351. package/generated/entities/customer_interaction/index.ts +2 -0
  352. package/generated/entities/external_conversation/index.ts +11 -0
  353. package/generated/entities/external_message/index.ts +11 -0
  354. package/generated/entities/integration_credentials/index.ts +1 -0
  355. package/generated/entities/message/index.ts +1 -0
  356. package/generated/entities/message_channel_link/index.ts +15 -0
  357. package/generated/entities/message_reaction/index.ts +11 -0
  358. package/generated/entities.ids.generated.ts +11 -0
  359. package/generated/entity-fields-registry.ts +117 -0
  360. package/package.json +9 -7
  361. package/src/helpers/integration/authFixtures.ts +4 -1
  362. package/src/helpers/integration/communicationChannelsFixtures.ts +124 -0
  363. package/src/modules/communication_channels/acl.ts +43 -0
  364. package/src/modules/communication_channels/api/delete/channels/[id]/route.ts +163 -0
  365. package/src/modules/communication_channels/api/delete/messages/[messageId]/reactions/[reactionId]/route.ts +143 -0
  366. package/src/modules/communication_channels/api/get/channels/[id]/health/route.ts +173 -0
  367. package/src/modules/communication_channels/api/get/channels/[id]/route.ts +111 -0
  368. package/src/modules/communication_channels/api/get/channels/route.ts +109 -0
  369. package/src/modules/communication_channels/api/get/me/channels/route.ts +100 -0
  370. package/src/modules/communication_channels/api/get/oauth/[provider]/callback/route.ts +355 -0
  371. package/src/modules/communication_channels/api/post/channels/[id]/import-history/route.ts +206 -0
  372. package/src/modules/communication_channels/api/post/channels/[id]/poll-now/route.ts +174 -0
  373. package/src/modules/communication_channels/api/post/channels/[id]/push/register/route.ts +158 -0
  374. package/src/modules/communication_channels/api/post/channels/[id]/set-primary/route.ts +114 -0
  375. package/src/modules/communication_channels/api/post/channels/[id]/test-send/route.ts +241 -0
  376. package/src/modules/communication_channels/api/post/channels/connect/credentials/route.ts +134 -0
  377. package/src/modules/communication_channels/api/post/messages/[messageId]/reactions/route.ts +143 -0
  378. package/src/modules/communication_channels/api/post/oauth/[provider]/initiate/route.ts +192 -0
  379. package/src/modules/communication_channels/api/post/send-as-user/route.ts +125 -0
  380. package/src/modules/communication_channels/api/post/test-seed/route.ts +267 -0
  381. package/src/modules/communication_channels/api/post/webhook/[provider]/route.ts +227 -0
  382. package/src/modules/communication_channels/api/post/webhooks/gmail/route.ts +161 -0
  383. package/src/modules/communication_channels/api/put/threads/[threadId]/assign/route.ts +132 -0
  384. package/src/modules/communication_channels/backend/communication_channels/channels/[id]/page.meta.ts +34 -0
  385. package/src/modules/communication_channels/backend/communication_channels/channels/[id]/page.tsx +250 -0
  386. package/src/modules/communication_channels/backend/communication_channels/channels/page.meta.ts +36 -0
  387. package/src/modules/communication_channels/backend/communication_channels/channels/page.tsx +137 -0
  388. package/src/modules/communication_channels/backend/profile/communication-channels/page.meta.ts +36 -0
  389. package/src/modules/communication_channels/backend/profile/communication-channels/page.tsx +907 -0
  390. package/src/modules/communication_channels/commands/connect-credential-channel.ts +243 -0
  391. package/src/modules/communication_channels/commands/delete-channel.ts +193 -0
  392. package/src/modules/communication_channels/commands/deliver-outbound-message.ts +579 -0
  393. package/src/modules/communication_channels/commands/disconnect-channel.ts +241 -0
  394. package/src/modules/communication_channels/commands/ingest-inbound-message.ts +602 -0
  395. package/src/modules/communication_channels/commands/interceptors.ts +104 -0
  396. package/src/modules/communication_channels/commands/process-inbound-reaction.ts +265 -0
  397. package/src/modules/communication_channels/commands/push-register.ts +203 -0
  398. package/src/modules/communication_channels/commands/push-renew.ts +49 -0
  399. package/src/modules/communication_channels/commands/push-unregister.ts +168 -0
  400. package/src/modules/communication_channels/commands/queue-import-history.ts +180 -0
  401. package/src/modules/communication_channels/commands/reassign-conversation.ts +273 -0
  402. package/src/modules/communication_channels/commands/set-primary-channel.ts +154 -0
  403. package/src/modules/communication_channels/commands/toggle-outbound-reaction.ts +347 -0
  404. package/src/modules/communication_channels/data/enrichers.ts +413 -0
  405. package/src/modules/communication_channels/data/entities.ts +546 -0
  406. package/src/modules/communication_channels/data/extensions.ts +76 -0
  407. package/src/modules/communication_channels/data/validators.ts +138 -0
  408. package/src/modules/communication_channels/di.ts +40 -0
  409. package/src/modules/communication_channels/encryption.ts +44 -0
  410. package/src/modules/communication_channels/events.ts +122 -0
  411. package/src/modules/communication_channels/i18n/de.json +138 -0
  412. package/src/modules/communication_channels/i18n/en.json +138 -0
  413. package/src/modules/communication_channels/i18n/es.json +138 -0
  414. package/src/modules/communication_channels/i18n/pl.json +138 -0
  415. package/src/modules/communication_channels/index.ts +19 -0
  416. package/src/modules/communication_channels/lib/access-control.ts +110 -0
  417. package/src/modules/communication_channels/lib/adapter-compat.ts +57 -0
  418. package/src/modules/communication_channels/lib/adapter-registry-singleton.ts +35 -0
  419. package/src/modules/communication_channels/lib/adapter.ts +605 -0
  420. package/src/modules/communication_channels/lib/connect-channel.ts +163 -0
  421. package/src/modules/communication_channels/lib/contact-resolver.ts +162 -0
  422. package/src/modules/communication_channels/lib/credential-refresh.ts +197 -0
  423. package/src/modules/communication_channels/lib/dead-letter.ts +87 -0
  424. package/src/modules/communication_channels/lib/email-capabilities.ts +60 -0
  425. package/src/modules/communication_channels/lib/email-contact.ts +17 -0
  426. package/src/modules/communication_channels/lib/email-mime.ts +425 -0
  427. package/src/modules/communication_channels/lib/error-classification.ts +144 -0
  428. package/src/modules/communication_channels/lib/gmail-pubsub-jwt.ts +278 -0
  429. package/src/modules/communication_channels/lib/mutation-guards.ts +215 -0
  430. package/src/modules/communication_channels/lib/oauth-client-config.ts +79 -0
  431. package/src/modules/communication_channels/lib/oauth-state.ts +228 -0
  432. package/src/modules/communication_channels/lib/oauth-token.ts +81 -0
  433. package/src/modules/communication_channels/lib/pg-errors.ts +12 -0
  434. package/src/modules/communication_channels/lib/provider-health.ts +47 -0
  435. package/src/modules/communication_channels/lib/push-state.ts +38 -0
  436. package/src/modules/communication_channels/lib/queue.ts +66 -0
  437. package/src/modules/communication_channels/lib/reaction-processor-types.ts +51 -0
  438. package/src/modules/communication_channels/lib/reaction-semantics.ts +48 -0
  439. package/src/modules/communication_channels/lib/registry.ts +99 -0
  440. package/src/modules/communication_channels/lib/route-mutation-guard.ts +68 -0
  441. package/src/modules/communication_channels/lib/sanitize-channel-html.ts +129 -0
  442. package/src/modules/communication_channels/lib/send-as-user.ts +284 -0
  443. package/src/modules/communication_channels/lib/system-user.ts +74 -0
  444. package/src/modules/communication_channels/lib/test-seed.ts +140 -0
  445. package/src/modules/communication_channels/lib/thread-matcher.ts +430 -0
  446. package/src/modules/communication_channels/lib/thread-token.ts +355 -0
  447. package/src/modules/communication_channels/lib/use-connect-channel.ts +73 -0
  448. package/src/modules/communication_channels/migrations/.snapshot-open-mercato.json +2142 -0
  449. package/src/modules/communication_channels/migrations/Migration20260526134719_communication_channels.ts +55 -0
  450. package/src/modules/communication_channels/migrations/Migration20260527195446_communication_channels.ts +20 -0
  451. package/src/modules/communication_channels/migrations/Migration20260529231848_communication_channels.ts +13 -0
  452. package/src/modules/communication_channels/migrations/Migration20260531120000_communication_channels.ts +24 -0
  453. package/src/modules/communication_channels/notifications.client.ts +50 -0
  454. package/src/modules/communication_channels/notifications.handlers.ts +86 -0
  455. package/src/modules/communication_channels/notifications.ts +52 -0
  456. package/src/modules/communication_channels/setup.ts +158 -0
  457. package/src/modules/communication_channels/subscribers/channel-requires-reauth-notification.ts +118 -0
  458. package/src/modules/communication_channels/subscribers/outbound-bridge.ts +175 -0
  459. package/src/modules/communication_channels/subscribers/user-deleted-cascade.ts +100 -0
  460. package/src/modules/communication_channels/widgets/components.ts +36 -0
  461. package/src/modules/communication_channels/widgets/injection/channel-badge/widget.client.tsx +38 -0
  462. package/src/modules/communication_channels/widgets/injection/channel-badge/widget.ts +51 -0
  463. package/src/modules/communication_channels/widgets/injection/channel-info-panel/widget.client.tsx +278 -0
  464. package/src/modules/communication_channels/widgets/injection/channel-info-panel/widget.ts +24 -0
  465. package/src/modules/communication_channels/widgets/injection/channel-payload-renderer/widget.client.tsx +63 -0
  466. package/src/modules/communication_channels/widgets/injection/channel-payload-renderer/widget.ts +29 -0
  467. package/src/modules/communication_channels/widgets/injection/profile-channels-menu/widget.ts +34 -0
  468. package/src/modules/communication_channels/widgets/injection/reaction-bar/widget.client.tsx +177 -0
  469. package/src/modules/communication_channels/widgets/injection/reaction-bar/widget.ts +26 -0
  470. package/src/modules/communication_channels/widgets/injection-table.ts +47 -0
  471. package/src/modules/communication_channels/widgets/notifications/ChannelRequiresReauthRenderer.tsx +48 -0
  472. package/src/modules/communication_channels/widgets/notifications/MessageReceivedRenderer.tsx +45 -0
  473. package/src/modules/communication_channels/widgets/notifications/index.ts +2 -0
  474. package/src/modules/communication_channels/workers/channel-import-history.ts +252 -0
  475. package/src/modules/communication_channels/workers/gmail-history-sync.ts +223 -0
  476. package/src/modules/communication_channels/workers/gmail-renew-watch.ts +141 -0
  477. package/src/modules/communication_channels/workers/inbound-processor.ts +114 -0
  478. package/src/modules/communication_channels/workers/outbound-delivery.ts +155 -0
  479. package/src/modules/communication_channels/workers/poll-channel.ts +391 -0
  480. package/src/modules/communication_channels/workers/poll-tick.ts +210 -0
  481. package/src/modules/communication_channels/workers/reaction-processor.ts +264 -0
  482. package/src/modules/customers/acl.ts +18 -0
  483. package/src/modules/customers/api/activities/route.ts +13 -0
  484. package/src/modules/customers/api/companies/[id]/route.ts +21 -1
  485. package/src/modules/customers/api/interactions/[id]/visibility/route.ts +179 -0
  486. package/src/modules/customers/api/interactions/counts/route.ts +10 -0
  487. package/src/modules/customers/api/interactions/route.ts +51 -5
  488. package/src/modules/customers/api/people/[id]/email-threads/route.ts +92 -0
  489. package/src/modules/customers/api/people/[id]/emails/route.ts +184 -0
  490. package/src/modules/customers/api/people/[id]/route.ts +17 -2
  491. package/src/modules/customers/backend/customers/people-v2/[id]/page.tsx +11 -1
  492. package/src/modules/customers/commands/deals.ts +65 -6
  493. package/src/modules/customers/commands/interactions.ts +30 -0
  494. package/src/modules/customers/components/detail/ActivityCard.tsx +48 -0
  495. package/src/modules/customers/components/detail/ComposeEmailDialog.tsx +329 -0
  496. package/src/modules/customers/components/detail/DealForm.tsx +2 -1
  497. package/src/modules/customers/components/detail/DealsSection.tsx +26 -0
  498. package/src/modules/customers/components/detail/EmailCardActions.tsx +258 -0
  499. package/src/modules/customers/components/detail/EmailReplyForwardActions.tsx +53 -0
  500. package/src/modules/customers/components/detail/PersonDetailTabs.tsx +8 -1
  501. package/src/modules/customers/components/detail/PersonEmailThreadsTab.tsx +448 -0
  502. package/src/modules/customers/data/enrichers.ts +252 -1
  503. package/src/modules/customers/data/entities.ts +46 -1
  504. package/src/modules/customers/data/extensions.ts +26 -0
  505. package/src/modules/customers/encryption.ts +11 -0
  506. package/src/modules/customers/events.ts +4 -0
  507. package/src/modules/customers/i18n/de.json +41 -0
  508. package/src/modules/customers/i18n/en.json +41 -0
  509. package/src/modules/customers/i18n/es.json +41 -0
  510. package/src/modules/customers/i18n/pl.json +41 -0
  511. package/src/modules/customers/lib/findPeopleByAddresses.ts +107 -0
  512. package/src/modules/customers/lib/kysely.ts +16 -0
  513. package/src/modules/customers/lib/link-channel-message-handler.ts +571 -0
  514. package/src/modules/customers/lib/personEmailThreads.ts +325 -0
  515. package/src/modules/customers/lib/visibilityFilter.ts +152 -0
  516. package/src/modules/customers/migrations/.snapshot-open-mercato.json +61 -0
  517. package/src/modules/customers/migrations/Migration20260527012240_customers.ts +23 -0
  518. package/src/modules/customers/setup.ts +1 -0
  519. package/src/modules/customers/subscribers/link-channel-message-received.ts +21 -0
  520. package/src/modules/customers/subscribers/link-channel-message-sent.ts +21 -0
  521. package/src/modules/integrations/AGENTS.md +9 -0
  522. package/src/modules/integrations/data/entities.ts +21 -1
  523. package/src/modules/integrations/lib/credentials-service.ts +49 -13
  524. package/src/modules/integrations/migrations/.snapshot-open-mercato.json +26 -1
  525. package/src/modules/integrations/migrations/Migration20260526154136_integrations.ts +15 -0
  526. package/src/modules/messages/commands/messages.ts +101 -8
  527. package/src/modules/messages/components/ComposeMessagePageClient.tsx +17 -0
  528. package/src/modules/messages/components/MessageDetailPageClient.tsx +43 -0
  529. package/src/modules/messages/components/MessagesInboxPageClient.tsx +4 -0
  530. package/src/modules/messages/data/entities.ts +11 -0
  531. package/src/modules/messages/migrations/.snapshot-open-mercato.json +18 -0
  532. package/src/modules/messages/migrations/Migration20260531130000.ts +15 -0
  533. package/src/modules/messages/widgets/injection-table.ts +29 -0
@@ -0,0 +1,15 @@
1
+ export const id = "id";
2
+ export const message_id = "message_id";
3
+ export const external_conversation_id = "external_conversation_id";
4
+ export const external_message_id = "external_message_id";
5
+ export const provider_key = "provider_key";
6
+ export const channel_type = "channel_type";
7
+ export const direction = "direction";
8
+ export const delivery_status = "delivery_status";
9
+ export const channel_payload = "channel_payload";
10
+ export const channel_content_type = "channel_content_type";
11
+ export const interactive_state = "interactive_state";
12
+ export const channel_metadata = "channel_metadata";
13
+ export const tenant_id = "tenant_id";
14
+ export const organization_id = "organization_id";
15
+ export const created_at = "created_at";
@@ -0,0 +1,11 @@
1
+ export const id = "id";
2
+ export const message_id = "message_id";
3
+ export const emoji = "emoji";
4
+ export const reacted_by_user_id = "reacted_by_user_id";
5
+ export const reacted_by_external_id = "reacted_by_external_id";
6
+ export const reacted_by_display_name = "reacted_by_display_name";
7
+ export const provider_key = "provider_key";
8
+ export const external_reaction_id = "external_reaction_id";
9
+ export const tenant_id = "tenant_id";
10
+ export const organization_id = "organization_id";
11
+ export const created_at = "created_at";
@@ -28,6 +28,7 @@ export const M = {
28
28
  "data_sync": "data_sync",
29
29
  "sync_excel": "sync_excel",
30
30
  "messages": "messages",
31
+ "communication_channels": "communication_channels",
31
32
  "translations": "translations",
32
33
  "inbox_ops": "inbox_ops",
33
34
  "payment_gateways": "payment_gateways",
@@ -243,6 +244,16 @@ export const M = {
243
244
  "message_access_token": "messages:message_access_token",
244
245
  "message_confirmation": "messages:message_confirmation"
245
246
  },
247
+ "communication_channels": {
248
+ "communication_channel": "communication_channels:communication_channel",
249
+ "external_conversation": "communication_channels:external_conversation",
250
+ "external_message": "communication_channels:external_message",
251
+ "message_channel_link": "communication_channels:message_channel_link",
252
+ "channel_thread_mapping": "communication_channels:channel_thread_mapping",
253
+ "message_reaction": "communication_channels:message_reaction",
254
+ "channel_thread_token": "communication_channels:channel_thread_token",
255
+ "channel_ingest_dead_letter": "communication_channels:channel_ingest_dead_letter"
256
+ },
246
257
  "translations": {
247
258
  "entity_translation": "translations:entity_translation"
248
259
  },
@@ -366,6 +366,63 @@ export const entityFieldsRegistry: Record<string, Record<string, string>> = {
366
366
  "created_at": "created_at",
367
367
  "updated_at": "updated_at"
368
368
  },
369
+ "channel_ingest_dead_letter": {
370
+ "id": "id",
371
+ "tenant_id": "tenant_id",
372
+ "organization_id": "organization_id",
373
+ "channel_id": "channel_id",
374
+ "provider_key": "provider_key",
375
+ "external_uid": "external_uid",
376
+ "external_message_id": "external_message_id",
377
+ "error_class": "error_class",
378
+ "error_message": "error_message",
379
+ "raw_body": "raw_body",
380
+ "created_at": "created_at"
381
+ },
382
+ "channel_thread_mapping": {
383
+ "id": "id",
384
+ "external_conversation_id": "external_conversation_id",
385
+ "message_thread_id": "message_thread_id",
386
+ "channel_id": "channel_id",
387
+ "provider_key": "provider_key",
388
+ "external_thread_ref": "external_thread_ref",
389
+ "assigned_user_id": "assigned_user_id",
390
+ "tenant_id": "tenant_id",
391
+ "organization_id": "organization_id",
392
+ "created_at": "created_at",
393
+ "updated_at": "updated_at"
394
+ },
395
+ "channel_thread_token": {
396
+ "id": "id",
397
+ "tenant_id": "tenant_id",
398
+ "organization_id": "organization_id",
399
+ "message_thread_id": "message_thread_id",
400
+ "token": "token",
401
+ "created_at": "created_at",
402
+ "last_seen_at": "last_seen_at"
403
+ },
404
+ "communication_channel": {
405
+ "id": "id",
406
+ "provider_key": "provider_key",
407
+ "channel_type": "channel_type",
408
+ "display_name": "display_name",
409
+ "external_identifier": "external_identifier",
410
+ "credentials_ref": "credentials_ref",
411
+ "capabilities": "capabilities",
412
+ "is_active": "is_active",
413
+ "user_id": "user_id",
414
+ "is_primary": "is_primary",
415
+ "poll_interval_seconds": "poll_interval_seconds",
416
+ "last_polled_at": "last_polled_at",
417
+ "status": "status",
418
+ "last_error": "last_error",
419
+ "channel_state": "channel_state",
420
+ "tenant_id": "tenant_id",
421
+ "organization_id": "organization_id",
422
+ "created_at": "created_at",
423
+ "updated_at": "updated_at",
424
+ "deleted_at": "deleted_at"
425
+ },
369
426
  "currency": {
370
427
  "id": "id",
371
428
  "organization_id": "organization_id",
@@ -679,6 +736,8 @@ export const entityFieldsRegistry: Record<string, Record<string, string>> = {
679
736
  "interaction_type": "interaction_type",
680
737
  "title": "title",
681
738
  "body": "body",
739
+ "external_message_id": "external_message_id",
740
+ "channel_provider_key": "channel_provider_key",
682
741
  "status": "status",
683
742
  "scheduled_at": "scheduled_at",
684
743
  "occurred_at": "occurred_at",
@@ -1079,6 +1138,32 @@ export const entityFieldsRegistry: Record<string, Record<string, string>> = {
1079
1138
  "updated_at": "updated_at",
1080
1139
  "deleted_at": "deleted_at"
1081
1140
  },
1141
+ "external_conversation": {
1142
+ "id": "id",
1143
+ "channel_id": "channel_id",
1144
+ "external_conversation_id": "external_conversation_id",
1145
+ "subject": "subject",
1146
+ "contact_person_id": "contact_person_id",
1147
+ "assigned_user_id": "assigned_user_id",
1148
+ "last_message_at": "last_message_at",
1149
+ "tenant_id": "tenant_id",
1150
+ "organization_id": "organization_id",
1151
+ "created_at": "created_at",
1152
+ "updated_at": "updated_at"
1153
+ },
1154
+ "external_message": {
1155
+ "id": "id",
1156
+ "channel_id": "channel_id",
1157
+ "conversation_id": "conversation_id",
1158
+ "external_message_id": "external_message_id",
1159
+ "direction": "direction",
1160
+ "sender_identifier": "sender_identifier",
1161
+ "sender_display_name": "sender_display_name",
1162
+ "provider_timestamp": "provider_timestamp",
1163
+ "tenant_id": "tenant_id",
1164
+ "organization_id": "organization_id",
1165
+ "created_at": "created_at"
1166
+ },
1082
1167
  "feature_toggle": {
1083
1168
  "id": "id",
1084
1169
  "identifier": "identifier",
@@ -1260,6 +1345,7 @@ export const entityFieldsRegistry: Record<string, Record<string, string>> = {
1260
1345
  "credentials": "credentials",
1261
1346
  "organization_id": "organization_id",
1262
1347
  "tenant_id": "tenant_id",
1348
+ "user_id": "user_id",
1263
1349
  "created_at": "created_at",
1264
1350
  "updated_at": "updated_at",
1265
1351
  "deleted_at": "deleted_at"
@@ -1323,6 +1409,7 @@ export const entityFieldsRegistry: Record<string, Record<string, string>> = {
1323
1409
  "source_entity_id": "source_entity_id",
1324
1410
  "external_email": "external_email",
1325
1411
  "external_email_hash": "external_email_hash",
1412
+ "idempotency_key": "idempotency_key",
1326
1413
  "external_name": "external_name",
1327
1414
  "external_email_sent_at": "external_email_sent_at",
1328
1415
  "external_email_failed_at": "external_email_failed_at",
@@ -1338,6 +1425,23 @@ export const entityFieldsRegistry: Record<string, Record<string, string>> = {
1338
1425
  "use_count": "use_count",
1339
1426
  "created_at": "created_at"
1340
1427
  },
1428
+ "message_channel_link": {
1429
+ "id": "id",
1430
+ "message_id": "message_id",
1431
+ "external_conversation_id": "external_conversation_id",
1432
+ "external_message_id": "external_message_id",
1433
+ "provider_key": "provider_key",
1434
+ "channel_type": "channel_type",
1435
+ "direction": "direction",
1436
+ "delivery_status": "delivery_status",
1437
+ "channel_payload": "channel_payload",
1438
+ "channel_content_type": "channel_content_type",
1439
+ "interactive_state": "interactive_state",
1440
+ "channel_metadata": "channel_metadata",
1441
+ "tenant_id": "tenant_id",
1442
+ "organization_id": "organization_id",
1443
+ "created_at": "created_at"
1444
+ },
1341
1445
  "message_confirmation": {
1342
1446
  "id": "id",
1343
1447
  "message_id": "message_id",
@@ -1361,6 +1465,19 @@ export const entityFieldsRegistry: Record<string, Record<string, string>> = {
1361
1465
  "entity_snapshot": "entity_snapshot",
1362
1466
  "created_at": "created_at"
1363
1467
  },
1468
+ "message_reaction": {
1469
+ "id": "id",
1470
+ "message_id": "message_id",
1471
+ "emoji": "emoji",
1472
+ "reacted_by_user_id": "reacted_by_user_id",
1473
+ "reacted_by_external_id": "reacted_by_external_id",
1474
+ "reacted_by_display_name": "reacted_by_display_name",
1475
+ "provider_key": "provider_key",
1476
+ "external_reaction_id": "external_reaction_id",
1477
+ "tenant_id": "tenant_id",
1478
+ "organization_id": "organization_id",
1479
+ "created_at": "created_at"
1480
+ },
1364
1481
  "message_recipient": {
1365
1482
  "id": "id",
1366
1483
  "message_id": "message_id",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@open-mercato/core",
3
- "version": "0.6.5-develop.4384.1.ce2ec6eaaa",
3
+ "version": "0.6.5-develop.4393.1.de282b5dfd",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "scripts": {
@@ -237,22 +237,23 @@
237
237
  "html-to-text": "^10.0.0",
238
238
  "mammoth": "^1.9.0",
239
239
  "pdfjs-dist": "^6.0.227",
240
+ "sanitize-html": "^2.13.0",
240
241
  "semver": "^7.8.1",
241
242
  "svix": "^1.95.1",
242
243
  "ts-pattern": "^5.0.0",
243
244
  "zod": "^4.4.3"
244
245
  },
245
246
  "peerDependencies": {
246
- "@open-mercato/ai-assistant": "0.6.5-develop.4384.1.ce2ec6eaaa",
247
- "@open-mercato/shared": "0.6.5-develop.4384.1.ce2ec6eaaa",
248
- "@open-mercato/ui": "0.6.5-develop.4384.1.ce2ec6eaaa",
247
+ "@open-mercato/ai-assistant": "0.6.5-develop.4393.1.de282b5dfd",
248
+ "@open-mercato/shared": "0.6.5-develop.4393.1.de282b5dfd",
249
+ "@open-mercato/ui": "0.6.5-develop.4393.1.de282b5dfd",
249
250
  "react": "^19.0.0",
250
251
  "react-dom": "^19.0.0"
251
252
  },
252
253
  "devDependencies": {
253
- "@open-mercato/ai-assistant": "0.6.5-develop.4384.1.ce2ec6eaaa",
254
- "@open-mercato/shared": "0.6.5-develop.4384.1.ce2ec6eaaa",
255
- "@open-mercato/ui": "0.6.5-develop.4384.1.ce2ec6eaaa",
254
+ "@open-mercato/ai-assistant": "0.6.5-develop.4393.1.de282b5dfd",
255
+ "@open-mercato/shared": "0.6.5-develop.4393.1.de282b5dfd",
256
+ "@open-mercato/ui": "0.6.5-develop.4393.1.de282b5dfd",
256
257
  "@testing-library/dom": "^10.4.1",
257
258
  "@testing-library/jest-dom": "^6.9.1",
258
259
  "@testing-library/react": "^16.3.1",
@@ -261,6 +262,7 @@
261
262
  "@types/jest": "^30.0.0",
262
263
  "@types/react": "^19.2.16",
263
264
  "@types/react-dom": "^19.2.3",
265
+ "@types/sanitize-html": "^2.13.0",
264
266
  "@types/semver": "^7.5.8",
265
267
  "chance": "^1.1.13",
266
268
  "jest": "^30.4.2",
@@ -1,7 +1,10 @@
1
1
  import { expect, type APIRequestContext } from '@playwright/test';
2
- import { apiRequest } from './api';
2
+ import { apiRequest, getAuthToken } from './api';
3
3
  import { expectId, readJsonSafe } from './generalFixtures';
4
4
 
5
+ // Re-exported so tests can import auth helpers from a single fixtures module.
6
+ export { getAuthToken };
7
+
5
8
  const BASE_URL = process.env.BASE_URL?.trim() || null;
6
9
 
7
10
  function resolveUrl(path: string): string {
@@ -0,0 +1,124 @@
1
+ import { expect, type APIRequestContext } from '@playwright/test';
2
+ import { apiRequest } from './api';
3
+ import { expectId, readJsonSafe } from './generalFixtures';
4
+
5
+ /**
6
+ * Communication-channels integration fixtures.
7
+ *
8
+ * These drive the TEST-ONLY seed endpoint `POST /api/communication_channels/test-seed`,
9
+ * which is gated by `OM_ENABLE_TEST_CHANNEL_SEEDING` (inert/404 in production). Use
10
+ * {@link isChannelSeedingAvailable} to skip tests when the gate is off rather than
11
+ * failing them.
12
+ */
13
+
14
+ export type SeedAddressField =
15
+ | string
16
+ | { address: string; name?: string }
17
+ | Array<string | { address: string; name?: string }>;
18
+
19
+ const TEST_SEED_PATH = '/api/communication_channels/test-seed';
20
+
21
+ /**
22
+ * Probe whether the env-gated test-seed endpoint is enabled in the target app.
23
+ * Returns false when the route answers 404 (flag off) so callers can `test.skip`.
24
+ * The caller's token must hold `communication_channels.connect_user_channel`.
25
+ */
26
+ export async function isChannelSeedingAvailable(
27
+ request: APIRequestContext,
28
+ token: string,
29
+ ): Promise<boolean> {
30
+ // A malformed body returns 422 when the gate is ON and 404 when it is OFF.
31
+ const response = await apiRequest(request, 'POST', TEST_SEED_PATH, {
32
+ token,
33
+ data: { action: '__probe__' },
34
+ });
35
+ return response.status() !== 404;
36
+ }
37
+
38
+ /**
39
+ * Seed a connected, network-free `__test_seed__` channel owned by the caller.
40
+ * Returns the new channel id. Tear down with {@link deleteChannelIfExists}.
41
+ */
42
+ export async function seedConnectedChannel(
43
+ request: APIRequestContext,
44
+ token: string,
45
+ input: { displayName?: string; externalIdentifier?: string } = {},
46
+ ): Promise<string> {
47
+ const response = await apiRequest(request, 'POST', TEST_SEED_PATH, {
48
+ token,
49
+ data: { action: 'connect-channel', ...input },
50
+ });
51
+ expect(
52
+ response.status(),
53
+ 'POST /api/communication_channels/test-seed (connect-channel) should return 201',
54
+ ).toBe(201);
55
+ const body = await readJsonSafe<{ channelId?: string }>(response);
56
+ return expectId(body?.channelId, 'connect-channel response should include channelId');
57
+ }
58
+
59
+ /**
60
+ * Seed an inbound `MessageChannelLink` for `channelId` and emit
61
+ * `communication_channels.message.received` through the real event bus. The
62
+ * persistent customers link-channel-message-received subscriber is enqueued to
63
+ * the `events` queue — drain it with `drainIntegrationQueue('events')`.
64
+ *
65
+ * Returns the created link + message ids (the message id is the platform
66
+ * `messages.message` id, usable as `messageThreadId` to thread a follow-up).
67
+ */
68
+ export async function seedInboundMessage(
69
+ request: APIRequestContext,
70
+ token: string,
71
+ input: {
72
+ channelId: string;
73
+ from?: SeedAddressField;
74
+ to?: SeedAddressField;
75
+ cc?: SeedAddressField;
76
+ subject?: string;
77
+ bodyText?: string;
78
+ messageId?: string;
79
+ inReplyTo?: string;
80
+ references?: string[];
81
+ messageThreadId?: string;
82
+ providerKey?: string;
83
+ },
84
+ ): Promise<{ channelLinkId: string; messageId: string; conversationId: string }> {
85
+ const response = await apiRequest(request, 'POST', TEST_SEED_PATH, {
86
+ token,
87
+ data: { action: 'emit-inbound', ...input },
88
+ });
89
+ expect(
90
+ response.status(),
91
+ 'POST /api/communication_channels/test-seed (emit-inbound) should return 201',
92
+ ).toBe(201);
93
+ const body = await readJsonSafe<{
94
+ channelLinkId?: string;
95
+ messageId?: string;
96
+ conversationId?: string;
97
+ }>(response);
98
+ return {
99
+ channelLinkId: expectId(body?.channelLinkId, 'emit-inbound response should include channelLinkId'),
100
+ messageId: expectId(body?.messageId, 'emit-inbound response should include messageId'),
101
+ conversationId: expectId(
102
+ body?.conversationId,
103
+ 'emit-inbound response should include conversationId',
104
+ ),
105
+ };
106
+ }
107
+
108
+ /**
109
+ * Best-effort delete of a seeded channel via the owner-scoped DELETE route.
110
+ * Safe to call with a null id in `finally`.
111
+ */
112
+ export async function deleteChannelIfExists(
113
+ request: APIRequestContext,
114
+ token: string | null,
115
+ channelId: string | null,
116
+ ): Promise<void> {
117
+ if (!token || !channelId) return;
118
+ await apiRequest(
119
+ request,
120
+ 'DELETE',
121
+ `/api/communication_channels/channels/${encodeURIComponent(channelId)}`,
122
+ { token },
123
+ ).catch(() => undefined);
124
+ }
@@ -0,0 +1,43 @@
1
+ export const features = [
2
+ { id: 'communication_channels.view', title: 'View communication channels', module: 'communication_channels' },
3
+ { id: 'communication_channels.manage', title: 'Manage communication channels', module: 'communication_channels' },
4
+ { id: 'communication_channels.react', title: 'React to channel messages', module: 'communication_channels' },
5
+ { id: 'communication_channels.assign', title: 'Assign channel conversations', module: 'communication_channels' },
6
+ /**
7
+ * Per-user channel ownership (added by the email integration spec).
8
+ *
9
+ * Gates the "Connect my mailbox" flow on the per-user profile page. Split from
10
+ * `communication_channels.manage` so policy can disable new linking while
11
+ * preserving existing accounts (e.g. during a security incident response).
12
+ * Default-granted to all roles in `setup.ts`.
13
+ */
14
+ { id: 'communication_channels.connect_user_channel', title: 'Connect own communication channel', module: 'communication_channels' },
15
+ /**
16
+ * Reserved for a future v2 team-oversight capability. NOT consulted in v1:
17
+ * personal mailboxes (`CommunicationChannel.user_id` set) follow the strict
18
+ * owner-only privacy model, so this feature grants NO cross-user channel view.
19
+ * The admin channels list (`GET /api/communication_channels/channels`) returns
20
+ * `user_id IS NULL` rows only; personal mailboxes surface exclusively on the
21
+ * owner's profile page and are never exposed to admins/superadmins in v1.
22
+ * Granted to `superadmin` + `admin` only so the inert grant is in place ahead
23
+ * of the audited v2 oversight feature that will re-activate it.
24
+ */
25
+ { id: 'communication_channels.admin', title: 'Administer all communication channels (tenant-wide)', module: 'communication_channels' },
26
+ /**
27
+ * Trigger the "Import history" job for a channel — fetch older messages
28
+ * the channel never saw at bootstrap (Spec B § Phase B6). Separate from
29
+ * `manage` so policy can gate bulk historical imports during quiet hours
30
+ * or cost-controlled rollouts while leaving normal channel CRUD open.
31
+ */
32
+ { id: 'communication_channels.channel.import_history', title: 'Import channel history', module: 'communication_channels' },
33
+ /**
34
+ * Manage provider push delivery (Spec C — Gmail Pub/Sub push
35
+ * subscriptions). Gates the "Re-register push" operator button and any
36
+ * future push-status manipulation. Granted to admin + superadmin only —
37
+ * regular users don't need to think about whether mail arrives via
38
+ * push or polling, the system handles it.
39
+ */
40
+ { id: 'communication_channels.channel.push.manage', title: 'Manage push delivery', module: 'communication_channels' },
41
+ ] as const
42
+
43
+ export default features
@@ -0,0 +1,163 @@
1
+ import { NextResponse } from 'next/server'
2
+ import { z } from 'zod'
3
+ import { getAuthFromRequest } from '@open-mercato/shared/lib/auth/server'
4
+ import { createRequestContainer } from '@open-mercato/shared/lib/di/container'
5
+ import type { CommandBus } from '@open-mercato/shared/lib/commands'
6
+ import type { EntityManager } from '@mikro-orm/postgresql'
7
+ import { findOneWithDecryption } from '@open-mercato/shared/lib/encryption/find'
8
+ import { CommunicationChannel } from '../../../../data/entities'
9
+ import { ChannelAccessDeniedError, assertCanManageChannel } from '../../../../lib/access-control'
10
+ import {
11
+ COMMUNICATION_CHANNELS_DELETE_CHANNEL_COMMAND_ID,
12
+ type DeleteChannelInput,
13
+ type DeleteChannelResult,
14
+ } from '../../../../commands/delete-channel'
15
+ import { validateRouteMutationGuard } from '../../../../lib/route-mutation-guard'
16
+
17
+ type RbacServiceLike = {
18
+ loadAcl: (
19
+ userId: string,
20
+ scope: { tenantId: string | null; organizationId: string | null },
21
+ ) => Promise<{ isSuperAdmin: boolean; features: string[]; organizations: string[] | null }>
22
+ }
23
+
24
+ /**
25
+ * Soft-delete (remove) a communication channel.
26
+ *
27
+ * Per-user access guard: only the channel owner — or an admin holding
28
+ * `communication_channels.admin` — may delete a channel. Non-owners get a 404
29
+ * (existence masking), consistent with the other channel routes. The declarative
30
+ * `communication_channels.manage` feature gates the route itself; deletion is a
31
+ * management operation alongside disconnect/set-primary.
32
+ */
33
+ export const metadata = {
34
+ path: '/communication_channels/channels/[id]',
35
+ DELETE: {
36
+ // Owner self-service: a user may disconnect their OWN personal mailbox
37
+ // (gated by `connect_user_channel`). Deleting a shared/tenant-wide channel
38
+ // still requires `manage` — enforced per channel type by
39
+ // `assertCanManageChannel` in the handler.
40
+ requireAuth: true,
41
+ requireFeatures: ['communication_channels.connect_user_channel'],
42
+ },
43
+ }
44
+
45
+ type RouteContext = {
46
+ params: Promise<{ id: string }> | { id: string }
47
+ }
48
+
49
+ export async function DELETE(req: Request, context: RouteContext): Promise<Response> {
50
+ const { id } = await context.params
51
+ if (!z.string().uuid().safeParse(id).success) {
52
+ return NextResponse.json({ error: 'Invalid channel id' }, { status: 400 })
53
+ }
54
+
55
+ const auth = await getAuthFromRequest(req)
56
+ if (!auth?.sub || !auth?.tenantId) {
57
+ return NextResponse.json({ error: 'Unauthorized' }, { status: 401 })
58
+ }
59
+
60
+ const container = await createRequestContainer()
61
+ const em = (container.resolve('em') as EntityManager).fork()
62
+ const organizationId = (auth as { orgId?: string | null }).orgId ?? null
63
+ const dscope = { tenantId: auth.tenantId as string, organizationId }
64
+
65
+ const channel = await findOneWithDecryption(
66
+ em,
67
+ CommunicationChannel,
68
+ {
69
+ id,
70
+ tenantId: auth.tenantId as string,
71
+ organizationId,
72
+ deletedAt: null,
73
+ },
74
+ undefined,
75
+ dscope,
76
+ )
77
+ if (!channel) {
78
+ return NextResponse.json({ error: 'Channel not found' }, { status: 404 })
79
+ }
80
+
81
+ let userFeatures: string[] = []
82
+ try {
83
+ const rbac = container.resolve('rbacService') as RbacServiceLike
84
+ const acl = await rbac.loadAcl(auth.sub as string, {
85
+ tenantId: auth.tenantId as string,
86
+ organizationId,
87
+ })
88
+ userFeatures = acl?.isSuperAdmin ? ['*'] : Array.isArray(acl?.features) ? acl.features : []
89
+ } catch {
90
+ userFeatures = []
91
+ }
92
+ try {
93
+ assertCanManageChannel(
94
+ { userId: (channel as { userId?: string | null }).userId },
95
+ auth.sub as string,
96
+ userFeatures,
97
+ 'communication_channels.manage',
98
+ )
99
+ } catch (err) {
100
+ if (err instanceof ChannelAccessDeniedError) {
101
+ return NextResponse.json({ error: 'Channel not found' }, { status: 404 })
102
+ }
103
+ throw err
104
+ }
105
+
106
+ const guard = await validateRouteMutationGuard({
107
+ container,
108
+ req,
109
+ auth,
110
+ input: {
111
+ resourceKind: 'communication_channels.channel',
112
+ resourceId: id,
113
+ operation: 'delete',
114
+ },
115
+ })
116
+ if ('response' in guard) return guard.response
117
+
118
+ const commandBus = container.resolve('commandBus') as CommandBus
119
+ const input: DeleteChannelInput = {
120
+ channelId: id,
121
+ userId: auth.sub as string,
122
+ scope: { tenantId: auth.tenantId as string, organizationId },
123
+ }
124
+ const { result } = await commandBus.execute<DeleteChannelInput, DeleteChannelResult>(
125
+ COMMUNICATION_CHANNELS_DELETE_CHANNEL_COMMAND_ID,
126
+ {
127
+ input,
128
+ ctx: {
129
+ container,
130
+ auth: auth as never,
131
+ organizationScope: null,
132
+ selectedOrganizationId: organizationId,
133
+ organizationIds: organizationId ? [organizationId] : null,
134
+ },
135
+ },
136
+ )
137
+
138
+ // 'noop' (channel vanished between the load and the command) and 'not_owner'
139
+ // both map to 404 to avoid leaking ownership/existence.
140
+ if (result.status !== 'deleted') {
141
+ return NextResponse.json({ error: 'Channel not found' }, { status: 404 })
142
+ }
143
+ await guard.afterSuccess()
144
+ return new NextResponse(null, { status: 204 })
145
+ }
146
+
147
+ export const openApi = {
148
+ tags: ['CommunicationChannels'],
149
+ methods: {
150
+ DELETE: {
151
+ summary: 'Delete (soft-delete) a communication channel',
152
+ tags: ['CommunicationChannels'],
153
+ responses: [
154
+ { status: 204, description: 'Channel deleted' },
155
+ { status: 400, description: 'Invalid channel id' },
156
+ { status: 401, description: 'Unauthorized' },
157
+ { status: 404, description: 'Channel not found or not owned by current user' },
158
+ ],
159
+ },
160
+ },
161
+ }
162
+
163
+ export default DELETE