@open-mercato/core 0.6.5-develop.4384.1.ce2ec6eaaa → 0.6.5-develop.4397.1.9a65481757

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