@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,123 @@
1
+ import { z } from "zod";
2
+ const tenantScopeSchema = z.object({
3
+ organizationId: z.string().uuid().nullable().optional(),
4
+ tenantId: z.string().uuid()
5
+ });
6
+ const channelCapabilitiesSchema = z.object({
7
+ threading: z.boolean(),
8
+ richText: z.boolean(),
9
+ fileSharing: z.boolean(),
10
+ maxFileSize: z.number().int().nonnegative().optional(),
11
+ supportedMimeTypes: z.array(z.string()).optional(),
12
+ readReceipts: z.boolean(),
13
+ deliveryReceipts: z.boolean(),
14
+ typingIndicators: z.boolean(),
15
+ reactions: z.boolean(),
16
+ multiReactionPerUser: z.boolean(),
17
+ editMessage: z.boolean(),
18
+ deleteMessage: z.boolean(),
19
+ presence: z.boolean(),
20
+ richBlocks: z.boolean(),
21
+ interactiveComponents: z.boolean(),
22
+ inlineImages: z.boolean(),
23
+ conversationHistory: z.boolean(),
24
+ contactCards: z.boolean(),
25
+ locationSharing: z.boolean(),
26
+ voiceNotes: z.boolean(),
27
+ stickers: z.boolean(),
28
+ supportedBodyFormats: z.array(z.enum(["text", "markdown", "html"])),
29
+ maxBodyLength: z.number().int().positive().optional(),
30
+ realtimePush: z.boolean().optional()
31
+ });
32
+ const normalizedAttachmentSchema = z.object({
33
+ url: z.string().url(),
34
+ mimeType: z.string().min(1),
35
+ fileName: z.string().min(1),
36
+ fileSize: z.number().int().nonnegative().optional(),
37
+ inline: z.boolean().optional()
38
+ });
39
+ const messageContentSchema = z.object({
40
+ text: z.string().optional(),
41
+ html: z.string().optional(),
42
+ bodyFormat: z.enum(["text", "markdown", "html"]).optional(),
43
+ attachments: z.array(normalizedAttachmentSchema).optional(),
44
+ raw: z.record(z.string(), z.unknown()).optional()
45
+ });
46
+ const sendMessageInputSchema = z.object({
47
+ conversationId: z.string().optional(),
48
+ content: messageContentSchema,
49
+ credentials: z.record(z.string(), z.unknown()),
50
+ scope: tenantScopeSchema,
51
+ metadata: z.record(z.string(), z.unknown()).optional()
52
+ });
53
+ const validateCredentialsInputSchema = z.object({
54
+ providerKey: z.string().min(1),
55
+ credentials: z.record(z.string(), z.unknown()),
56
+ scope: tenantScopeSchema
57
+ });
58
+ const validateCredentialsResultSchema = z.object({
59
+ ok: z.boolean(),
60
+ errors: z.record(z.string(), z.string()).optional()
61
+ });
62
+ const refreshCredentialsInputSchema = z.object({
63
+ channelId: z.string().uuid(),
64
+ credentials: z.record(z.string(), z.unknown()),
65
+ scope: tenantScopeSchema
66
+ });
67
+ const refreshedCredentialsSchema = z.object({
68
+ credentials: z.record(z.string(), z.unknown()),
69
+ expiresAt: z.date().optional()
70
+ });
71
+ const inboundReactionSchema = z.object({
72
+ emoji: z.string().min(1),
73
+ userIdentifier: z.string().min(1),
74
+ userDisplayName: z.string().optional(),
75
+ timestamp: z.date().optional()
76
+ });
77
+ const inboundReactionEventSchema = z.object({
78
+ externalMessageId: z.string().min(1),
79
+ externalConversationId: z.string().min(1).optional(),
80
+ externalReactionId: z.string().min(1).optional(),
81
+ emoji: z.string().min(1).max(64),
82
+ userIdentifier: z.string().min(1),
83
+ userDisplayName: z.string().optional(),
84
+ action: z.enum(["added", "removed"]),
85
+ timestamp: z.date().optional(),
86
+ raw: z.record(z.string(), z.unknown()).optional()
87
+ });
88
+ const normalizedInboundMessageSchema = z.object({
89
+ externalMessageId: z.string().min(1),
90
+ externalConversationId: z.string().min(1),
91
+ senderIdentifier: z.string().min(1),
92
+ senderDisplayName: z.string().optional(),
93
+ senderAvatarUrl: z.string().url().optional(),
94
+ subject: z.string().optional(),
95
+ body: z.string(),
96
+ bodyFormat: z.enum(["text", "markdown", "html"]),
97
+ attachments: z.array(normalizedAttachmentSchema).optional(),
98
+ timestamp: z.date(),
99
+ replyToExternalId: z.string().optional(),
100
+ channelPayload: z.record(z.string(), z.unknown()),
101
+ channelContentType: z.string().min(1),
102
+ channelMetadata: z.record(z.string(), z.unknown()),
103
+ reactions: z.array(inboundReactionSchema).optional()
104
+ });
105
+ const reactionApiBodySchema = z.object({
106
+ emoji: z.string().min(1).max(64)
107
+ });
108
+ export {
109
+ channelCapabilitiesSchema,
110
+ inboundReactionEventSchema,
111
+ inboundReactionSchema,
112
+ messageContentSchema,
113
+ normalizedAttachmentSchema,
114
+ normalizedInboundMessageSchema,
115
+ reactionApiBodySchema,
116
+ refreshCredentialsInputSchema,
117
+ refreshedCredentialsSchema,
118
+ sendMessageInputSchema,
119
+ tenantScopeSchema,
120
+ validateCredentialsInputSchema,
121
+ validateCredentialsResultSchema
122
+ };
123
+ //# sourceMappingURL=validators.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/modules/communication_channels/data/validators.ts"],
4
+ "sourcesContent": ["import { z } from 'zod'\n\n/**\n * Zod schemas for adapter inputs and API request/response bodies.\n *\n * These mirror the TypeScript interfaces in `lib/adapter.ts`. They are used by:\n * - API route handlers to validate incoming requests\n * - Adapter implementations that prefer runtime validation over TypeScript-only types\n * - `validateCredentials?(...)` flow on credential-based providers\n */\n\nexport const tenantScopeSchema = z.object({\n organizationId: z.string().uuid().nullable().optional(),\n tenantId: z.string().uuid(),\n})\n\nexport const channelCapabilitiesSchema = z.object({\n threading: z.boolean(),\n richText: z.boolean(),\n fileSharing: z.boolean(),\n maxFileSize: z.number().int().nonnegative().optional(),\n supportedMimeTypes: z.array(z.string()).optional(),\n readReceipts: z.boolean(),\n deliveryReceipts: z.boolean(),\n typingIndicators: z.boolean(),\n reactions: z.boolean(),\n multiReactionPerUser: z.boolean(),\n editMessage: z.boolean(),\n deleteMessage: z.boolean(),\n presence: z.boolean(),\n richBlocks: z.boolean(),\n interactiveComponents: z.boolean(),\n inlineImages: z.boolean(),\n conversationHistory: z.boolean(),\n contactCards: z.boolean(),\n locationSharing: z.boolean(),\n voiceNotes: z.boolean(),\n stickers: z.boolean(),\n supportedBodyFormats: z.array(z.enum(['text', 'markdown', 'html'])),\n maxBodyLength: z.number().int().positive().optional(),\n realtimePush: z.boolean().optional(),\n})\n\nexport const normalizedAttachmentSchema = z.object({\n url: z.string().url(),\n mimeType: z.string().min(1),\n fileName: z.string().min(1),\n fileSize: z.number().int().nonnegative().optional(),\n inline: z.boolean().optional(),\n})\n\nexport const messageContentSchema = z.object({\n text: z.string().optional(),\n html: z.string().optional(),\n bodyFormat: z.enum(['text', 'markdown', 'html']).optional(),\n attachments: z.array(normalizedAttachmentSchema).optional(),\n raw: z.record(z.string(), z.unknown()).optional(),\n})\n\nexport const sendMessageInputSchema = z.object({\n conversationId: z.string().optional(),\n content: messageContentSchema,\n credentials: z.record(z.string(), z.unknown()),\n scope: tenantScopeSchema,\n metadata: z.record(z.string(), z.unknown()).optional(),\n})\n\nexport const validateCredentialsInputSchema = z.object({\n providerKey: z.string().min(1),\n credentials: z.record(z.string(), z.unknown()),\n scope: tenantScopeSchema,\n})\n\nexport const validateCredentialsResultSchema = z.object({\n ok: z.boolean(),\n errors: z.record(z.string(), z.string()).optional(),\n})\n\nexport const refreshCredentialsInputSchema = z.object({\n channelId: z.string().uuid(),\n credentials: z.record(z.string(), z.unknown()),\n scope: tenantScopeSchema,\n})\n\nexport const refreshedCredentialsSchema = z.object({\n credentials: z.record(z.string(), z.unknown()),\n expiresAt: z.date().optional(),\n})\n\nexport const inboundReactionSchema = z.object({\n emoji: z.string().min(1),\n userIdentifier: z.string().min(1),\n userDisplayName: z.string().optional(),\n timestamp: z.date().optional(),\n})\n\n/**\n * Canonical normalized inbound reaction event \u2014 matches `InboundReactionEvent`\n * in `lib/adapter.ts`. Used by the reactions queue for type-safe payloads.\n */\nexport const inboundReactionEventSchema = z.object({\n externalMessageId: z.string().min(1),\n externalConversationId: z.string().min(1).optional(),\n externalReactionId: z.string().min(1).optional(),\n emoji: z.string().min(1).max(64),\n userIdentifier: z.string().min(1),\n userDisplayName: z.string().optional(),\n action: z.enum(['added', 'removed']),\n timestamp: z.date().optional(),\n raw: z.record(z.string(), z.unknown()).optional(),\n})\n\nexport const normalizedInboundMessageSchema = z.object({\n externalMessageId: z.string().min(1),\n externalConversationId: z.string().min(1),\n senderIdentifier: z.string().min(1),\n senderDisplayName: z.string().optional(),\n senderAvatarUrl: z.string().url().optional(),\n subject: z.string().optional(),\n body: z.string(),\n bodyFormat: z.enum(['text', 'markdown', 'html']),\n attachments: z.array(normalizedAttachmentSchema).optional(),\n timestamp: z.date(),\n replyToExternalId: z.string().optional(),\n channelPayload: z.record(z.string(), z.unknown()),\n channelContentType: z.string().min(1),\n channelMetadata: z.record(z.string(), z.unknown()),\n reactions: z.array(inboundReactionSchema).optional(),\n})\n\nexport const reactionApiBodySchema = z.object({\n emoji: z.string().min(1).max(64),\n})\n\nexport type SendMessageInputDto = z.infer<typeof sendMessageInputSchema>\nexport type NormalizedInboundMessageDto = z.infer<typeof normalizedInboundMessageSchema>\nexport type ChannelCapabilitiesDto = z.infer<typeof channelCapabilitiesSchema>\nexport type ReactionApiBodyDto = z.infer<typeof reactionApiBodySchema>\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,35 @@
1
+ import { asValue } from "awilix";
2
+ import {
3
+ CommunicationChannel,
4
+ ExternalConversation,
5
+ ExternalMessage,
6
+ MessageChannelLink,
7
+ ChannelThreadMapping,
8
+ MessageReaction
9
+ } from "./data/entities.js";
10
+ import { getChannelAdapterRegistry } from "./lib/adapter-registry-singleton.js";
11
+ import { ensureTestSeedAdapterRegistered } from "./lib/test-seed.js";
12
+ import { sendAsUser } from "./lib/send-as-user.js";
13
+ function register(container) {
14
+ ensureTestSeedAdapterRegistered();
15
+ container.register({
16
+ // Entity class registrations (for EntityManager lookups by string)
17
+ CommunicationChannel: asValue(CommunicationChannel),
18
+ ExternalConversation: asValue(ExternalConversation),
19
+ ExternalMessage: asValue(ExternalMessage),
20
+ MessageChannelLink: asValue(MessageChannelLink),
21
+ ChannelThreadMapping: asValue(ChannelThreadMapping),
22
+ MessageReaction: asValue(MessageReaction),
23
+ // Channel adapter registry — process-wide singleton backed by globalThis so
24
+ // the auth-less webhook route resolves the same registry as DI consumers.
25
+ // See lib/adapter-registry-singleton.ts.
26
+ channelAdapterRegistry: asValue(getChannelAdapterRegistry()),
27
+ // In-process send-as-user facade. Cross-module callers (e.g. the customers
28
+ // compose route) resolve this instead of making an HTTP self-call.
29
+ communicationChannelsSendAsUser: asValue(sendAsUser)
30
+ });
31
+ }
32
+ export {
33
+ register
34
+ };
35
+ //# sourceMappingURL=di.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/modules/communication_channels/di.ts"],
4
+ "sourcesContent": ["import { asValue } from 'awilix'\nimport type { AppContainer } from '@open-mercato/shared/lib/di/container'\nimport {\n CommunicationChannel,\n ExternalConversation,\n ExternalMessage,\n MessageChannelLink,\n ChannelThreadMapping,\n MessageReaction,\n} from './data/entities'\nimport { getChannelAdapterRegistry } from './lib/adapter-registry-singleton'\nimport { ensureTestSeedAdapterRegistered } from './lib/test-seed'\nimport { sendAsUser } from './lib/send-as-user'\n\nexport function register(container: AppContainer) {\n // Test-only: register the network-free stub channel adapter when\n // `OM_ENABLE_TEST_CHANNEL_SEEDING` is set (no-op in production). Lets the\n // integration harness connect a channel + complete the outbound send chain.\n // See lib/test-seed.ts.\n ensureTestSeedAdapterRegistered()\n\n container.register({\n // Entity class registrations (for EntityManager lookups by string)\n CommunicationChannel: asValue(CommunicationChannel),\n ExternalConversation: asValue(ExternalConversation),\n ExternalMessage: asValue(ExternalMessage),\n MessageChannelLink: asValue(MessageChannelLink),\n ChannelThreadMapping: asValue(ChannelThreadMapping),\n MessageReaction: asValue(MessageReaction),\n\n // Channel adapter registry \u2014 process-wide singleton backed by globalThis so\n // the auth-less webhook route resolves the same registry as DI consumers.\n // See lib/adapter-registry-singleton.ts.\n channelAdapterRegistry: asValue(getChannelAdapterRegistry()),\n\n // In-process send-as-user facade. Cross-module callers (e.g. the customers\n // compose route) resolve this instead of making an HTTP self-call.\n communicationChannelsSendAsUser: asValue(sendAsUser),\n })\n}\n"],
5
+ "mappings": "AAAA,SAAS,eAAe;AAExB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,iCAAiC;AAC1C,SAAS,uCAAuC;AAChD,SAAS,kBAAkB;AAEpB,SAAS,SAAS,WAAyB;AAKhD,kCAAgC;AAEhC,YAAU,SAAS;AAAA;AAAA,IAEjB,sBAAsB,QAAQ,oBAAoB;AAAA,IAClD,sBAAsB,QAAQ,oBAAoB;AAAA,IAClD,iBAAiB,QAAQ,eAAe;AAAA,IACxC,oBAAoB,QAAQ,kBAAkB;AAAA,IAC9C,sBAAsB,QAAQ,oBAAoB;AAAA,IAClD,iBAAiB,QAAQ,eAAe;AAAA;AAAA;AAAA;AAAA,IAKxC,wBAAwB,QAAQ,0BAA0B,CAAC;AAAA;AAAA;AAAA,IAI3D,iCAAiC,QAAQ,UAAU;AAAA,EACrD,CAAC;AACH;",
6
+ "names": []
7
+ }
@@ -0,0 +1,12 @@
1
+ const defaultEncryptionMaps = [
2
+ {
3
+ entityId: "communication_channels:channel_ingest_dead_letter",
4
+ fields: [{ field: "raw_body" }]
5
+ }
6
+ ];
7
+ var encryption_default = defaultEncryptionMaps;
8
+ export {
9
+ encryption_default as default,
10
+ defaultEncryptionMaps
11
+ };
12
+ //# sourceMappingURL=encryption.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/modules/communication_channels/encryption.ts"],
4
+ "sourcesContent": ["import type { ModuleEncryptionMap } from '@open-mercato/shared/modules/encryption'\n\n/**\n * Per-entity encryption maps for the communication_channels module.\n *\n * Credential encryption for `IntegrationCredentials.credentials` is owned by\n * the `integrations` module (see packages/core/src/modules/integrations/encryption.ts).\n *\n * `ChannelIngestDeadLetter.raw_body` holds truncated MIME bodies of\n * permanently-failed inbound messages. MIME bodies routinely contain PII\n * (sender/recipient addresses, quoted prior emails, attachments), so the\n * column is encrypted at rest. Reads use `findWithDecryption` per the\n * `packages/core/AGENTS.md` Encryption section.\n *\n * At-rest posture for the OTHER PII-bearing hub columns (deliberate, reviewed):\n * - The canonical email content is already encrypted in its PRIMARY stores \u2014\n * `messages.message` (subject/body/external_email+hash; see\n * messages/encryption.ts) and `customers.customer_interaction` (title/body).\n * - The hub keeps SECONDARY copies that are currently PLAINTEXT at rest:\n * `external_messages.sender_identifier`/`sender_display_name`,\n * `external_conversations.subject`, and `message_channel_links.channel_payload`.\n * The per-user access-control layer governs who can READ these; at-rest\n * encryption is a separate concern tracked as a follow-up (it requires\n * auditing every read path \u2014 the `_channelPayload` enricher and the\n * channel-payload renderer read these \u2014 to route through `findWithDecryption`).\n * - `message_channel_links.channel_metadata` MUST stay plaintext: the thread\n * matcher and sent-folder dedup query `channel_metadata->>'messageId'` BY\n * VALUE, and an encrypted column is not queryable by value (\u00A716 footgun).\n * - `external_messages.sender_identifier` similarly needs a deterministic\n * `*_hash` blind-index column before it can be encrypted, because inbound\n * contact resolution looks addresses up by value (see the address blind-index\n * follow-up in customers/lib/findPeopleByAddresses.ts).\n *\n * See `.ai/specs/2026-05-27-email-integration-inbound-reliability-and-threading.md`\n * (\u00A7 3 Encryption posture).\n */\nexport const defaultEncryptionMaps: ModuleEncryptionMap[] = [\n {\n entityId: 'communication_channels:channel_ingest_dead_letter',\n fields: [{ field: 'raw_body' }],\n },\n]\n\nexport default defaultEncryptionMaps\n"],
5
+ "mappings": "AAoCO,MAAM,wBAA+C;AAAA,EAC1D;AAAA,IACE,UAAU;AAAA,IACV,QAAQ,CAAC,EAAE,OAAO,WAAW,CAAC;AAAA,EAChC;AACF;AAEA,IAAO,qBAAQ;",
6
+ "names": []
7
+ }
@@ -0,0 +1,124 @@
1
+ import { createModuleEvents } from "@open-mercato/shared/modules/events";
2
+ const events = [
3
+ // ── Bridge events ────────────────────────────────────────
4
+ {
5
+ id: "communication_channels.message.received",
6
+ label: "External Message Received",
7
+ entity: "external_message",
8
+ category: "custom",
9
+ clientBroadcast: true
10
+ },
11
+ {
12
+ id: "communication_channels.message.sent",
13
+ label: "External Message Sent (Outbound)",
14
+ entity: "external_message",
15
+ category: "custom",
16
+ clientBroadcast: true
17
+ },
18
+ {
19
+ id: "communication_channels.message.delivery_failed",
20
+ label: "External Message Delivery Failed",
21
+ entity: "external_message",
22
+ category: "custom",
23
+ clientBroadcast: true
24
+ },
25
+ {
26
+ id: "communication_channels.conversation.created",
27
+ label: "External Conversation Created",
28
+ entity: "external_conversation",
29
+ category: "custom"
30
+ },
31
+ {
32
+ id: "communication_channels.conversation.reassigned",
33
+ label: "External Conversation Reassigned",
34
+ entity: "external_conversation",
35
+ category: "custom"
36
+ },
37
+ {
38
+ id: "communication_channels.contact.resolved",
39
+ label: "External Contact Resolved to CRM Person",
40
+ entity: "external_conversation",
41
+ category: "custom"
42
+ },
43
+ // ── Channel lifecycle events ─────────────────────────────
44
+ {
45
+ id: "communication_channels.channel.requires_reauth",
46
+ label: "Channel Requires Re-authentication",
47
+ entity: "communication_channel",
48
+ category: "lifecycle",
49
+ clientBroadcast: true
50
+ },
51
+ {
52
+ id: "communication_channels.channel.disconnected",
53
+ label: "Channel Disconnected",
54
+ entity: "communication_channel",
55
+ category: "lifecycle",
56
+ clientBroadcast: true
57
+ },
58
+ {
59
+ id: "communication_channels.channel.deleted",
60
+ label: "Channel Deleted",
61
+ entity: "communication_channel",
62
+ category: "lifecycle",
63
+ clientBroadcast: true
64
+ },
65
+ {
66
+ id: "communication_channels.channel.primary_changed",
67
+ label: "Primary Channel Changed",
68
+ entity: "communication_channel",
69
+ category: "lifecycle",
70
+ clientBroadcast: true
71
+ },
72
+ // ── Reaction events ──────────────────────────────────────
73
+ {
74
+ id: "communication_channels.reaction.added",
75
+ label: "Reaction Added",
76
+ entity: "message_reaction",
77
+ category: "custom",
78
+ clientBroadcast: true
79
+ },
80
+ {
81
+ id: "communication_channels.reaction.removed",
82
+ label: "Reaction Removed",
83
+ entity: "message_reaction",
84
+ category: "custom",
85
+ clientBroadcast: true
86
+ },
87
+ // ── Push delivery lifecycle (Spec C) ─────────────────────
88
+ {
89
+ id: "communication_channels.push.registered",
90
+ label: "Push Delivery Registered",
91
+ entity: "communication_channel",
92
+ category: "lifecycle",
93
+ clientBroadcast: true
94
+ },
95
+ {
96
+ id: "communication_channels.push.failed",
97
+ label: "Push Delivery Failed (Falling Back to Polling)",
98
+ entity: "communication_channel",
99
+ category: "lifecycle",
100
+ clientBroadcast: true
101
+ },
102
+ {
103
+ id: "communication_channels.push.renewed",
104
+ label: "Push Delivery Renewed",
105
+ entity: "communication_channel",
106
+ category: "lifecycle"
107
+ },
108
+ {
109
+ id: "communication_channels.push.deactivated",
110
+ label: "Push Delivery Deactivated",
111
+ entity: "communication_channel",
112
+ category: "lifecycle",
113
+ clientBroadcast: true
114
+ }
115
+ ];
116
+ const eventsConfig = createModuleEvents({ moduleId: "communication_channels", events });
117
+ const emitCommunicationChannelsEvent = eventsConfig.emit;
118
+ var events_default = eventsConfig;
119
+ export {
120
+ events_default as default,
121
+ emitCommunicationChannelsEvent,
122
+ eventsConfig
123
+ };
124
+ //# sourceMappingURL=events.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/modules/communication_channels/events.ts"],
4
+ "sourcesContent": ["import { createModuleEvents } from '@open-mercato/shared/modules/events'\n\nconst events = [\n // \u2500\u2500 Bridge events \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n {\n id: 'communication_channels.message.received',\n label: 'External Message Received',\n entity: 'external_message',\n category: 'custom',\n clientBroadcast: true,\n },\n {\n id: 'communication_channels.message.sent',\n label: 'External Message Sent (Outbound)',\n entity: 'external_message',\n category: 'custom',\n clientBroadcast: true,\n },\n {\n id: 'communication_channels.message.delivery_failed',\n label: 'External Message Delivery Failed',\n entity: 'external_message',\n category: 'custom',\n clientBroadcast: true,\n },\n {\n id: 'communication_channels.conversation.created',\n label: 'External Conversation Created',\n entity: 'external_conversation',\n category: 'custom',\n },\n {\n id: 'communication_channels.conversation.reassigned',\n label: 'External Conversation Reassigned',\n entity: 'external_conversation',\n category: 'custom',\n },\n {\n id: 'communication_channels.contact.resolved',\n label: 'External Contact Resolved to CRM Person',\n entity: 'external_conversation',\n category: 'custom',\n },\n // \u2500\u2500 Channel lifecycle events \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n {\n id: 'communication_channels.channel.requires_reauth',\n label: 'Channel Requires Re-authentication',\n entity: 'communication_channel',\n category: 'lifecycle',\n clientBroadcast: true,\n },\n {\n id: 'communication_channels.channel.disconnected',\n label: 'Channel Disconnected',\n entity: 'communication_channel',\n category: 'lifecycle',\n clientBroadcast: true,\n },\n {\n id: 'communication_channels.channel.deleted',\n label: 'Channel Deleted',\n entity: 'communication_channel',\n category: 'lifecycle',\n clientBroadcast: true,\n },\n {\n id: 'communication_channels.channel.primary_changed',\n label: 'Primary Channel Changed',\n entity: 'communication_channel',\n category: 'lifecycle',\n clientBroadcast: true,\n },\n // \u2500\u2500 Reaction events \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n {\n id: 'communication_channels.reaction.added',\n label: 'Reaction Added',\n entity: 'message_reaction',\n category: 'custom',\n clientBroadcast: true,\n },\n {\n id: 'communication_channels.reaction.removed',\n label: 'Reaction Removed',\n entity: 'message_reaction',\n category: 'custom',\n clientBroadcast: true,\n },\n // \u2500\u2500 Push delivery lifecycle (Spec C) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n {\n id: 'communication_channels.push.registered',\n label: 'Push Delivery Registered',\n entity: 'communication_channel',\n category: 'lifecycle',\n clientBroadcast: true,\n },\n {\n id: 'communication_channels.push.failed',\n label: 'Push Delivery Failed (Falling Back to Polling)',\n entity: 'communication_channel',\n category: 'lifecycle',\n clientBroadcast: true,\n },\n {\n id: 'communication_channels.push.renewed',\n label: 'Push Delivery Renewed',\n entity: 'communication_channel',\n category: 'lifecycle',\n },\n {\n id: 'communication_channels.push.deactivated',\n label: 'Push Delivery Deactivated',\n entity: 'communication_channel',\n category: 'lifecycle',\n clientBroadcast: true,\n },\n] as const\n\nexport const eventsConfig = createModuleEvents({ moduleId: 'communication_channels', events })\nexport const emitCommunicationChannelsEvent = eventsConfig.emit\nexport type CommunicationChannelsEventId = (typeof events)[number]['id']\n\nexport default eventsConfig\n"],
5
+ "mappings": "AAAA,SAAS,0BAA0B;AAEnC,MAAM,SAAS;AAAA;AAAA,EAEb;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,iBAAiB;AAAA,EACnB;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,iBAAiB;AAAA,EACnB;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,iBAAiB;AAAA,EACnB;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,UAAU;AAAA,EACZ;AAAA;AAAA,EAEA;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,iBAAiB;AAAA,EACnB;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,iBAAiB;AAAA,EACnB;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,iBAAiB;AAAA,EACnB;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,iBAAiB;AAAA,EACnB;AAAA;AAAA,EAEA;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,iBAAiB;AAAA,EACnB;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,iBAAiB;AAAA,EACnB;AAAA;AAAA,EAEA;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,iBAAiB;AAAA,EACnB;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,iBAAiB;AAAA,EACnB;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,iBAAiB;AAAA,EACnB;AACF;AAEO,MAAM,eAAe,mBAAmB,EAAE,UAAU,0BAA0B,OAAO,CAAC;AACtF,MAAM,iCAAiC,aAAa;AAG3D,IAAO,iBAAQ;",
6
+ "names": []
7
+ }
@@ -0,0 +1,20 @@
1
+ import "./commands/ingest-inbound-message.js";
2
+ import "./commands/deliver-outbound-message.js";
3
+ import "./commands/process-inbound-reaction.js";
4
+ import "./commands/toggle-outbound-reaction.js";
5
+ import "./commands/reassign-conversation.js";
6
+ import "./commands/connect-credential-channel.js";
7
+ import "./commands/set-primary-channel.js";
8
+ import "./commands/disconnect-channel.js";
9
+ import "./commands/delete-channel.js";
10
+ const metadata = {
11
+ id: "communication_channels",
12
+ title: "Communication Channels",
13
+ description: "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."
14
+ };
15
+ var communication_channels_default = metadata;
16
+ export {
17
+ communication_channels_default as default,
18
+ metadata
19
+ };
20
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/modules/communication_channels/index.ts"],
4
+ "sourcesContent": ["// Side-effect imports \u2014 register module commands at boot.\nimport './commands/ingest-inbound-message'\nimport './commands/deliver-outbound-message'\nimport './commands/process-inbound-reaction'\nimport './commands/toggle-outbound-reaction'\nimport './commands/reassign-conversation'\nimport './commands/connect-credential-channel'\nimport './commands/set-primary-channel'\nimport './commands/disconnect-channel'\nimport './commands/delete-channel'\n\nexport const metadata = {\n id: 'communication_channels',\n title: 'Communication Channels',\n description:\n '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.',\n}\n\nexport default metadata\n"],
5
+ "mappings": "AACA,OAAO;AACP,OAAO;AACP,OAAO;AACP,OAAO;AACP,OAAO;AACP,OAAO;AACP,OAAO;AACP,OAAO;AACP,OAAO;AAEA,MAAM,WAAW;AAAA,EACtB,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,aACE;AACJ;AAEA,IAAO,iCAAQ;",
6
+ "names": []
7
+ }
@@ -0,0 +1,43 @@
1
+ import { hasFeature } from "@open-mercato/shared/security/features";
2
+ const ADMIN_FEATURE = "communication_channels.admin";
3
+ function assertCanAccessChannel(channel, currentUserId, userFeatures) {
4
+ if (!channel) {
5
+ throw new ChannelAccessDeniedError("Channel not found");
6
+ }
7
+ void userFeatures;
8
+ if (channel.userId == null) return;
9
+ if (channel.userId !== currentUserId) {
10
+ throw new ChannelAccessDeniedError(
11
+ "Channel is a personal mailbox owned by another user"
12
+ );
13
+ }
14
+ }
15
+ function assertCanManageChannel(channel, currentUserId, userFeatures, elevatedFeature) {
16
+ if (!channel) {
17
+ throw new ChannelAccessDeniedError("Channel not found");
18
+ }
19
+ if (channel.userId != null) {
20
+ if (channel.userId !== currentUserId) {
21
+ throw new ChannelAccessDeniedError("Channel is a personal mailbox owned by another user");
22
+ }
23
+ return;
24
+ }
25
+ const grantedFeatures = Array.isArray(userFeatures) ? userFeatures : [];
26
+ if (!hasFeature(grantedFeatures, elevatedFeature)) {
27
+ throw new ChannelAccessDeniedError(`Managing a shared channel requires '${elevatedFeature}'`);
28
+ }
29
+ }
30
+ class ChannelAccessDeniedError extends Error {
31
+ constructor() {
32
+ super(...arguments);
33
+ this.name = "ChannelAccessDeniedError";
34
+ this.statusCode = 403;
35
+ }
36
+ }
37
+ export {
38
+ ADMIN_FEATURE,
39
+ ChannelAccessDeniedError,
40
+ assertCanAccessChannel,
41
+ assertCanManageChannel
42
+ };
43
+ //# sourceMappingURL=access-control.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/modules/communication_channels/lib/access-control.ts"],
4
+ "sourcesContent": ["import { hasFeature } from '@open-mercato/shared/security/features'\n\n/**\n * Per-user channel access control \u2014 service-layer authorization helpers.\n *\n * Personal mailbox privacy (v1: strict owner-only). A per-user channel\n * (`userId` set) may be read or managed ONLY by its owner \u2014 not even an admin\n * or superadmin can act on another user's personal mailbox. Tenant-wide /\n * shared channels (`userId == null`, e.g. WhatsApp Business / Slack workspaces)\n * remain accessible to any caller the route already feature-gated.\n *\n * Routes also narrow at the SQL layer (the admin channel list returns\n * `user_id IS NULL` rows only; the profile list filters `user_id =\n * currentUser.id`); these helpers are the per-channel authorization backstop a\n * route calls once it has loaded the row.\n */\n\nexport const ADMIN_FEATURE = 'communication_channels.admin'\n\n/**\n * Throws when the caller may not access a specific channel. Returns silently\n * when access is allowed.\n *\n * Personal mailbox privacy (v1: strict owner-only). A per-user channel\n * (`userId` set) may be acted on ONLY by its owner \u2014 not even an admin /\n * superadmin can poll, test-send, import history from, register push on, or\n * delete another user's personal mailbox. Tenant-wide channels\n * (`userId == null`, e.g. WhatsApp Business / Slack workspaces) remain\n * accessible to any caller the route already feature-gated.\n *\n * `userFeatures` is retained on the signature (callers pass it) but no longer\n * grants a bypass; it is reserved for the v2 admin-oversight feature.\n *\n * Callers MUST pass the fully decrypted channel row \u2014 we read `userId` directly.\n */\nexport function assertCanAccessChannel(\n channel: { userId?: string | null } | null | undefined,\n currentUserId: string | null | undefined,\n userFeatures: string[] | null | undefined,\n): void {\n if (!channel) {\n // Defensive: callers pre-check existence and return 404, so this is\n // unreachable in practice. Throw the typed access error (route-mapped to a\n // masked 404) rather than a bare Error that would surface as a 500.\n throw new ChannelAccessDeniedError('Channel not found')\n }\n void userFeatures\n // Tenant-wide / shared channel \u2014 accessible to all callers.\n if (channel.userId == null) return\n // Personal mailbox \u2014 owner only, regardless of admin grants (v1).\n if (channel.userId !== currentUserId) {\n throw new ChannelAccessDeniedError(\n 'Channel is a personal mailbox owned by another user',\n )\n }\n}\n\n/**\n * Authorization for MANAGING (mutating) a channel \u2014 disconnect, poll, set\n * primary, import history, register push. Encodes the per-user ownership rule:\n *\n * - **Personal mailbox** (`userId` set): the **owner has full control** of\n * their own account; any other caller \u2014 admin included \u2014 is denied (v1\n * strict owner-only, no bypass). Routes gate these on\n * `communication_channels.connect_user_channel` so every email user reaches\n * this check for their own channels.\n * - **Tenant-wide / shared channel** (`userId == null`, e.g. WhatsApp\n * Business / Slack workspaces): requires the route's `elevatedFeature`\n * (`communication_channels.manage`, `\u2026channel.push.manage`, or\n * `\u2026channel.import_history`). Wildcard-aware via {@link hasFeature}.\n *\n * Throws `ChannelAccessDeniedError` (route handlers map it to 404, masking\n * existence) when the caller may not manage the channel.\n */\nexport function assertCanManageChannel(\n channel: { userId?: string | null } | null | undefined,\n currentUserId: string | null | undefined,\n userFeatures: string[] | null | undefined,\n elevatedFeature: string,\n): void {\n if (!channel) {\n // Defensive: callers pre-check existence and return 404, so this is\n // unreachable in practice. Throw the typed access error (route-mapped to a\n // masked 404) rather than a bare Error that would surface as a 500.\n throw new ChannelAccessDeniedError('Channel not found')\n }\n // Personal mailbox \u2014 owner only. The owner manages their own account fully\n // (gated by connect_user_channel at the route); no admin bypass in v1.\n if (channel.userId != null) {\n if (channel.userId !== currentUserId) {\n throw new ChannelAccessDeniedError('Channel is a personal mailbox owned by another user')\n }\n return\n }\n // Tenant-wide / shared channel \u2014 requires the elevated management feature.\n const grantedFeatures = Array.isArray(userFeatures) ? userFeatures : []\n if (!hasFeature(grantedFeatures, elevatedFeature)) {\n throw new ChannelAccessDeniedError(`Managing a shared channel requires '${elevatedFeature}'`)\n }\n}\n\n/**\n * Stable error class so route handlers can map to a 403 instead of leaking the\n * underlying message verbatim. Subclasses `Error` for compatibility with the\n * platform's error logging helpers.\n */\nexport class ChannelAccessDeniedError extends Error {\n override name = 'ChannelAccessDeniedError'\n readonly statusCode = 403\n}\n"],
5
+ "mappings": "AAAA,SAAS,kBAAkB;AAiBpB,MAAM,gBAAgB;AAkBtB,SAAS,uBACd,SACA,eACA,cACM;AACN,MAAI,CAAC,SAAS;AAIZ,UAAM,IAAI,yBAAyB,mBAAmB;AAAA,EACxD;AACA,OAAK;AAEL,MAAI,QAAQ,UAAU,KAAM;AAE5B,MAAI,QAAQ,WAAW,eAAe;AACpC,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACF;AAmBO,SAAS,uBACd,SACA,eACA,cACA,iBACM;AACN,MAAI,CAAC,SAAS;AAIZ,UAAM,IAAI,yBAAyB,mBAAmB;AAAA,EACxD;AAGA,MAAI,QAAQ,UAAU,MAAM;AAC1B,QAAI,QAAQ,WAAW,eAAe;AACpC,YAAM,IAAI,yBAAyB,qDAAqD;AAAA,IAC1F;AACA;AAAA,EACF;AAEA,QAAM,kBAAkB,MAAM,QAAQ,YAAY,IAAI,eAAe,CAAC;AACtE,MAAI,CAAC,WAAW,iBAAiB,eAAe,GAAG;AACjD,UAAM,IAAI,yBAAyB,uCAAuC,eAAe,GAAG;AAAA,EAC9F;AACF;AAOO,MAAM,iCAAiC,MAAM;AAAA,EAA7C;AAAA;AACL,SAAS,OAAO;AAChB,SAAS,aAAa;AAAA;AACxB;",
6
+ "names": []
7
+ }
@@ -0,0 +1,36 @@
1
+ const CAPABILITY_METHOD_PAIRS = [
2
+ { flag: "reactions", method: "sendReaction" },
3
+ { flag: "reactions", method: "removeReaction" },
4
+ { flag: "editMessage", method: "editMessage" },
5
+ { flag: "deleteMessage", method: "deleteMessage" },
6
+ { flag: "conversationHistory", method: "fetchHistory" }
7
+ ];
8
+ function validateAdapterCapabilities(adapter) {
9
+ if (!adapter.providerKey) {
10
+ throw new Error("ChannelAdapter is missing required `providerKey` property");
11
+ }
12
+ if (!adapter.channelType) {
13
+ throw new Error(
14
+ `ChannelAdapter '${adapter.providerKey}' is missing required \`channelType\` property`
15
+ );
16
+ }
17
+ if (!adapter.capabilities) {
18
+ throw new Error(
19
+ `ChannelAdapter '${adapter.providerKey}' is missing required \`capabilities\` property`
20
+ );
21
+ }
22
+ for (const pair of CAPABILITY_METHOD_PAIRS) {
23
+ const flagSet = adapter.capabilities[pair.flag] === true;
24
+ if (!flagSet) continue;
25
+ const method = adapter[pair.method];
26
+ if (typeof method !== "function") {
27
+ throw new Error(
28
+ `ChannelAdapter '${adapter.providerKey}' declares capabilities.${String(pair.flag)}=true but does not implement ${String(pair.method)}()`
29
+ );
30
+ }
31
+ }
32
+ }
33
+ export {
34
+ validateAdapterCapabilities
35
+ };
36
+ //# sourceMappingURL=adapter-compat.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/modules/communication_channels/lib/adapter-compat.ts"],
4
+ "sourcesContent": ["import type { ChannelAdapter, ChannelCapabilities } from './adapter'\n\n/**\n * Capability flags that imply the presence of an optional adapter method.\n * If the adapter declares the flag = true but does not implement the corresponding\n * method, registration fails with a clear error.\n *\n * NOTE: This is the strict registration validator; it replaces what an earlier\n * draft of SPEC-045d called a \"v1 fallback\". There is no v1 in shipping code,\n * so no fallback is needed \u2014 the contract is strict by design.\n */\nconst CAPABILITY_METHOD_PAIRS: Array<{\n flag: keyof ChannelCapabilities\n method: keyof ChannelAdapter\n}> = [\n { flag: 'reactions', method: 'sendReaction' },\n { flag: 'reactions', method: 'removeReaction' },\n { flag: 'editMessage', method: 'editMessage' },\n { flag: 'deleteMessage', method: 'deleteMessage' },\n { flag: 'conversationHistory', method: 'fetchHistory' },\n]\n\n/**\n * Validates that every capability flag set to `true` on the adapter has its\n * corresponding optional method implemented. Throws a descriptive Error if a\n * capability/method pair is inconsistent.\n *\n * Called by the channel adapter registry at registration time; fails fast at\n * module boot rather than at runtime when the hub tries to invoke the missing\n * method.\n */\nexport function validateAdapterCapabilities(adapter: ChannelAdapter): void {\n if (!adapter.providerKey) {\n throw new Error('ChannelAdapter is missing required `providerKey` property')\n }\n if (!adapter.channelType) {\n throw new Error(\n `ChannelAdapter '${adapter.providerKey}' is missing required \\`channelType\\` property`,\n )\n }\n if (!adapter.capabilities) {\n throw new Error(\n `ChannelAdapter '${adapter.providerKey}' is missing required \\`capabilities\\` property`,\n )\n }\n\n for (const pair of CAPABILITY_METHOD_PAIRS) {\n const flagSet = adapter.capabilities[pair.flag] === true\n if (!flagSet) continue\n const method = (adapter as unknown as Record<string, unknown>)[pair.method]\n if (typeof method !== 'function') {\n throw new Error(\n `ChannelAdapter '${adapter.providerKey}' declares capabilities.${String(pair.flag)}=true but does not implement ${String(pair.method)}()`,\n )\n }\n }\n}\n"],
5
+ "mappings": "AAWA,MAAM,0BAGD;AAAA,EACH,EAAE,MAAM,aAAa,QAAQ,eAAe;AAAA,EAC5C,EAAE,MAAM,aAAa,QAAQ,iBAAiB;AAAA,EAC9C,EAAE,MAAM,eAAe,QAAQ,cAAc;AAAA,EAC7C,EAAE,MAAM,iBAAiB,QAAQ,gBAAgB;AAAA,EACjD,EAAE,MAAM,uBAAuB,QAAQ,eAAe;AACxD;AAWO,SAAS,4BAA4B,SAA+B;AACzE,MAAI,CAAC,QAAQ,aAAa;AACxB,UAAM,IAAI,MAAM,2DAA2D;AAAA,EAC7E;AACA,MAAI,CAAC,QAAQ,aAAa;AACxB,UAAM,IAAI;AAAA,MACR,mBAAmB,QAAQ,WAAW;AAAA,IACxC;AAAA,EACF;AACA,MAAI,CAAC,QAAQ,cAAc;AACzB,UAAM,IAAI;AAAA,MACR,mBAAmB,QAAQ,WAAW;AAAA,IACxC;AAAA,EACF;AAEA,aAAW,QAAQ,yBAAyB;AAC1C,UAAM,UAAU,QAAQ,aAAa,KAAK,IAAI,MAAM;AACpD,QAAI,CAAC,QAAS;AACd,UAAM,SAAU,QAA+C,KAAK,MAAM;AAC1E,QAAI,OAAO,WAAW,YAAY;AAChC,YAAM,IAAI;AAAA,QACR,mBAAmB,QAAQ,WAAW,2BAA2B,OAAO,KAAK,IAAI,CAAC,gCAAgC,OAAO,KAAK,MAAM,CAAC;AAAA,MACvI;AAAA,IACF;AAAA,EACF;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,22 @@
1
+ import {
2
+ ChannelAdapterRegistry,
3
+ getChannelAdapter,
4
+ hasChannelAdapter,
5
+ listChannelAdapters,
6
+ listChannelAdapterProviderKeys,
7
+ registerChannelAdapter
8
+ } from "./registry.js";
9
+ let cachedRegistry = null;
10
+ function getChannelAdapterRegistry() {
11
+ if (!cachedRegistry) cachedRegistry = new ChannelAdapterRegistry();
12
+ return cachedRegistry;
13
+ }
14
+ export {
15
+ getChannelAdapter,
16
+ getChannelAdapterRegistry,
17
+ hasChannelAdapter,
18
+ listChannelAdapterProviderKeys,
19
+ listChannelAdapters,
20
+ registerChannelAdapter
21
+ };
22
+ //# sourceMappingURL=adapter-registry-singleton.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/modules/communication_channels/lib/adapter-registry-singleton.ts"],
4
+ "sourcesContent": ["/**\n * Public alias for the channel-adapter registry, exposing the function-form API.\n *\n * Webhook routes (auth-less, no DI request scope yet) import from here to look up\n * adapters by `providerKey`. Inside a normal DI scope you can equivalently resolve\n * `container.resolve('channelAdapterRegistry')` \u2014 both share the same storage\n * (process-level `globalThis` symbol).\n */\nimport {\n ChannelAdapterRegistry,\n getChannelAdapter,\n hasChannelAdapter,\n listChannelAdapters,\n listChannelAdapterProviderKeys,\n registerChannelAdapter,\n} from './registry'\n\nexport {\n getChannelAdapter,\n hasChannelAdapter,\n listChannelAdapters,\n listChannelAdapterProviderKeys,\n registerChannelAdapter,\n}\n\n/**\n * Returns a singleton registry instance (class form). Useful when callers want\n * to pass a registry through DI or to a worker context without binding to module\n * globals directly.\n */\nlet cachedRegistry: ChannelAdapterRegistry | null = null\nexport function getChannelAdapterRegistry(): ChannelAdapterRegistry {\n if (!cachedRegistry) cachedRegistry = new ChannelAdapterRegistry()\n return cachedRegistry\n}\n"],
5
+ "mappings": "AAQA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAeP,IAAI,iBAAgD;AAC7C,SAAS,4BAAoD;AAClE,MAAI,CAAC,eAAgB,kBAAiB,IAAI,uBAAuB;AACjE,SAAO;AACT;",
6
+ "names": []
7
+ }
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=adapter.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": [],
4
+ "sourcesContent": [],
5
+ "mappings": "",
6
+ "names": []
7
+ }