@hexabot-ai/api 3.1.3-alpha.0 → 3.2.0-alpha.0

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 (957) hide show
  1. package/README.md +1 -0
  2. package/dist/analytics/controllers/stats.controller.d.ts +3 -1
  3. package/dist/analytics/controllers/stats.controller.js +21 -0
  4. package/dist/analytics/controllers/stats.controller.js.map +1 -1
  5. package/dist/analytics/dto/stats.dto.d.ts +16 -11
  6. package/dist/analytics/dto/stats.dto.js +1 -31
  7. package/dist/analytics/dto/stats.dto.js.map +1 -1
  8. package/dist/analytics/entities/stats.entity.d.ts +20 -3
  9. package/dist/analytics/entities/stats.entity.js +3 -3
  10. package/dist/analytics/entities/stats.entity.js.map +1 -1
  11. package/dist/analytics/enums/stats-type.enum.d.ts +1 -9
  12. package/dist/analytics/enums/stats-type.enum.js +2 -10
  13. package/dist/analytics/enums/stats-type.enum.js.map +1 -1
  14. package/dist/analytics/repositories/stats.repository.d.ts +1 -1
  15. package/dist/analytics/repositories/stats.repository.js.map +1 -1
  16. package/dist/analytics/services/stats.service.d.ts +7 -2
  17. package/dist/analytics/services/stats.service.js +95 -8
  18. package/dist/analytics/services/stats.service.js.map +1 -1
  19. package/dist/app.controller.d.ts +13 -0
  20. package/dist/app.controller.js +9 -0
  21. package/dist/app.controller.js.map +1 -1
  22. package/dist/app.module.js +4 -0
  23. package/dist/app.module.js.map +1 -1
  24. package/dist/app.service.d.ts +5 -1
  25. package/dist/app.service.js +8 -2
  26. package/dist/app.service.js.map +1 -1
  27. package/dist/attachment/attachment.module.js +4 -1
  28. package/dist/attachment/attachment.module.js.map +1 -1
  29. package/dist/attachment/controllers/attachment.controller.d.ts +65 -2
  30. package/dist/attachment/controllers/attachment.controller.js.map +1 -1
  31. package/dist/attachment/dto/attachment.dto.d.ts +4 -23
  32. package/dist/attachment/dto/attachment.dto.js +1 -72
  33. package/dist/attachment/dto/attachment.dto.js.map +1 -1
  34. package/dist/attachment/entities/attachment.entity.d.ts +113 -6
  35. package/dist/attachment/entities/attachment.entity.js +16 -21
  36. package/dist/attachment/entities/attachment.entity.js.map +1 -1
  37. package/dist/attachment/guards/attachment-ability.guard.js.map +1 -1
  38. package/dist/attachment/mocks/attachment.mock.d.ts +1 -1
  39. package/dist/attachment/mocks/attachment.mock.js +7 -2
  40. package/dist/attachment/mocks/attachment.mock.js.map +1 -1
  41. package/dist/attachment/services/attachment.service.d.ts +2 -1
  42. package/dist/attachment/services/attachment.service.js.map +1 -1
  43. package/dist/attachment/types/index.d.ts +1 -15
  44. package/dist/attachment/types/index.js +5 -19
  45. package/dist/attachment/types/index.js.map +1 -1
  46. package/dist/audit/audit-core.module.d.ts +2 -0
  47. package/dist/audit/audit-core.module.js +39 -0
  48. package/dist/audit/audit-core.module.js.map +1 -0
  49. package/dist/audit/audit.module.d.ts +2 -0
  50. package/dist/audit/audit.module.js +62 -0
  51. package/dist/audit/audit.module.js.map +1 -0
  52. package/dist/audit/controllers/audit-log.controller.d.ts +16 -0
  53. package/dist/audit/controllers/audit-log.controller.js +85 -0
  54. package/dist/audit/controllers/audit-log.controller.js.map +1 -0
  55. package/dist/audit/decorators/audit-label.decorator.d.ts +4 -0
  56. package/dist/audit/decorators/audit-label.decorator.js +23 -0
  57. package/dist/audit/decorators/audit-label.decorator.js.map +1 -0
  58. package/dist/audit/decorators/audit-log.decorators.d.ts +2 -0
  59. package/dist/audit/decorators/audit-log.decorators.js +31 -0
  60. package/dist/audit/decorators/audit-log.decorators.js.map +1 -0
  61. package/dist/audit/dto/audit-log.dto.d.ts +33 -0
  62. package/dist/audit/dto/audit-log.dto.js +132 -0
  63. package/dist/audit/dto/audit-log.dto.js.map +1 -0
  64. package/dist/audit/entities/audit-log.entity.d.ts +76 -0
  65. package/dist/audit/entities/audit-log.entity.js +104 -0
  66. package/dist/audit/entities/audit-log.entity.js.map +1 -0
  67. package/dist/audit/exporters/audit-backend.factory.d.ts +10 -0
  68. package/dist/audit/exporters/audit-backend.factory.js +60 -0
  69. package/dist/audit/exporters/audit-backend.factory.js.map +1 -0
  70. package/dist/audit/exporters/audit-database.exporter.d.ts +13 -0
  71. package/dist/audit/exporters/audit-database.exporter.js +89 -0
  72. package/dist/audit/exporters/audit-database.exporter.js.map +1 -0
  73. package/dist/audit/exporters/audit-noop.exporter.d.ts +8 -0
  74. package/dist/audit/exporters/audit-noop.exporter.js +22 -0
  75. package/dist/audit/exporters/audit-noop.exporter.js.map +1 -0
  76. package/dist/audit/exporters/audit-safe.exporter.d.ts +14 -0
  77. package/dist/audit/exporters/audit-safe.exporter.js +38 -0
  78. package/dist/audit/exporters/audit-safe.exporter.js.map +1 -0
  79. package/dist/audit/index.d.ts +9 -0
  80. package/dist/audit/index.js +26 -0
  81. package/dist/audit/index.js.map +1 -0
  82. package/dist/audit/interceptors/audit-context.interceptor.d.ts +8 -0
  83. package/dist/audit/interceptors/audit-context.interceptor.js +32 -0
  84. package/dist/audit/interceptors/audit-context.interceptor.js.map +1 -0
  85. package/dist/audit/repositories/audit-log.repository.d.ts +6 -0
  86. package/dist/audit/repositories/audit-log.repository.js +32 -0
  87. package/dist/audit/repositories/audit-log.repository.js.map +1 -0
  88. package/dist/audit/services/audit-context.service.d.ts +13 -0
  89. package/dist/audit/services/audit-context.service.js +84 -0
  90. package/dist/audit/services/audit-context.service.js.map +1 -0
  91. package/dist/audit/services/audit-log-record.service.d.ts +16 -0
  92. package/dist/audit/services/audit-log-record.service.js +69 -0
  93. package/dist/audit/services/audit-log-record.service.js.map +1 -0
  94. package/dist/audit/subscribers/audit-log.subscriber.d.ts +25 -0
  95. package/dist/audit/subscribers/audit-log.subscriber.js +209 -0
  96. package/dist/audit/subscribers/audit-log.subscriber.js.map +1 -0
  97. package/dist/audit/types/audit-context.type.d.ts +13 -0
  98. package/dist/audit/types/audit-context.type.js +3 -0
  99. package/dist/audit/types/audit-context.type.js.map +1 -0
  100. package/dist/audit/utils/request-context.d.ts +5 -0
  101. package/dist/audit/utils/request-context.js +33 -0
  102. package/dist/audit/utils/request-context.js.map +1 -0
  103. package/dist/channel/channel.controller.d.ts +5 -4
  104. package/dist/channel/channel.controller.js +11 -3
  105. package/dist/channel/channel.controller.js.map +1 -1
  106. package/dist/channel/channel.module.js +22 -3
  107. package/dist/channel/channel.module.js.map +1 -1
  108. package/dist/channel/channel.service.d.ts +15 -8
  109. package/dist/channel/channel.service.js +74 -59
  110. package/dist/channel/channel.service.js.map +1 -1
  111. package/dist/channel/dto/source.dto.d.ts +20 -0
  112. package/dist/channel/dto/source.dto.js +66 -0
  113. package/dist/channel/dto/source.dto.js.map +1 -0
  114. package/dist/channel/entities/source.entity.d.ts +85 -0
  115. package/dist/channel/entities/source.entity.js +63 -0
  116. package/dist/channel/entities/source.entity.js.map +1 -0
  117. package/dist/channel/index.d.ts +12 -0
  118. package/dist/channel/index.js +12 -0
  119. package/dist/channel/index.js.map +1 -1
  120. package/dist/channel/lib/Handler.d.ts +21 -15
  121. package/dist/channel/lib/Handler.js +43 -24
  122. package/dist/channel/lib/Handler.js.map +1 -1
  123. package/dist/channel/lib/__test__/common.mock.d.ts +7 -7
  124. package/dist/channel/lib/__test__/common.mock.js +12 -14
  125. package/dist/channel/lib/__test__/common.mock.js.map +1 -1
  126. package/dist/channel/lib/__test__/label.mock.d.ts +1 -1
  127. package/dist/channel/lib/__test__/subscriber.mock.d.ts +1 -1
  128. package/dist/channel/lib/__test__/subscriber.mock.js +1 -0
  129. package/dist/channel/lib/__test__/subscriber.mock.js.map +1 -1
  130. package/dist/channel/lib/channel-capabilities.d.ts +12 -0
  131. package/dist/channel/lib/channel-capabilities.js +15 -0
  132. package/dist/channel/lib/channel-capabilities.js.map +1 -0
  133. package/dist/channel/lib/channel-codec.d.ts +7 -0
  134. package/dist/channel/lib/channel-codec.js +3 -0
  135. package/dist/channel/lib/channel-codec.js.map +1 -0
  136. package/dist/channel/lib/channel-event-bus.d.ts +22 -0
  137. package/dist/channel/lib/channel-event-bus.js +47 -0
  138. package/dist/channel/lib/channel-event-bus.js.map +1 -0
  139. package/dist/channel/lib/extension-inject.decorator.d.ts +9 -0
  140. package/dist/channel/lib/extension-inject.decorator.js +25 -0
  141. package/dist/channel/lib/extension-inject.decorator.js.map +1 -0
  142. package/dist/channel/lib/inbound-events/channel-inbound-event-context.d.ts +7 -1
  143. package/dist/channel/lib/inbound-events/channel-inbound-event-context.js +15 -1
  144. package/dist/channel/lib/inbound-events/channel-inbound-event-context.js.map +1 -1
  145. package/dist/channel/lib/inbound-events/channel-inbound-event.d.ts +6 -2
  146. package/dist/channel/lib/inbound-events/channel-inbound-event.js +19 -0
  147. package/dist/channel/lib/inbound-events/channel-inbound-event.js.map +1 -1
  148. package/dist/channel/lib/inbound-events/message-inbound-event.d.ts +1 -2
  149. package/dist/channel/lib/inbound-events/message-inbound-event.js +8 -6
  150. package/dist/channel/lib/inbound-events/message-inbound-event.js.map +1 -1
  151. package/dist/channel/lib/inbound-events/synthetic-message-inbound-event.d.ts +1 -2
  152. package/dist/channel/lib/inbound-events/synthetic-message-inbound-event.js +23 -24
  153. package/dist/channel/lib/inbound-events/synthetic-message-inbound-event.js.map +1 -1
  154. package/dist/channel/lib/outbound/channel-outbound-encoder.d.ts +21 -10
  155. package/dist/channel/lib/outbound/channel-outbound-encoder.js +19 -55
  156. package/dist/channel/lib/outbound/channel-outbound-encoder.js.map +1 -1
  157. package/dist/channel/lib/transports/http-channel-handler.d.ts +17 -0
  158. package/dist/channel/lib/transports/http-channel-handler.js +85 -0
  159. package/dist/channel/lib/transports/http-channel-handler.js.map +1 -0
  160. package/dist/channel/lib/transports/index.d.ts +2 -0
  161. package/dist/channel/lib/transports/index.js +19 -0
  162. package/dist/channel/lib/transports/index.js.map +1 -0
  163. package/dist/channel/lib/transports/websocket-channel-handler.d.ts +17 -0
  164. package/dist/channel/lib/transports/websocket-channel-handler.js +65 -0
  165. package/dist/channel/lib/transports/websocket-channel-handler.js.map +1 -0
  166. package/dist/channel/repositories/source.repository.d.ts +6 -0
  167. package/dist/channel/repositories/source.repository.js +32 -0
  168. package/dist/channel/repositories/source.repository.js.map +1 -0
  169. package/dist/channel/services/channel-attachment.service.d.ts +3 -3
  170. package/dist/channel/services/channel-attachment.service.js +19 -13
  171. package/dist/channel/services/channel-attachment.service.js.map +1 -1
  172. package/dist/channel/services/channel-download.service.d.ts +4 -2
  173. package/dist/channel/services/channel-download.service.js +7 -3
  174. package/dist/channel/services/channel-download.service.js.map +1 -1
  175. package/dist/channel/services/channel-registry.service.d.ts +9 -0
  176. package/dist/channel/services/channel-registry.service.js +36 -0
  177. package/dist/channel/services/channel-registry.service.js.map +1 -0
  178. package/dist/channel/services/source.service.d.ts +28 -0
  179. package/dist/channel/services/source.service.js +145 -0
  180. package/dist/channel/services/source.service.js.map +1 -0
  181. package/dist/channel/services/subscriber-resolver.service.d.ts +15 -0
  182. package/dist/channel/services/subscriber-resolver.service.js +48 -0
  183. package/dist/channel/services/subscriber-resolver.service.js.map +1 -0
  184. package/dist/channel/source.controller.d.ts +27 -0
  185. package/dist/channel/source.controller.js +102 -0
  186. package/dist/channel/source.controller.js.map +1 -0
  187. package/dist/channel/types.d.ts +10 -4
  188. package/dist/channel/webhook.controller.d.ts +8 -10
  189. package/dist/channel/webhook.controller.js +30 -38
  190. package/dist/channel/webhook.controller.js.map +1 -1
  191. package/dist/chat/controllers/label-group.controller.d.ts +2 -1
  192. package/dist/chat/controllers/label-group.controller.js.map +1 -1
  193. package/dist/chat/controllers/label.controller.d.ts +2 -1
  194. package/dist/chat/controllers/label.controller.js.map +1 -1
  195. package/dist/chat/controllers/message.controller.d.ts +3 -2
  196. package/dist/chat/controllers/message.controller.js +13 -11
  197. package/dist/chat/controllers/message.controller.js.map +1 -1
  198. package/dist/chat/controllers/subscriber.controller.d.ts +26 -2
  199. package/dist/chat/controllers/subscriber.controller.js +1 -0
  200. package/dist/chat/controllers/subscriber.controller.js.map +1 -1
  201. package/dist/chat/controllers/thread.controller.d.ts +14 -2
  202. package/dist/chat/controllers/thread.controller.js +4 -0
  203. package/dist/chat/controllers/thread.controller.js.map +1 -1
  204. package/dist/chat/dto/label-group.dto.d.ts +4 -13
  205. package/dist/chat/dto/label-group.dto.js +1 -35
  206. package/dist/chat/dto/label-group.dto.js.map +1 -1
  207. package/dist/chat/dto/label.dto.d.ts +4 -20
  208. package/dist/chat/dto/label.dto.js +1 -63
  209. package/dist/chat/dto/label.dto.js.map +1 -1
  210. package/dist/chat/dto/message.dto.d.ts +7 -26
  211. package/dist/chat/dto/message.dto.js +13 -83
  212. package/dist/chat/dto/message.dto.js.map +1 -1
  213. package/dist/chat/dto/subscriber.dto.d.ts +6 -27
  214. package/dist/chat/dto/subscriber.dto.js +11 -83
  215. package/dist/chat/dto/subscriber.dto.js.map +1 -1
  216. package/dist/chat/dto/thread.dto.d.ts +5 -17
  217. package/dist/chat/dto/thread.dto.js +11 -54
  218. package/dist/chat/dto/thread.dto.js.map +1 -1
  219. package/dist/chat/entities/label-group.entity.d.ts +37 -3
  220. package/dist/chat/entities/label-group.entity.js +5 -3
  221. package/dist/chat/entities/label-group.entity.js.map +1 -1
  222. package/dist/chat/entities/label.entity.d.ts +88 -3
  223. package/dist/chat/entities/label.entity.js +5 -3
  224. package/dist/chat/entities/label.entity.js.map +1 -1
  225. package/dist/chat/entities/message.entity.d.ts +824 -4
  226. package/dist/chat/entities/message.entity.js +3 -3
  227. package/dist/chat/entities/message.entity.js.map +1 -1
  228. package/dist/chat/entities/subscriber.entity.d.ts +9 -7
  229. package/dist/chat/entities/subscriber.entity.js +19 -4
  230. package/dist/chat/entities/subscriber.entity.js.map +1 -1
  231. package/dist/chat/entities/thread.entity.d.ts +109 -3
  232. package/dist/chat/entities/thread.entity.js +19 -3
  233. package/dist/chat/entities/thread.entity.js.map +1 -1
  234. package/dist/chat/helpers/envelope-builder.d.ts +7 -7
  235. package/dist/chat/helpers/envelope-builder.js +26 -26
  236. package/dist/chat/helpers/envelope-builder.js.map +1 -1
  237. package/dist/chat/helpers/envelope-factory.d.ts +132 -42
  238. package/dist/chat/helpers/envelope-factory.js +11 -12
  239. package/dist/chat/helpers/envelope-factory.js.map +1 -1
  240. package/dist/chat/index.d.ts +0 -5
  241. package/dist/chat/index.js +0 -5
  242. package/dist/chat/index.js.map +1 -1
  243. package/dist/chat/repositories/message.repository.d.ts +1 -2
  244. package/dist/chat/repositories/message.repository.js.map +1 -1
  245. package/dist/chat/repositories/subscriber.repository.d.ts +8 -6
  246. package/dist/chat/repositories/subscriber.repository.js +18 -16
  247. package/dist/chat/repositories/subscriber.repository.js.map +1 -1
  248. package/dist/chat/repositories/thread.repository.d.ts +1 -1
  249. package/dist/chat/repositories/thread.repository.js +1 -1
  250. package/dist/chat/repositories/thread.repository.js.map +1 -1
  251. package/dist/chat/services/chat.service.js +17 -7
  252. package/dist/chat/services/chat.service.js.map +1 -1
  253. package/dist/chat/services/message.service.d.ts +1 -2
  254. package/dist/chat/services/message.service.js.map +1 -1
  255. package/dist/chat/services/subscriber.service.d.ts +214 -8
  256. package/dist/chat/services/subscriber.service.js +11 -12
  257. package/dist/chat/services/subscriber.service.js.map +1 -1
  258. package/dist/chat/services/thread.service.d.ts +77 -9
  259. package/dist/chat/services/thread.service.js +54 -8
  260. package/dist/chat/services/thread.service.js.map +1 -1
  261. package/dist/cms/controllers/content-type.controller.d.ts +15 -2
  262. package/dist/cms/controllers/content-type.controller.js.map +1 -1
  263. package/dist/cms/controllers/content.controller.d.ts +62 -4
  264. package/dist/cms/controllers/content.controller.js.map +1 -1
  265. package/dist/cms/controllers/menu.controller.d.ts +22 -3
  266. package/dist/cms/controllers/menu.controller.js.map +1 -1
  267. package/dist/cms/dto/content.dto.d.ts +4 -16
  268. package/dist/cms/dto/content.dto.js +1 -47
  269. package/dist/cms/dto/content.dto.js.map +1 -1
  270. package/dist/cms/dto/contentType.dto.d.ts +4 -11
  271. package/dist/cms/dto/contentType.dto.js +1 -29
  272. package/dist/cms/dto/contentType.dto.js.map +1 -1
  273. package/dist/cms/dto/menu.dto.d.ts +4 -16
  274. package/dist/cms/dto/menu.dto.js +1 -51
  275. package/dist/cms/dto/menu.dto.js.map +1 -1
  276. package/dist/cms/entities/content-type.entity.d.ts +15 -3
  277. package/dist/cms/entities/content-type.entity.js +5 -3
  278. package/dist/cms/entities/content-type.entity.js.map +1 -1
  279. package/dist/cms/entities/content.entity.d.ts +37 -4
  280. package/dist/cms/entities/content.entity.js +5 -3
  281. package/dist/cms/entities/content.entity.js.map +1 -1
  282. package/dist/cms/entities/menu.entity.d.ts +67 -3
  283. package/dist/cms/entities/menu.entity.js +5 -3
  284. package/dist/cms/entities/menu.entity.js.map +1 -1
  285. package/dist/cms/enums/menu-type.enum.d.ts +1 -5
  286. package/dist/cms/enums/menu-type.enum.js +2 -6
  287. package/dist/cms/enums/menu-type.enum.js.map +1 -1
  288. package/dist/cms/repositories/content.repository.d.ts +1 -1
  289. package/dist/cms/repositories/content.repository.js.map +1 -1
  290. package/dist/cms/services/content-type.service.d.ts +1 -1
  291. package/dist/cms/services/content-type.service.js.map +1 -1
  292. package/dist/cms/services/content.service.d.ts +12 -6
  293. package/dist/cms/services/content.service.js.map +1 -1
  294. package/dist/cms/services/rag-indexer.service.js.map +1 -1
  295. package/dist/cms/types/menu-types.d.ts +1 -1
  296. package/dist/cms/utilities/verifyTree.js.map +1 -1
  297. package/dist/config/i18n/en/chatbot_settings.json +15 -15
  298. package/dist/config/i18n/en/contact.json +21 -21
  299. package/dist/config/i18n/en/messages.json +11 -11
  300. package/dist/config/i18n/en/rag_settings.json +19 -19
  301. package/dist/config/i18n/fr/chatbot_settings.json +15 -15
  302. package/dist/config/i18n/fr/contact.json +21 -21
  303. package/dist/config/i18n/fr/messages.json +11 -11
  304. package/dist/config/i18n/fr/rag_settings.json +19 -19
  305. package/dist/config/index.js +63 -0
  306. package/dist/config/index.js.map +1 -1
  307. package/dist/config/types.d.ts +22 -0
  308. package/dist/database/entities/base.entity.d.ts +3 -0
  309. package/dist/database/entities/base.entity.js +33 -7
  310. package/dist/database/entities/base.entity.js.map +1 -1
  311. package/dist/extension/cleanup.service.d.ts +2 -5
  312. package/dist/extension/cleanup.service.js +2 -12
  313. package/dist/extension/cleanup.service.js.map +1 -1
  314. package/dist/extension/types.d.ts +5 -6
  315. package/dist/extensions/actions/ai/ai-base.action.d.ts +1 -2
  316. package/dist/extensions/actions/ai/ai-base.action.js +15 -6
  317. package/dist/extensions/actions/ai/ai-base.action.js.map +1 -1
  318. package/dist/extensions/actions/ai/i18n/en.translations.json +164 -164
  319. package/dist/extensions/actions/ai/i18n/fr.translations.json +164 -164
  320. package/dist/extensions/actions/ai/model.binding.d.ts +2 -2
  321. package/dist/extensions/actions/ai/retrieve-content-rag.action.d.ts +9 -1
  322. package/dist/extensions/actions/memory/i18n/en.translations.json +3 -3
  323. package/dist/extensions/actions/memory/i18n/fr.translations.json +3 -3
  324. package/dist/extensions/actions/messaging/attachment.action.d.ts +3 -1
  325. package/dist/extensions/actions/messaging/attachment.action.js +4 -5
  326. package/dist/extensions/actions/messaging/attachment.action.js.map +1 -1
  327. package/dist/extensions/actions/messaging/await-reply.action.d.ts +100 -56
  328. package/dist/extensions/actions/messaging/buttons.action.d.ts +1 -1
  329. package/dist/extensions/actions/messaging/buttons.action.js +4 -4
  330. package/dist/extensions/actions/messaging/buttons.action.js.map +1 -1
  331. package/dist/extensions/actions/messaging/i18n/en.translations.json +174 -174
  332. package/dist/extensions/actions/messaging/i18n/fr.translations.json +174 -174
  333. package/dist/extensions/actions/messaging/list.action.d.ts +4 -4
  334. package/dist/extensions/actions/messaging/list.action.js +6 -8
  335. package/dist/extensions/actions/messaging/list.action.js.map +1 -1
  336. package/dist/extensions/actions/messaging/message-action.base.d.ts +243 -120
  337. package/dist/extensions/actions/messaging/message-action.base.js +10 -10
  338. package/dist/extensions/actions/messaging/message-action.base.js.map +1 -1
  339. package/dist/extensions/actions/messaging/quick-replies.action.js +2 -2
  340. package/dist/extensions/actions/messaging/quick-replies.action.js.map +1 -1
  341. package/dist/extensions/actions/subscriber/i18n/en.translations.json +14 -14
  342. package/dist/extensions/actions/subscriber/i18n/fr.translations.json +14 -14
  343. package/dist/extensions/actions/web/http-request.action.d.ts +9 -1
  344. package/dist/extensions/actions/web/i18n/en.translations.json +27 -27
  345. package/dist/extensions/actions/web/i18n/fr.translations.json +27 -27
  346. package/dist/extensions/channels/console/i18n/en.translations.json +22 -22
  347. package/dist/extensions/channels/console/i18n/fr.translations.json +22 -22
  348. package/dist/extensions/channels/console/index.channel.d.ts +1 -1
  349. package/dist/extensions/channels/console/index.channel.js +2 -2
  350. package/dist/extensions/channels/console/index.channel.js.map +1 -1
  351. package/dist/extensions/channels/console/settings.schema.d.ts +14 -0
  352. package/dist/extensions/channels/console/{console-channel.settings.js → settings.schema.js} +3 -16
  353. package/dist/extensions/channels/console/settings.schema.js.map +1 -0
  354. package/dist/extensions/channels/web/__test__/data.mock.js +16 -17
  355. package/dist/extensions/channels/web/__test__/data.mock.js.map +1 -1
  356. package/dist/extensions/channels/web/__test__/events.mock.js +21 -22
  357. package/dist/extensions/channels/web/__test__/events.mock.js.map +1 -1
  358. package/dist/extensions/channels/web/base-web-channel.d.ts +25 -42
  359. package/dist/extensions/channels/web/base-web-channel.js +204 -398
  360. package/dist/extensions/channels/web/base-web-channel.js.map +1 -1
  361. package/dist/extensions/channels/web/i18n/en.translations.json +26 -26
  362. package/dist/extensions/channels/web/i18n/fr.translations.json +26 -26
  363. package/dist/extensions/channels/web/inbound/events/delivery.event.d.ts +1 -1
  364. package/dist/extensions/channels/web/inbound/events/delivery.event.js +2 -2
  365. package/dist/extensions/channels/web/inbound/events/delivery.event.js.map +1 -1
  366. package/dist/extensions/channels/web/inbound/events/messages/attachment.event.d.ts +2 -4
  367. package/dist/extensions/channels/web/inbound/events/messages/attachment.event.js +11 -10
  368. package/dist/extensions/channels/web/inbound/events/messages/attachment.event.js.map +1 -1
  369. package/dist/extensions/channels/web/inbound/events/messages/location.event.d.ts +1 -2
  370. package/dist/extensions/channels/web/inbound/events/messages/location.event.js +9 -8
  371. package/dist/extensions/channels/web/inbound/events/messages/location.event.js.map +1 -1
  372. package/dist/extensions/channels/web/inbound/events/messages/payload.event.d.ts +2 -3
  373. package/dist/extensions/channels/web/inbound/events/messages/payload.event.js +5 -2
  374. package/dist/extensions/channels/web/inbound/events/messages/payload.event.js.map +1 -1
  375. package/dist/extensions/channels/web/inbound/events/messages/postback.event.js +2 -2
  376. package/dist/extensions/channels/web/inbound/events/messages/postback.event.js.map +1 -1
  377. package/dist/extensions/channels/web/inbound/events/messages/quick-reply.event.js +2 -2
  378. package/dist/extensions/channels/web/inbound/events/messages/quick-reply.event.js.map +1 -1
  379. package/dist/extensions/channels/web/inbound/events/messages/text.event.d.ts +1 -1
  380. package/dist/extensions/channels/web/inbound/events/messages/text.event.js +6 -3
  381. package/dist/extensions/channels/web/inbound/events/messages/text.event.js.map +1 -1
  382. package/dist/extensions/channels/web/inbound/events/read.event.d.ts +1 -1
  383. package/dist/extensions/channels/web/inbound/events/read.event.js +2 -2
  384. package/dist/extensions/channels/web/inbound/events/read.event.js.map +1 -1
  385. package/dist/extensions/channels/web/inbound/events/typing.event.d.ts +1 -1
  386. package/dist/extensions/channels/web/inbound/events/typing.event.js +2 -2
  387. package/dist/extensions/channels/web/inbound/events/typing.event.js.map +1 -1
  388. package/dist/extensions/channels/web/inbound/events/unsupported.event.d.ts +1 -1
  389. package/dist/extensions/channels/web/inbound/events/unsupported.event.js +2 -2
  390. package/dist/extensions/channels/web/inbound/events/unsupported.event.js.map +1 -1
  391. package/dist/extensions/channels/web/inbound/index.d.ts +1 -0
  392. package/dist/extensions/channels/web/inbound/index.js +1 -0
  393. package/dist/extensions/channels/web/inbound/index.js.map +1 -1
  394. package/dist/extensions/channels/web/inbound/web-inbound-message-encoder.d.ts +11 -0
  395. package/dist/extensions/channels/web/inbound/web-inbound-message-encoder.js +80 -0
  396. package/dist/extensions/channels/web/inbound/web-inbound-message-encoder.js.map +1 -0
  397. package/dist/extensions/channels/web/index.channel.d.ts +1 -1
  398. package/dist/extensions/channels/web/index.channel.js +2 -2
  399. package/dist/extensions/channels/web/index.channel.js.map +1 -1
  400. package/dist/extensions/channels/web/outbound/web-outbound-message-encoder.d.ts +15 -16
  401. package/dist/extensions/channels/web/outbound/web-outbound-message-encoder.js +26 -25
  402. package/dist/extensions/channels/web/outbound/web-outbound-message-encoder.js.map +1 -1
  403. package/dist/extensions/channels/web/services/web-history.service.d.ts +22 -0
  404. package/dist/extensions/channels/web/services/web-history.service.js +81 -0
  405. package/dist/extensions/channels/web/services/web-history.service.js.map +1 -0
  406. package/dist/extensions/channels/web/services/web-session.service.d.ts +22 -0
  407. package/dist/extensions/channels/web/services/web-session.service.js +146 -0
  408. package/dist/extensions/channels/web/services/web-session.service.js.map +1 -0
  409. package/dist/extensions/channels/web/settings.schema.d.ts +16 -0
  410. package/dist/extensions/channels/web/{web-channel.settings.js → settings.schema.js} +3 -16
  411. package/dist/extensions/channels/web/settings.schema.js.map +1 -0
  412. package/dist/extensions/channels/web/types.d.ts +2 -4
  413. package/dist/extensions/channels/web/types.js +2 -2
  414. package/dist/extensions/channels/web/types.js.map +1 -1
  415. package/dist/extensions/helpers/local-storage/i18n/en.translations.json +4 -4
  416. package/dist/extensions/helpers/local-storage/i18n/fr.translations.json +4 -4
  417. package/dist/extensions/helpers/local-storage/index.helper.d.ts +2 -1
  418. package/dist/extensions/helpers/local-storage/index.helper.js.map +1 -1
  419. package/dist/extensions/index.d.ts +2 -2
  420. package/dist/extensions/index.js +2 -2
  421. package/dist/extensions/index.js.map +1 -1
  422. package/dist/health/health.service.d.ts +18 -0
  423. package/dist/health/health.service.js +190 -0
  424. package/dist/health/health.service.js.map +1 -0
  425. package/dist/helper/lib/base-llm-helper.d.ts +1 -1
  426. package/dist/helper/lib/base-storage-helper.d.ts +2 -1
  427. package/dist/i18n/controllers/language.controller.d.ts +11 -2
  428. package/dist/i18n/controllers/language.controller.js.map +1 -1
  429. package/dist/i18n/controllers/translation.controller.d.ts +21 -3
  430. package/dist/i18n/dto/language.dto.d.ts +4 -11
  431. package/dist/i18n/dto/language.dto.js +1 -31
  432. package/dist/i18n/dto/language.dto.js.map +1 -1
  433. package/dist/i18n/dto/translation.dto.d.ts +4 -9
  434. package/dist/i18n/dto/translation.dto.js +1 -23
  435. package/dist/i18n/dto/translation.dto.js.map +1 -1
  436. package/dist/i18n/entities/language.entity.d.ts +19 -3
  437. package/dist/i18n/entities/language.entity.js +5 -3
  438. package/dist/i18n/entities/language.entity.js.map +1 -1
  439. package/dist/i18n/entities/translation.entity.d.ts +15 -3
  440. package/dist/i18n/entities/translation.entity.js +5 -3
  441. package/dist/i18n/entities/translation.entity.js.map +1 -1
  442. package/dist/i18n/services/language.service.d.ts +18 -2
  443. package/dist/index.d.ts +1 -0
  444. package/dist/index.js +1 -0
  445. package/dist/index.js.map +1 -1
  446. package/dist/seeder.js +1 -1
  447. package/dist/seeder.js.map +1 -1
  448. package/dist/setting/controllers/setting.controller.d.ts +11 -2
  449. package/dist/setting/controllers/setting.controller.js.map +1 -1
  450. package/dist/setting/dto/metadata.dto.d.ts +4 -9
  451. package/dist/setting/dto/metadata.dto.js +1 -23
  452. package/dist/setting/dto/metadata.dto.js.map +1 -1
  453. package/dist/setting/dto/setting.dto.d.ts +4 -11
  454. package/dist/setting/dto/setting.dto.js +1 -31
  455. package/dist/setting/dto/setting.dto.js.map +1 -1
  456. package/dist/setting/entities/metadata.entity.d.ts +15 -3
  457. package/dist/setting/entities/metadata.entity.js +5 -3
  458. package/dist/setting/entities/metadata.entity.js.map +1 -1
  459. package/dist/setting/entities/setting.entity.d.ts +19 -3
  460. package/dist/setting/entities/setting.entity.js +5 -3
  461. package/dist/setting/entities/setting.entity.js.map +1 -1
  462. package/dist/setting/runtime-settings.d.ts +1 -1
  463. package/dist/setting/runtime-settings.js.map +1 -1
  464. package/dist/setting/runtime-settings.seed.d.ts +1 -1
  465. package/dist/setting/runtime-settings.seed.js +1 -3
  466. package/dist/setting/runtime-settings.seed.js.map +1 -1
  467. package/dist/setting/services/metadata.service.d.ts +2 -1
  468. package/dist/setting/services/metadata.service.js.map +1 -1
  469. package/dist/setting/services/setting.service.d.ts +2 -1
  470. package/dist/setting/services/setting.service.js.map +1 -1
  471. package/dist/setting/setting.module.js.map +1 -1
  472. package/dist/setting/types/index.d.ts +2 -9
  473. package/dist/setting/types/index.js +2 -9
  474. package/dist/setting/types/index.js.map +1 -1
  475. package/dist/static/assets/{cssMode-EfTI32jH.js → cssMode-B4TecieE.js} +1 -1
  476. package/dist/static/assets/{freemarker2-Bp36bqQu.js → freemarker2-BVMU7I_j.js} +1 -1
  477. package/dist/static/assets/{handlebars-DFcsacT2.js → handlebars-BHhJ0REg.js} +1 -1
  478. package/dist/static/assets/{html-DoteNmPg.js → html-C0xYW7UH.js} +1 -1
  479. package/dist/static/assets/{htmlMode-D4qDYA_c.js → htmlMode-DKBoSSUf.js} +1 -1
  480. package/dist/static/assets/{index-B0zbJ-Gv.css → index-3E05C6mQ.css} +1 -1
  481. package/dist/static/assets/{index-Da34FzWk.js → index-Q16skETC.js} +2165 -2165
  482. package/dist/static/assets/{javascript-hq-XZ18j.js → javascript-BmG42Qtz.js} +1 -1
  483. package/dist/static/assets/{jsonMode-gxldbTjQ.js → jsonMode-COpdryGy.js} +1 -1
  484. package/dist/static/assets/{liquid-VombxSUL.js → liquid-t7wU_We6.js} +1 -1
  485. package/dist/static/assets/{lspLanguageFeatures-DjxTnuCT.js → lspLanguageFeatures-nYoOHLBU.js} +1 -1
  486. package/dist/static/assets/{mdx-Bv744ltm.js → mdx-CXAOQEUW.js} +1 -1
  487. package/dist/static/assets/{python-BB7rtHwG.js → python-CnD9oLZg.js} +1 -1
  488. package/dist/static/assets/{razor-BoLELWC9.js → razor-D1-qfmFa.js} +1 -1
  489. package/dist/static/assets/{tsMode-DLSApW05.js → tsMode-Dm0heYbf.js} +1 -1
  490. package/dist/static/assets/{typescript-qlBdudA6.js → typescript-DSKhH6ZE.js} +1 -1
  491. package/dist/static/assets/{xml-DMdTu6Mm.js → xml-CzpJrCkR.js} +1 -1
  492. package/dist/static/assets/{yaml-C9JqXvOt.js → yaml-Bby4uDCt.js} +1 -1
  493. package/dist/static/index.html +2 -2
  494. package/dist/static/locales/en/translation.json +141 -2
  495. package/dist/static/locales/fr/translation.json +141 -2
  496. package/dist/tsconfig.build.tsbuildinfo +1 -1
  497. package/dist/types/express-session.d.ts +1 -0
  498. package/dist/user/controllers/auth.controller.js +3 -0
  499. package/dist/user/controllers/auth.controller.js.map +1 -1
  500. package/dist/user/controllers/credential.controller.d.ts +2 -1
  501. package/dist/user/controllers/credential.controller.js.map +1 -1
  502. package/dist/user/controllers/model.controller.d.ts +26 -1
  503. package/dist/user/controllers/permission.controller.d.ts +40 -2
  504. package/dist/user/controllers/role.controller.d.ts +128 -4
  505. package/dist/user/controllers/role.controller.js.map +1 -1
  506. package/dist/user/controllers/user.controller.d.ts +374 -8
  507. package/dist/user/dto/credential.dto.d.ts +4 -13
  508. package/dist/user/dto/credential.dto.js +1 -35
  509. package/dist/user/dto/credential.dto.js.map +1 -1
  510. package/dist/user/dto/model.dto.d.ts +4 -15
  511. package/dist/user/dto/model.dto.js +1 -43
  512. package/dist/user/dto/model.dto.js.map +1 -1
  513. package/dist/user/dto/permission.dto.d.ts +4 -17
  514. package/dist/user/dto/permission.dto.js +1 -49
  515. package/dist/user/dto/permission.dto.js.map +1 -1
  516. package/dist/user/dto/role.dto.d.ts +4 -18
  517. package/dist/user/dto/role.dto.js +1 -53
  518. package/dist/user/dto/role.dto.js.map +1 -1
  519. package/dist/user/dto/user-profile.dto.d.ts +4 -9
  520. package/dist/user/dto/user-profile.dto.js +1 -29
  521. package/dist/user/dto/user-profile.dto.js.map +1 -1
  522. package/dist/user/dto/user.dto.d.ts +5 -38
  523. package/dist/user/dto/user.dto.js +1 -125
  524. package/dist/user/dto/user.dto.js.map +1 -1
  525. package/dist/user/entities/credential.entity.d.ts +87 -3
  526. package/dist/user/entities/credential.entity.js +5 -3
  527. package/dist/user/entities/credential.entity.js.map +1 -1
  528. package/dist/user/entities/model.entity.d.ts +98 -3
  529. package/dist/user/entities/model.entity.js +5 -3
  530. package/dist/user/entities/model.entity.js.map +1 -1
  531. package/dist/user/entities/permission.entity.d.ts +75 -3
  532. package/dist/user/entities/permission.entity.js +3 -3
  533. package/dist/user/entities/permission.entity.js.map +1 -1
  534. package/dist/user/entities/role.entity.d.ts +100 -3
  535. package/dist/user/entities/role.entity.js +5 -3
  536. package/dist/user/entities/role.entity.js.map +1 -1
  537. package/dist/user/entities/user-profile.entity.d.ts +5 -5
  538. package/dist/user/entities/user-profile.entity.js +3 -3
  539. package/dist/user/entities/user-profile.entity.js.map +1 -1
  540. package/dist/user/entities/user.entity.d.ts +234 -4
  541. package/dist/user/entities/user.entity.js +5 -3
  542. package/dist/user/entities/user.entity.js.map +1 -1
  543. package/dist/user/guards/ability.guard.js.map +1 -1
  544. package/dist/user/guards/local-auth.guard.d.ts +9 -0
  545. package/dist/user/guards/local-auth.guard.js +84 -4
  546. package/dist/user/guards/local-auth.guard.js.map +1 -1
  547. package/dist/user/passport/session.serializer.d.ts +1 -1
  548. package/dist/user/passport/session.serializer.js.map +1 -1
  549. package/dist/user/repositories/credential.repository.js.map +1 -1
  550. package/dist/user/seeds/model.seed-model.js +10 -0
  551. package/dist/user/seeds/model.seed-model.js.map +1 -1
  552. package/dist/user/services/auth.service.d.ts +34 -2
  553. package/dist/user/services/auth.service.js.map +1 -1
  554. package/dist/user/services/permission.service.d.ts +1 -1
  555. package/dist/user/services/permission.service.js.map +1 -1
  556. package/dist/user/types/action.type.d.ts +1 -12
  557. package/dist/user/types/action.type.js +3 -14
  558. package/dist/user/types/action.type.js.map +1 -1
  559. package/dist/user/types/index.type.d.ts +1 -1
  560. package/dist/user/types/model.type.d.ts +1 -1
  561. package/dist/user/types/permission.type.d.ts +1 -5
  562. package/dist/user/types/user-provider.type.d.ts +1 -4
  563. package/dist/utils/test/dummy/dto/dummy.dto.d.ts +4 -9
  564. package/dist/utils/test/dummy/dto/dummy.dto.js +1 -22
  565. package/dist/utils/test/dummy/dto/dummy.dto.js.map +1 -1
  566. package/dist/utils/test/dummy/dummy.action.d.ts +9 -1
  567. package/dist/utils/test/dummy/entities/dummy.entity.d.ts +15 -3
  568. package/dist/utils/test/dummy/entities/dummy.entity.js +3 -3
  569. package/dist/utils/test/dummy/entities/dummy.entity.js.map +1 -1
  570. package/dist/utils/test/fixtures/content.d.ts +12 -2
  571. package/dist/utils/test/fixtures/content.js.map +1 -1
  572. package/dist/utils/test/fixtures/contenttype.d.ts +9 -2
  573. package/dist/utils/test/fixtures/contenttype.js.map +1 -1
  574. package/dist/utils/test/fixtures/label-group.d.ts +14 -2
  575. package/dist/utils/test/fixtures/label-group.js.map +1 -1
  576. package/dist/utils/test/fixtures/label.d.ts +14 -2
  577. package/dist/utils/test/fixtures/label.js.map +1 -1
  578. package/dist/utils/test/fixtures/message.d.ts +162 -2
  579. package/dist/utils/test/fixtures/message.js +61 -3
  580. package/dist/utils/test/fixtures/message.js.map +1 -1
  581. package/dist/utils/test/fixtures/setting.js +0 -7
  582. package/dist/utils/test/fixtures/setting.js.map +1 -1
  583. package/dist/utils/test/fixtures/subscriber.d.ts +27 -3
  584. package/dist/utils/test/fixtures/subscriber.js +37 -2
  585. package/dist/utils/test/fixtures/subscriber.js.map +1 -1
  586. package/dist/utils/test/fixtures/user.d.ts +2 -1
  587. package/dist/utils/test/fixtures/user.js.map +1 -1
  588. package/dist/utils/test/mocks/subscriber.d.ts +1 -1
  589. package/dist/utils/test/mocks/subscriber.js +11 -0
  590. package/dist/utils/test/mocks/subscriber.js.map +1 -1
  591. package/dist/utils/types/dto.types.d.ts +8 -12
  592. package/dist/utils/types/dto.types.js +1 -39
  593. package/dist/utils/types/dto.types.js.map +1 -1
  594. package/dist/websocket/services/socket-event-dispatcher.service.d.ts +4 -1
  595. package/dist/websocket/services/socket-event-dispatcher.service.js +62 -5
  596. package/dist/websocket/services/socket-event-dispatcher.service.js.map +1 -1
  597. package/dist/websocket/utils/socket-request.d.ts +2 -1
  598. package/dist/websocket/utils/socket-request.js +1 -0
  599. package/dist/websocket/utils/socket-request.js.map +1 -1
  600. package/dist/websocket/websocket.gateway.d.ts +6 -3
  601. package/dist/websocket/websocket.gateway.js +63 -4
  602. package/dist/websocket/websocket.gateway.js.map +1 -1
  603. package/dist/workflow/contexts/workflow-context-factory.d.ts +1 -1
  604. package/dist/workflow/contexts/workflow-context-factory.js +5 -1
  605. package/dist/workflow/contexts/workflow-context-factory.js.map +1 -1
  606. package/dist/workflow/contexts/workflow-runtime.context.d.ts +1 -1
  607. package/dist/workflow/contexts/workflow-runtime.context.js +5 -1
  608. package/dist/workflow/contexts/workflow-runtime.context.js.map +1 -1
  609. package/dist/workflow/controllers/mcp-server.controller.d.ts +2 -1
  610. package/dist/workflow/controllers/mcp-server.controller.js.map +1 -1
  611. package/dist/workflow/controllers/memory-definition.controller.d.ts +12 -2
  612. package/dist/workflow/controllers/memory-definition.controller.js.map +1 -1
  613. package/dist/workflow/controllers/workflow-run.controller.d.ts +1 -1
  614. package/dist/workflow/controllers/workflow-run.controller.js.map +1 -1
  615. package/dist/workflow/controllers/workflow-version.controller.d.ts +179 -3
  616. package/dist/workflow/controllers/workflow-version.controller.js.map +1 -1
  617. package/dist/workflow/controllers/workflow.controller.d.ts +97 -2
  618. package/dist/workflow/controllers/workflow.controller.js +6 -1
  619. package/dist/workflow/controllers/workflow.controller.js.map +1 -1
  620. package/dist/workflow/dto/mcp-server.dto.d.ts +4 -19
  621. package/dist/workflow/dto/mcp-server.dto.js +1 -60
  622. package/dist/workflow/dto/mcp-server.dto.js.map +1 -1
  623. package/dist/workflow/dto/memory-definition.dto.d.ts +4 -14
  624. package/dist/workflow/dto/memory-definition.dto.js +1 -41
  625. package/dist/workflow/dto/memory-definition.dto.js.map +1 -1
  626. package/dist/workflow/dto/memory-record.dto.d.ts +4 -28
  627. package/dist/workflow/dto/memory-record.dto.js +1 -86
  628. package/dist/workflow/dto/memory-record.dto.js.map +1 -1
  629. package/dist/workflow/dto/workflow-run.dto.d.ts +5 -44
  630. package/dist/workflow/dto/workflow-run.dto.js +4 -149
  631. package/dist/workflow/dto/workflow-run.dto.js.map +1 -1
  632. package/dist/workflow/dto/workflow-version.dto.d.ts +4 -22
  633. package/dist/workflow/dto/workflow-version.dto.js +1 -70
  634. package/dist/workflow/dto/workflow-version.dto.js.map +1 -1
  635. package/dist/workflow/dto/workflow.dto.d.ts +153 -26
  636. package/dist/workflow/dto/workflow.dto.js +10 -121
  637. package/dist/workflow/dto/workflow.dto.js.map +1 -1
  638. package/dist/workflow/entities/mcp-server.entity.d.ts +51 -3
  639. package/dist/workflow/entities/mcp-server.entity.js +10 -8
  640. package/dist/workflow/entities/mcp-server.entity.js.map +1 -1
  641. package/dist/workflow/entities/memory-definition.entity.d.ts +21 -3
  642. package/dist/workflow/entities/memory-definition.entity.js +7 -5
  643. package/dist/workflow/entities/memory-definition.entity.js.map +1 -1
  644. package/dist/workflow/entities/memory-record.entity.d.ts +272 -3
  645. package/dist/workflow/entities/memory-record.entity.js +3 -3
  646. package/dist/workflow/entities/memory-record.entity.js.map +1 -1
  647. package/dist/workflow/entities/workflow-run.entity.d.ts +308 -5
  648. package/dist/workflow/entities/workflow-run.entity.js +9 -12
  649. package/dist/workflow/entities/workflow-run.entity.js.map +1 -1
  650. package/dist/workflow/entities/workflow-version.entity.d.ts +165 -3
  651. package/dist/workflow/entities/workflow-version.entity.js +5 -5
  652. package/dist/workflow/entities/workflow-version.entity.js.map +1 -1
  653. package/dist/workflow/entities/workflow.entity.d.ts +192 -4
  654. package/dist/workflow/entities/workflow.entity.js +12 -9
  655. package/dist/workflow/entities/workflow.entity.js.map +1 -1
  656. package/dist/workflow/lib/trigger-event-wrapper.d.ts +1 -2
  657. package/dist/workflow/schemas/workflow-input-schemas.d.ts +52 -30
  658. package/dist/workflow/schemas/workflow-input-schemas.js +4 -5
  659. package/dist/workflow/schemas/workflow-input-schemas.js.map +1 -1
  660. package/dist/workflow/services/agentic.service.js.map +1 -1
  661. package/dist/workflow/services/mcp-client-pool.service.js.map +1 -1
  662. package/dist/workflow/services/memory-definition.service.d.ts +1 -1
  663. package/dist/workflow/services/memory-definition.service.js.map +1 -1
  664. package/dist/workflow/services/memory-record.service.d.ts +1 -2
  665. package/dist/workflow/services/memory-record.service.js.map +1 -1
  666. package/dist/workflow/services/workflow-run.service.d.ts +1 -1
  667. package/dist/workflow/services/workflow-run.service.js.map +1 -1
  668. package/dist/workflow/services/workflow-version.service.d.ts +16 -2
  669. package/dist/workflow/services/workflow-version.service.js.map +1 -1
  670. package/dist/workflow/services/workflow.service.d.ts +2 -1
  671. package/dist/workflow/services/workflow.service.js.map +1 -1
  672. package/dist/workflow/types.d.ts +2 -28
  673. package/dist/workflow/types.js +7 -31
  674. package/dist/workflow/types.js.map +1 -1
  675. package/dist/workflow/utils/memory-store.d.ts +1 -2
  676. package/dist/workflow/utils/memory-store.js.map +1 -1
  677. package/package.json +8 -5
  678. package/src/analytics/controllers/stats.controller.ts +38 -1
  679. package/src/analytics/dto/stats.dto.ts +27 -26
  680. package/src/analytics/entities/stats.entity.ts +4 -3
  681. package/src/analytics/enums/stats-type.enum.ts +1 -9
  682. package/src/analytics/repositories/stats.repository.ts +1 -1
  683. package/src/analytics/services/stats.service.ts +125 -9
  684. package/src/app.controller.ts +5 -0
  685. package/src/app.module.ts +4 -0
  686. package/src/app.service.ts +7 -0
  687. package/src/attachment/attachment.module.ts +5 -2
  688. package/src/attachment/controllers/attachment.controller.ts +1 -2
  689. package/src/attachment/dto/attachment.dto.ts +5 -51
  690. package/src/attachment/entities/attachment.entity.ts +12 -13
  691. package/src/attachment/guards/attachment-ability.guard.ts +1 -1
  692. package/src/attachment/mocks/attachment.mock.ts +10 -5
  693. package/src/attachment/services/attachment.service.ts +2 -5
  694. package/src/attachment/types/index.ts +5 -25
  695. package/src/audit/README.md +559 -0
  696. package/src/audit/audit-core.module.ts +33 -0
  697. package/src/audit/audit.module.ts +63 -0
  698. package/src/audit/controllers/audit-log.controller.ts +77 -0
  699. package/src/audit/decorators/audit-label.decorator.ts +37 -0
  700. package/src/audit/decorators/audit-log.decorators.ts +35 -0
  701. package/src/audit/dto/audit-log.dto.ts +125 -0
  702. package/src/audit/entities/audit-log.entity.ts +78 -0
  703. package/src/audit/exporters/audit-backend.factory.ts +74 -0
  704. package/src/audit/exporters/audit-database.exporter.ts +93 -0
  705. package/src/audit/exporters/audit-noop.exporter.ts +29 -0
  706. package/src/audit/exporters/audit-safe.exporter.ts +53 -0
  707. package/src/audit/index.ts +23 -0
  708. package/src/audit/interceptors/audit-context.interceptor.ts +30 -0
  709. package/src/audit/repositories/audit-log.repository.ts +23 -0
  710. package/src/audit/services/audit-context.service.ts +123 -0
  711. package/src/audit/services/audit-log-record.service.ts +97 -0
  712. package/src/audit/subscribers/audit-log.subscriber.ts +322 -0
  713. package/src/audit/types/audit-context.type.ts +20 -0
  714. package/src/audit/utils/request-context.ts +44 -0
  715. package/src/channel/README.md +313 -0
  716. package/src/channel/channel.controller.ts +19 -3
  717. package/src/channel/channel.module.ts +22 -3
  718. package/src/channel/channel.service.ts +108 -119
  719. package/src/channel/dto/source.dto.ts +72 -0
  720. package/src/channel/entities/source.entity.ts +56 -0
  721. package/src/channel/index.ts +24 -0
  722. package/src/channel/lib/Handler.ts +102 -27
  723. package/src/channel/lib/__test__/common.mock.ts +18 -17
  724. package/src/channel/lib/__test__/label.mock.ts +1 -1
  725. package/src/channel/lib/__test__/subscriber.mock.ts +2 -1
  726. package/src/channel/lib/channel-capabilities.ts +37 -0
  727. package/src/channel/lib/channel-codec.ts +48 -0
  728. package/src/channel/lib/channel-event-bus.ts +70 -0
  729. package/src/channel/lib/extension-inject.decorator.ts +67 -0
  730. package/src/channel/lib/inbound-events/channel-inbound-event-context.ts +18 -0
  731. package/src/channel/lib/inbound-events/channel-inbound-event.ts +39 -2
  732. package/src/channel/lib/inbound-events/message-inbound-event.ts +11 -6
  733. package/src/channel/lib/inbound-events/synthetic-message-inbound-event.ts +31 -27
  734. package/src/channel/lib/outbound/channel-outbound-encoder.ts +51 -86
  735. package/src/channel/lib/transports/http-channel-handler.ts +187 -0
  736. package/src/channel/lib/transports/index.ts +9 -0
  737. package/src/channel/lib/transports/websocket-channel-handler.ts +142 -0
  738. package/src/channel/repositories/source.repository.ts +23 -0
  739. package/src/channel/services/channel-attachment.service.ts +29 -19
  740. package/src/channel/services/channel-download.service.ts +5 -2
  741. package/src/channel/services/channel-registry.service.ts +41 -0
  742. package/src/channel/services/source.service.ts +224 -0
  743. package/src/channel/services/subscriber-resolver.service.ts +85 -0
  744. package/src/channel/source.controller.ts +87 -0
  745. package/src/channel/types.ts +14 -8
  746. package/src/channel/webhook.controller.ts +34 -77
  747. package/src/chat/controllers/label-group.controller.ts +1 -2
  748. package/src/chat/controllers/label.controller.ts +2 -6
  749. package/src/chat/controllers/message.controller.ts +27 -22
  750. package/src/chat/controllers/subscriber.controller.ts +3 -5
  751. package/src/chat/controllers/thread.controller.ts +18 -7
  752. package/src/chat/dto/label-group.dto.ts +4 -25
  753. package/src/chat/dto/label.dto.ts +4 -47
  754. package/src/chat/dto/message.dto.ts +19 -68
  755. package/src/chat/dto/subscriber.dto.ts +13 -66
  756. package/src/chat/dto/thread.dto.ts +15 -42
  757. package/src/chat/entities/label-group.entity.ts +6 -7
  758. package/src/chat/entities/label.entity.ts +6 -3
  759. package/src/chat/entities/message.entity.ts +9 -4
  760. package/src/chat/entities/subscriber.entity.ts +31 -11
  761. package/src/chat/entities/thread.entity.ts +18 -3
  762. package/src/chat/helpers/README.md +7 -7
  763. package/src/chat/helpers/envelope-builder.ts +52 -58
  764. package/src/chat/helpers/envelope-factory.ts +23 -22
  765. package/src/chat/index.ts +0 -10
  766. package/src/chat/repositories/message.repository.ts +1 -2
  767. package/src/chat/repositories/subscriber.repository.ts +27 -18
  768. package/src/chat/repositories/thread.repository.ts +2 -2
  769. package/src/chat/services/chat.service.ts +26 -7
  770. package/src/chat/services/message.service.ts +1 -2
  771. package/src/chat/services/subscriber.service.ts +30 -11
  772. package/src/chat/services/thread.service.ts +95 -7
  773. package/src/cms/controllers/content-type.controller.ts +1 -1
  774. package/src/cms/controllers/content.controller.ts +2 -5
  775. package/src/cms/controllers/menu.controller.ts +2 -1
  776. package/src/cms/dto/content.dto.ts +4 -34
  777. package/src/cms/dto/contentType.dto.ts +4 -19
  778. package/src/cms/dto/menu.dto.ts +4 -36
  779. package/src/cms/entities/content-type.entity.ts +6 -7
  780. package/src/cms/entities/content.entity.ts +11 -4
  781. package/src/cms/entities/menu.entity.ts +6 -3
  782. package/src/cms/enums/menu-type.enum.ts +1 -5
  783. package/src/cms/repositories/content.repository.ts +1 -1
  784. package/src/cms/services/content-type.service.ts +1 -1
  785. package/src/cms/services/content.service.ts +8 -5
  786. package/src/cms/services/rag-indexer.service.ts +1 -2
  787. package/src/cms/types/menu-types.ts +2 -1
  788. package/src/cms/utilities/verifyTree.ts +2 -1
  789. package/src/config/index.ts +81 -0
  790. package/src/config/types.ts +26 -0
  791. package/src/database/entities/base.entity.ts +54 -7
  792. package/src/extension/cleanup.service.ts +2 -17
  793. package/src/extension/types.ts +5 -8
  794. package/src/extensions/actions/ai/ai-base.action.ts +25 -10
  795. package/src/extensions/actions/messaging/attachment.action.ts +5 -2
  796. package/src/extensions/actions/messaging/buttons.action.ts +1 -1
  797. package/src/extensions/actions/messaging/list.action.ts +9 -6
  798. package/src/extensions/actions/messaging/message-action.base.ts +15 -15
  799. package/src/extensions/actions/messaging/quick-replies.action.ts +1 -1
  800. package/src/extensions/channels/console/globals.d.ts +5 -3
  801. package/src/extensions/channels/console/index.channel.ts +5 -2
  802. package/src/extensions/channels/console/{console-channel.settings.ts → settings.schema.ts} +1 -28
  803. package/src/extensions/channels/web/__test__/data.mock.ts +2 -2
  804. package/src/extensions/channels/web/__test__/events.mock.ts +6 -7
  805. package/src/extensions/channels/web/base-web-channel.ts +294 -655
  806. package/src/extensions/channels/web/globals.d.ts +5 -3
  807. package/src/extensions/channels/web/inbound/events/delivery.event.ts +2 -1
  808. package/src/extensions/channels/web/inbound/events/messages/attachment.event.ts +19 -13
  809. package/src/extensions/channels/web/inbound/events/messages/location.event.ts +13 -7
  810. package/src/extensions/channels/web/inbound/events/messages/payload.event.ts +12 -5
  811. package/src/extensions/channels/web/inbound/events/messages/postback.event.ts +2 -1
  812. package/src/extensions/channels/web/inbound/events/messages/quick-reply.event.ts +3 -2
  813. package/src/extensions/channels/web/inbound/events/messages/text.event.ts +7 -3
  814. package/src/extensions/channels/web/inbound/events/read.event.ts +2 -1
  815. package/src/extensions/channels/web/inbound/events/typing.event.ts +2 -1
  816. package/src/extensions/channels/web/inbound/events/unsupported.event.ts +2 -1
  817. package/src/extensions/channels/web/inbound/index.ts +2 -0
  818. package/src/extensions/channels/web/inbound/web-inbound-message-encoder.ts +92 -0
  819. package/src/extensions/channels/web/index.channel.ts +5 -2
  820. package/src/extensions/channels/web/outbound/web-outbound-message-encoder.ts +48 -43
  821. package/src/extensions/channels/web/services/web-history.service.ts +158 -0
  822. package/src/extensions/channels/web/services/web-session.service.ts +235 -0
  823. package/src/extensions/channels/web/{web-channel.settings.ts → settings.schema.ts} +1 -28
  824. package/src/extensions/channels/web/types.ts +8 -5
  825. package/src/extensions/helpers/local-storage/index.helper.ts +1 -1
  826. package/src/extensions/index.ts +2 -2
  827. package/src/health/health.service.ts +237 -0
  828. package/src/helper/lib/base-llm-helper.ts +1 -1
  829. package/src/helper/lib/base-storage-helper.ts +1 -1
  830. package/src/i18n/controllers/language.controller.ts +2 -5
  831. package/src/i18n/dto/language.dto.ts +4 -22
  832. package/src/i18n/dto/translation.dto.ts +4 -16
  833. package/src/i18n/entities/language.entity.ts +6 -3
  834. package/src/i18n/entities/translation.entity.ts +6 -3
  835. package/src/index.ts +2 -0
  836. package/src/seeder.ts +2 -2
  837. package/src/setting/controllers/setting.controller.ts +2 -1
  838. package/src/setting/dto/metadata.dto.ts +4 -16
  839. package/src/setting/dto/setting.dto.ts +4 -22
  840. package/src/setting/entities/metadata.entity.ts +6 -3
  841. package/src/setting/entities/setting.entity.ts +6 -3
  842. package/src/setting/globals.d.ts +0 -1
  843. package/src/setting/runtime-settings.seed.ts +2 -4
  844. package/src/setting/runtime-settings.ts +1 -5
  845. package/src/setting/services/metadata.service.ts +2 -1
  846. package/src/setting/services/setting.service.ts +2 -5
  847. package/src/setting/setting.module.ts +2 -1
  848. package/src/setting/types/index.ts +2 -9
  849. package/src/user/controllers/auth.controller.ts +3 -0
  850. package/src/user/controllers/credential.controller.ts +1 -2
  851. package/src/user/controllers/role.controller.ts +1 -1
  852. package/src/user/dto/credential.dto.ts +4 -25
  853. package/src/user/dto/model.dto.ts +4 -31
  854. package/src/user/dto/permission.dto.ts +4 -36
  855. package/src/user/dto/role.dto.ts +4 -39
  856. package/src/user/dto/user-profile.dto.ts +4 -19
  857. package/src/user/dto/user.dto.ts +8 -99
  858. package/src/user/entities/credential.entity.ts +6 -7
  859. package/src/user/entities/model.entity.ts +6 -3
  860. package/src/user/entities/permission.entity.ts +4 -7
  861. package/src/user/entities/role.entity.ts +6 -3
  862. package/src/user/entities/user-profile.entity.ts +8 -5
  863. package/src/user/entities/user.entity.ts +7 -4
  864. package/src/user/guards/ability.guard.ts +1 -1
  865. package/src/user/guards/local-auth.guard.ts +100 -5
  866. package/src/user/passport/session.serializer.ts +1 -1
  867. package/src/user/repositories/credential.repository.ts +0 -6
  868. package/src/user/seeds/model.seed-model.ts +10 -0
  869. package/src/user/services/auth.service.ts +1 -1
  870. package/src/user/services/permission.service.ts +1 -1
  871. package/src/user/types/action.type.ts +1 -13
  872. package/src/user/types/index.type.ts +1 -1
  873. package/src/user/types/model.type.ts +1 -29
  874. package/src/user/types/permission.type.ts +4 -6
  875. package/src/user/types/user-provider.type.ts +1 -4
  876. package/src/utils/test/dummy/dto/dummy.dto.ts +4 -16
  877. package/src/utils/test/dummy/entities/dummy.entity.ts +4 -3
  878. package/src/utils/test/fixtures/content.ts +2 -1
  879. package/src/utils/test/fixtures/contenttype.ts +2 -1
  880. package/src/utils/test/fixtures/label-group.ts +2 -1
  881. package/src/utils/test/fixtures/label.ts +2 -1
  882. package/src/utils/test/fixtures/message.ts +78 -4
  883. package/src/utils/test/fixtures/setting.ts +0 -7
  884. package/src/utils/test/fixtures/subscriber.ts +51 -2
  885. package/src/utils/test/fixtures/user.ts +2 -1
  886. package/src/utils/test/mocks/subscriber.ts +13 -1
  887. package/src/utils/types/dto.types.ts +12 -26
  888. package/src/websocket/services/socket-event-dispatcher.service.ts +90 -6
  889. package/src/websocket/utils/socket-request.ts +4 -1
  890. package/src/websocket/websocket.gateway.ts +84 -5
  891. package/src/workflow/contexts/workflow-context-factory.ts +6 -2
  892. package/src/workflow/contexts/workflow-runtime.context.ts +6 -2
  893. package/src/workflow/controllers/mcp-server.controller.ts +2 -6
  894. package/src/workflow/controllers/memory-definition.controller.ts +1 -1
  895. package/src/workflow/controllers/workflow-run.controller.ts +1 -1
  896. package/src/workflow/controllers/workflow-version.controller.ts +1 -1
  897. package/src/workflow/controllers/workflow.controller.ts +9 -7
  898. package/src/workflow/dto/mcp-server.dto.ts +4 -43
  899. package/src/workflow/dto/memory-definition.dto.ts +7 -28
  900. package/src/workflow/dto/memory-record.dto.ts +5 -69
  901. package/src/workflow/dto/workflow-run.dto.ts +9 -120
  902. package/src/workflow/dto/workflow-version.dto.ts +7 -52
  903. package/src/workflow/dto/workflow.dto.ts +10 -92
  904. package/src/workflow/entities/mcp-server.entity.ts +6 -3
  905. package/src/workflow/entities/memory-definition.entity.ts +9 -7
  906. package/src/workflow/entities/memory-record.entity.ts +4 -7
  907. package/src/workflow/entities/workflow-run.entity.ts +13 -19
  908. package/src/workflow/entities/workflow-version.entity.ts +7 -7
  909. package/src/workflow/entities/workflow.entity.ts +6 -3
  910. package/src/workflow/lib/trigger-event-wrapper.ts +2 -2
  911. package/src/workflow/schemas/workflow-input-schemas.ts +4 -4
  912. package/src/workflow/services/agentic.service.ts +1 -2
  913. package/src/workflow/services/mcp-client-pool.service.ts +1 -1
  914. package/src/workflow/services/memory-definition.service.ts +1 -1
  915. package/src/workflow/services/memory-record.service.ts +1 -2
  916. package/src/workflow/services/workflow-run.service.ts +1 -1
  917. package/src/workflow/services/workflow-version.service.ts +2 -4
  918. package/src/workflow/services/workflow.service.ts +2 -1
  919. package/src/workflow/types.ts +17 -32
  920. package/src/workflow/utils/memory-store.ts +1 -2
  921. package/types/express-session.d.ts +1 -0
  922. package/dist/chat/types/attachment.d.ts +0 -27
  923. package/dist/chat/types/attachment.js +0 -26
  924. package/dist/chat/types/attachment.js.map +0 -1
  925. package/dist/chat/types/button.d.ts +0 -28
  926. package/dist/chat/types/button.js +0 -66
  927. package/dist/chat/types/button.js.map +0 -1
  928. package/dist/chat/types/message.d.ts +0 -508
  929. package/dist/chat/types/message.js +0 -149
  930. package/dist/chat/types/message.js.map +0 -1
  931. package/dist/chat/types/options.d.ts +0 -63
  932. package/dist/chat/types/options.js +0 -118
  933. package/dist/chat/types/options.js.map +0 -1
  934. package/dist/chat/types/quick-reply.d.ts +0 -29
  935. package/dist/chat/types/quick-reply.js +0 -31
  936. package/dist/chat/types/quick-reply.js.map +0 -1
  937. package/dist/extensions/channels/console/console-channel.settings.d.ts +0 -34
  938. package/dist/extensions/channels/console/console-channel.settings.js.map +0 -1
  939. package/dist/extensions/channels/web/web-channel.settings.d.ts +0 -38
  940. package/dist/extensions/channels/web/web-channel.settings.js.map +0 -1
  941. package/dist/i18n/localize-schema-metadata.d.ts +0 -8
  942. package/dist/i18n/localize-schema-metadata.js +0 -34
  943. package/dist/i18n/localize-schema-metadata.js.map +0 -1
  944. package/dist/user/dto/assigned-profile.dto.d.ts +0 -25
  945. package/dist/user/dto/assigned-profile.dto.js +0 -97
  946. package/dist/user/dto/assigned-profile.dto.js.map +0 -1
  947. package/dist/workflow/utils/workflow-run-duration.d.ts +0 -9
  948. package/dist/workflow/utils/workflow-run-duration.js +0 -28
  949. package/dist/workflow/utils/workflow-run-duration.js.map +0 -1
  950. package/src/chat/types/attachment.ts +0 -47
  951. package/src/chat/types/button.ts +0 -86
  952. package/src/chat/types/message.ts +0 -282
  953. package/src/chat/types/options.ts +0 -130
  954. package/src/chat/types/quick-reply.ts +0 -41
  955. package/src/i18n/localize-schema-metadata.ts +0 -63
  956. package/src/user/dto/assigned-profile.dto.ts +0 -76
  957. package/src/workflow/utils/workflow-run-duration.ts +0 -45
@@ -4,6 +4,17 @@
4
4
  * Full terms: see LICENSE.md.
5
5
  */
6
6
 
7
+ import type {
8
+ Attachment,
9
+ Source,
10
+ StdOutgoingMessageEnvelope,
11
+ Subscriber,
12
+ } from '@hexabot-ai/types';
13
+ import {
14
+ ActionOptions,
15
+ OutgoingMessageType,
16
+ StdEventType,
17
+ } from '@hexabot-ai/types';
7
18
  import {
8
19
  HttpException,
9
20
  HttpStatus,
@@ -15,157 +26,197 @@ import { OnEvent } from '@nestjs/event-emitter';
15
26
  import { Request, Response } from 'express';
16
27
  import { Socket } from 'socket.io';
17
28
  import { v4 as uuidv4 } from 'uuid';
29
+ import type { z } from 'zod';
18
30
 
19
- import { Attachment } from '@/attachment/dto/attachment.dto';
20
31
  import { AttachmentOrmEntity } from '@/attachment/entities/attachment.entity';
21
32
  import {
22
33
  AttachmentAccess,
23
34
  AttachmentCreatedByRef,
24
35
  AttachmentResourceRef,
25
36
  } from '@/attachment/types';
26
- import ChannelHandler from '@/channel/lib/Handler';
27
- import { MessageInboundEvent } from '@/channel/lib/inbound-events';
28
37
  import {
29
- inferOutgoingMessageEnvelope,
30
- UnsupportedOutgoingFormatError,
31
- } from '@/channel/lib/outbound';
32
- import { ChannelAttachmentService } from '@/channel/services/channel-attachment.service';
38
+ ChannelCapabilities,
39
+ DEFAULT_CHANNEL_CAPABILITIES,
40
+ ExtensionInject,
41
+ WebSocketChannelHandler,
42
+ } from '@/channel';
43
+ import { MessageInboundEvent } from '@/channel/lib/inbound-events';
44
+ import { SourceService } from '@/channel/services/source.service';
33
45
  import { ChannelName } from '@/channel/types';
46
+ import { SubscriberChannelData } from '@/chat';
34
47
  import { MessageCreateDto } from '@/chat/dto/message.dto';
35
- import { Subscriber, SubscriberCreateDto } from '@/chat/dto/subscriber.dto';
36
- import { Thread } from '@/chat/dto/thread.dto';
48
+ import { SubscriberCreateDto } from '@/chat/dto/subscriber.dto';
37
49
  import { MessageService } from '@/chat/services/message.service';
38
- import { SubscriberService } from '@/chat/services/subscriber.service';
39
- import { ThreadService } from '@/chat/services/thread.service';
40
- import { PayloadType } from '@/chat/types/button';
41
- import {
42
- AnyMessage,
43
- IncomingMessage,
44
- OutgoingMessage,
45
- OutgoingMessageFormat,
46
- StdEventType,
47
- StdOutgoingEnvelope,
48
- StdOutgoingMessage,
49
- } from '@/chat/types/message';
50
- import { ActionOptions } from '@/chat/types/options';
51
50
  import { MenuService } from '@/cms/services/menu.service';
52
51
  import { config } from '@/config';
53
52
  import { SocketRequest } from '@/websocket/utils/socket-request';
54
53
  import { SocketResponse } from '@/websocket/utils/socket-response';
55
- import { WebsocketGateway } from '@/websocket/websocket.gateway';
56
54
 
57
55
  import {
58
56
  AttachmentMessageInboundEvent,
59
57
  BaseWebInboundEvent,
60
58
  createWebInboundEventDecoder,
59
+ createWebInboundMessageEncoder,
61
60
  WebInboundEventDecoder,
61
+ WebInboundMessageEncoder,
62
62
  WebMessageInboundEvent,
63
63
  } from './inbound';
64
64
  import {
65
65
  createWebOutboundMessageEncoder,
66
66
  WebOutboundMessageEncoder,
67
67
  } from './outbound';
68
+ import {
69
+ WebFormatContext,
70
+ WebHistoryService,
71
+ } from './services/web-history.service';
72
+ import { WebSessionService } from './services/web-session.service';
73
+ import { WEB_CHANNEL_NAME } from './settings.schema';
68
74
  import { Web } from './types';
69
- import { WEB_CHANNEL_NAME } from './web-channel.settings';
70
75
 
76
+ /**
77
+ * Base handler for the Socket.IO-backed "web" channel.
78
+ *
79
+ * Responsibilities:
80
+ * - resolves per-channel helpers via `@ExtensionInject()` (encoder/decoder, session, history)
81
+ * - enforces web-channel CORS rules for the HTTP socket transport endpoints
82
+ * - manages web session bootstrap and thread resolution
83
+ * - decodes inbound web events and broadcasts outbound messages over Socket.IO
84
+ */
71
85
  @Injectable()
72
86
  export default abstract class BaseWebChannelHandler<N extends ChannelName>
73
- extends ChannelHandler<N>
87
+ extends WebSocketChannelHandler<N>
74
88
  implements OnModuleInit
75
89
  {
76
- @Inject(SubscriberService)
77
- protected readonly subscriberService: SubscriberService;
90
+ @Inject(MenuService)
91
+ private readonly menuService: MenuService;
78
92
 
79
93
  @Inject(MessageService)
80
- protected readonly messageService: MessageService;
94
+ private readonly messageService: MessageService;
81
95
 
82
- @Inject(MenuService)
83
- protected readonly menuService: MenuService;
96
+ @Inject(SourceService)
97
+ private readonly sourceService: SourceService;
84
98
 
85
- @Inject(WebsocketGateway)
86
- protected readonly websocketGateway: WebsocketGateway;
99
+ @ExtensionInject((name) => createWebOutboundMessageEncoder(name))
100
+ private outboundMessageEncoder!: WebOutboundMessageEncoder;
87
101
 
88
- @Inject(ThreadService)
89
- protected readonly threadService: ThreadService;
102
+ @ExtensionInject((name) => createWebInboundMessageEncoder(name))
103
+ private inboundMessageEncoder!: WebInboundMessageEncoder;
90
104
 
91
- @Inject(ChannelAttachmentService)
92
- protected readonly channelAttachmentService: ChannelAttachmentService;
105
+ @ExtensionInject((name) => createWebInboundEventDecoder(name))
106
+ private inboundEventDecoder!: WebInboundEventDecoder<N>;
93
107
 
94
- private outboundMessageEncoder!: WebOutboundMessageEncoder;
108
+ @ExtensionInject(WebSessionService)
109
+ private sessionService!: WebSessionService;
95
110
 
96
- private inboundEventDecoder!: WebInboundEventDecoder<N>;
111
+ @ExtensionInject(WebHistoryService)
112
+ private historyService!: WebHistoryService;
97
113
 
98
- constructor(name: N) {
99
- super(name);
114
+ constructor(name: N, sourceSettingsSchema?: z.ZodTypeAny) {
115
+ super(name, sourceSettingsSchema);
100
116
  }
101
117
 
102
118
  async onModuleInit() {
103
119
  await super.onModuleInit();
104
- const OutboundMessageEncoderProvider = createWebOutboundMessageEncoder(
105
- this.getName(),
106
- );
107
- const InboundEventDecoderProvider = createWebInboundEventDecoder(
108
- this.getName(),
109
- );
110
- [this.outboundMessageEncoder, this.inboundEventDecoder] = await Promise.all(
111
- [
112
- this.createModuleRef(OutboundMessageEncoderProvider),
113
- this.createModuleRef(InboundEventDecoderProvider) as Promise<
114
- WebInboundEventDecoder<N>
115
- >,
116
- ],
117
- );
118
120
  this.logger.debug('initialization ...');
119
121
  }
120
122
 
121
- /**
122
- * Verify web websocket connection and return settings
123
- *
124
- * @param client - The socket client
125
- */
123
+ getCapabilities(): ChannelCapabilities {
124
+ return { ...DEFAULT_CHANNEL_CAPABILITIES, typingIndicator: true };
125
+ }
126
+
127
+ generateId(): string {
128
+ return `${this.name}-${uuidv4()}`;
129
+ }
130
+
131
+ getChannelAttributes(
132
+ req: SocketRequest,
133
+ ): SubscriberChannelDict[typeof WEB_CHANNEL_NAME] {
134
+ return {
135
+ isSocket: true,
136
+ ipAddress: this.getIpAddress(req),
137
+ agent: req.headers['user-agent'] || 'browser',
138
+ };
139
+ }
140
+
141
+ private formatCtx(sourceId: string): WebFormatContext {
142
+ return {
143
+ inboundEncoder: this.inboundMessageEncoder,
144
+ outboundEncoder: this.outboundMessageEncoder,
145
+ generateId: () => this.generateId(),
146
+ sourceId,
147
+ };
148
+ }
149
+
150
+ private getSourceIdFromHandshake(client: Socket): string | null {
151
+ const rawSourceId = client.handshake.query.source_id;
152
+ const sourceId = Array.isArray(rawSourceId) ? rawSourceId[0] : rawSourceId;
153
+
154
+ if (typeof sourceId !== 'string') {
155
+ return null;
156
+ }
157
+
158
+ const normalizedSourceId = sourceId.trim();
159
+
160
+ return normalizedSourceId.length > 0 ? normalizedSourceId : null;
161
+ }
162
+
126
163
  @OnEvent('hook:websocket:connection', { async: true })
127
164
  async onWebSocketConnection(client: Socket) {
128
165
  try {
129
- const handshake = client.handshake;
130
- const { channel } = handshake.query;
166
+ const sourceId = this.getSourceIdFromHandshake(client);
167
+
168
+ if (!sourceId) {
169
+ if (client.request.session.passport?.user?.id) {
170
+ // Core websocket connection for system notifications (not the web/console channel one)
171
+ return;
172
+ }
173
+
174
+ this.logger.warn('Missing source_id in websocket handshake');
175
+ client.disconnect();
176
+
177
+ return;
178
+ }
179
+
180
+ const source = await this.sourceService.findActiveById(sourceId);
131
181
  const profile = client.request.session.web?.profile;
132
182
 
133
- if (channel !== this.getName()) {
183
+ if (source.channel !== this.getName()) {
134
184
  return;
135
185
  }
136
186
 
187
+ client.request.session.web = {
188
+ ...client.request.session.web,
189
+ sourceId,
190
+ };
191
+
137
192
  let messages: Web.Message[] | undefined;
138
193
  let threadId: string | undefined;
139
194
 
140
195
  if (profile?.foreignId) {
141
196
  await client.join(profile.foreignId);
142
- const thread = await this.threadService.resolveThread({
143
- subscriberId: profile.id,
144
- explicitThreadId: client.request.session.web?.threadId,
145
- });
197
+ const thread = await this.sessionService.resolveThread(
198
+ profile.id,
199
+ client.request.session.web?.threadId,
200
+ );
146
201
  threadId = thread?.id;
147
- const currentWebSession = client.request.session.web;
148
202
  client.request.session.web = {
149
- profile: currentWebSession?.profile,
203
+ profile: client.request.session.web?.profile,
150
204
  threadId,
205
+ sourceId,
151
206
  };
152
- if (thread) {
153
- const messagesHistory =
154
- await this.messageService.findHistoryUntilDate(thread);
155
- messages = await this.formatMessages(
156
- messagesHistory.reverse() as AnyMessage[],
157
- );
158
- } else {
159
- messages = [];
160
- }
207
+ messages = thread
208
+ ? await this.historyService.fetchHistory(
209
+ thread,
210
+ this.formatCtx(source.id),
211
+ )
212
+ : [];
161
213
  }
162
214
 
163
215
  this.logger.debug('WS connected .. sending settings');
164
- const settings = await this.getSettings();
216
+ const settings = source.settings;
165
217
 
166
218
  try {
167
219
  const menu = await this.menuService.getTree();
168
-
169
220
  client.emit('settings', {
170
221
  menu,
171
222
  profile,
@@ -199,202 +250,19 @@ export default abstract class BaseWebChannelHandler<N extends ChannelName>
199
250
  }
200
251
  ) as SocketResponse;
201
252
  const subscriber = socket.request.session.web?.profile;
253
+ const sourceId = this.getSourceIdFromHandshake(socket);
202
254
 
203
- if (socket.handshake.query.channel !== this.getName() || !subscriber) {
255
+ if (
256
+ !sourceId ||
257
+ socket.request.session.web?.sourceId !== sourceId ||
258
+ !subscriber
259
+ ) {
204
260
  return;
205
261
  }
206
262
 
207
263
  this.broadcast(subscriber, StdEventType.error, response, [socket.id]);
208
264
  }
209
265
 
210
- /**
211
- * Adapt incoming message structure for web channel
212
- *
213
- * @param incoming - Incoming message
214
- * @returns Formatted web message
215
- */
216
- private async formatIncomingHistoryMessage(
217
- incoming: IncomingMessage,
218
- ): Promise<Web.InboundMessageBase> {
219
- // Format incoming message
220
- if ('type' in incoming.message) {
221
- if (incoming.message.type === PayloadType.location) {
222
- const coordinates = incoming.message.coordinates;
223
-
224
- return {
225
- type: Web.InboundMessageType.location,
226
- data: {
227
- coordinates: {
228
- lat: coordinates.lat,
229
- lng: coordinates.lon,
230
- },
231
- },
232
- };
233
- } else {
234
- // @TODO : handle multiple files
235
- const attachmentPayload = Array.isArray(incoming.message.attachment)
236
- ? incoming.message.attachment[0]
237
- : incoming.message.attachment;
238
-
239
- return {
240
- type: Web.InboundMessageType.file,
241
- data: {
242
- type: attachmentPayload.type,
243
- url: await this.channelAttachmentService.getPublicUrl(
244
- this.getName(),
245
- attachmentPayload.payload,
246
- ),
247
- },
248
- };
249
- }
250
- } else {
251
- return {
252
- type: Web.InboundMessageType.text,
253
- data: incoming.message,
254
- };
255
- }
256
- }
257
-
258
- /**
259
- * Adapt the outgoing message structure for web channel
260
- *
261
- * @param outgoing - The outgoing message
262
- * @returns Formatted web message
263
- */
264
- private async formatOutgoingHistoryMessage(
265
- outgoing: OutgoingMessage,
266
- ): Promise<Web.OutboundMessageBase> {
267
- const envelope = inferOutgoingMessageEnvelope(outgoing.message);
268
- const options: ActionOptions =
269
- 'options' in outgoing.message
270
- ? {
271
- content: outgoing.message.options,
272
- }
273
- : {};
274
-
275
- return await this.outboundMessageEncoder.encode(envelope, options);
276
- }
277
-
278
- /**
279
- * Checks if a given message is an IncomingMessage
280
- *
281
- * @param message Any type of message
282
- * @returns True, if it's a incoming message
283
- */
284
- private isIncomingMessage(message: AnyMessage): message is IncomingMessage {
285
- return 'sender' in message && !!message.sender;
286
- }
287
-
288
- /**
289
- * Adapt the message structure for web channel
290
- *
291
- * @param messages - The messages to be formatted
292
- *
293
- * @returns Formatted message
294
- */
295
- protected async formatMessages(
296
- messages: AnyMessage[],
297
- ): Promise<Web.Message[]> {
298
- const formattedMessages: Web.Message[] = [];
299
-
300
- for (const anyMessage of messages) {
301
- const messageMid = anyMessage.mid ?? this.generateId();
302
- if (this.isIncomingMessage(anyMessage)) {
303
- const message = await this.formatIncomingHistoryMessage(anyMessage);
304
- formattedMessages.push({
305
- ...message,
306
- author: anyMessage.sender,
307
- read: true, // Temporary fix as read is false in the bd
308
- mid: messageMid,
309
- createdAt: anyMessage.createdAt,
310
- });
311
- } else {
312
- const message = await this.formatOutgoingHistoryMessage(anyMessage);
313
- formattedMessages.push({
314
- ...message,
315
- author: 'chatbot',
316
- read: true, // Temporary fix as read is false in the bd
317
- mid: messageMid,
318
- handover: !!anyMessage.handover,
319
- createdAt: anyMessage.createdAt,
320
- });
321
- }
322
- }
323
-
324
- return formattedMessages;
325
- }
326
-
327
- private normalizeThreadId(raw: unknown): string | undefined {
328
- if (typeof raw !== 'string') {
329
- return undefined;
330
- }
331
- const value = raw.trim();
332
-
333
- return value.length > 0 ? value : undefined;
334
- }
335
-
336
- private getThreadIdFromQuery(req: SocketRequest): string | undefined {
337
- const raw = req.query.thread_id;
338
- const candidate = Array.isArray(raw) ? raw[0] : raw;
339
-
340
- return this.normalizeThreadId(candidate);
341
- }
342
-
343
- private getThreadIdFromBody(req: SocketRequest): string | undefined {
344
- const body = req.body as { thread_id?: unknown } | undefined;
345
-
346
- return this.normalizeThreadId(body?.thread_id);
347
- }
348
-
349
- private async resolveThreadForHistory(
350
- req: SocketRequest,
351
- ): Promise<Thread | null> {
352
- const profile = req.session.web?.profile;
353
- if (!profile?.id) {
354
- return null;
355
- }
356
-
357
- const explicitThreadId =
358
- this.getThreadIdFromQuery(req) ?? this.getThreadIdFromBody(req);
359
- const thread = await this.threadService.resolveThread({
360
- subscriberId: profile.id,
361
- explicitThreadId,
362
- });
363
-
364
- if (req.session.web) {
365
- req.session.web.threadId = thread?.id;
366
- }
367
-
368
- return thread;
369
- }
370
-
371
- /**
372
- * Fetches the messaging history from the DB.
373
- * @param req - Either an HTTP Express request or a WS SocketRequest (synthetic)
374
- * @param [until=new Date()] - Date before which to fetch
375
- * @param [n=30] - Number of messages to fetch
376
- * @returns Promise resolving to an array of messages.
377
- * Fetches the last 'n' messages for the session profile up to the given date.
378
- */
379
- protected async fetchHistory(
380
- req: SocketRequest,
381
- until: Date = new Date(),
382
- n: number = 30,
383
- ): Promise<Web.Message[]> {
384
- const thread = await this.resolveThreadForHistory(req);
385
- if (thread) {
386
- const messages = await this.messageService.findHistoryUntilDate(
387
- thread,
388
- until,
389
- n,
390
- );
391
-
392
- return await this.formatMessages(messages.reverse() as AnyMessage[]);
393
- }
394
-
395
- return [];
396
- }
397
-
398
266
  /**
399
267
  * Verify the origin against whitelisted domains.
400
268
  *
@@ -404,173 +272,45 @@ export default abstract class BaseWebChannelHandler<N extends ChannelName>
404
272
  private async ensureValidCors(
405
273
  req: SocketRequest,
406
274
  res: Response | SocketResponse,
407
- ) {
408
- // Check if we have an origin header...
409
- if (!req.headers?.origin) {
410
- this.logger.debug('No origin ', req.headers);
411
- throw new Error('CORS - No origin provided!');
412
- }
413
-
414
- const originUrl = new URL(req.headers.origin);
415
- const allowedProtocols = new Set(['http:', 'https:']);
416
- if (!allowedProtocols.has(originUrl.protocol)) {
417
- throw new Error('CORS - Invalid origin!');
418
- }
419
-
420
- const settings = await this.getSettings<typeof WEB_CHANNEL_NAME>();
421
- // Get the allowed origins
422
- const origins: string[] = settings.allowed_domains.split(',');
423
- const foundOrigin = origins
424
- .filter((origin) => origin.trim() !== '*') // Skip "*"
425
- .map((origin) => {
426
- try {
427
- return new URL(origin.trim()).origin;
428
- } catch (error) {
429
- this.logger.error(`Invalid URL in allowed domains: ${origin}`, error);
430
-
431
- return null;
432
- }
433
- })
434
- .filter(
435
- (normalizedOrigin): normalizedOrigin is string =>
436
- normalizedOrigin !== null,
437
- )
438
- .some((origin: string) => {
439
- // If we find a whitelisted origin, send the Access-Control-Allow-Origin header
440
- // to greenlight the request.
441
- return origin === originUrl.origin;
442
- });
275
+ source: Source,
276
+ ): Promise<void> {
277
+ const allowedDomains =
278
+ typeof source.settings.allowed_domains === 'string'
279
+ ? source.settings.allowed_domains
280
+ : '*';
443
281
 
444
- if (!foundOrigin && !origins.includes('*')) {
445
- // For HTTP requests, set the Access-Control-Allow-Origin header to '', which the browser will
446
- // interpret as, 'no way Jose.'
447
- res.set('Access-Control-Allow-Origin', '');
448
- this.logger.debug('No origin found ', req.headers.origin);
449
- throw new Error('CORS - Domain not allowed!');
450
- } else {
451
- res.set('Access-Control-Allow-Origin', originUrl.origin);
452
- }
453
- // Determine whether or not to allow cookies to be passed cross-origin
454
- res.set('Access-Control-Allow-Credentials', 'true');
455
- // This header lets a server whitelist headers that browsers are allowed to access
456
- res.set('Access-Control-Expose-Headers', '');
457
- // Handle preflight requests
458
- if (req.method == 'OPTIONS') {
459
- res.set('Access-Control-Allow-Methods', 'GET, POST');
460
- res.set('Access-Control-Allow-Headers', 'content-type');
461
- }
282
+ await this.sessionService.validateCors(req, res, allowedDomains);
462
283
  }
463
284
 
464
- /**
465
- * Makes sure that message request is legitimate.
466
- *
467
- * @param req
468
- * @param res
469
- */
470
- private async validateSession(
285
+ protected async getOrCreateSession(
471
286
  req: SocketRequest,
472
- res: Response | SocketResponse,
473
- ): Promise<Subscriber | null> {
474
- if (req.session.web?.profile?.id) {
475
- return req.session.web.profile;
476
- }
477
-
478
- const body = req.body as { author?: unknown; data?: unknown } | undefined;
479
- const authorForeignId =
480
- typeof body?.author === 'string' && body.author.trim().length > 0
481
- ? body.author.trim()
482
- : undefined;
287
+ source: Source,
288
+ ): Promise<Subscriber> {
289
+ return this.sessionService.getOrCreateSession(req, source.id, () => {
290
+ const data = req.query;
483
291
 
484
- if (authorForeignId) {
485
- try {
486
- const subscriber =
487
- await this.subscriberService.findOneByForeignId(authorForeignId);
488
- if (subscriber) {
489
- const thread = await this.threadService.resolveThread({
490
- subscriberId: subscriber.id,
491
- explicitThreadId:
492
- this.getThreadIdFromBody(req) ?? this.getThreadIdFromQuery(req),
493
- });
494
- req.session.web = {
495
- profile: subscriber,
496
- threadId: thread?.id,
497
- };
498
-
499
- this.logger.debug(
500
- `Recovered missing web session from author ${authorForeignId}`,
501
- );
502
-
503
- return subscriber;
504
- }
505
- } catch (error) {
506
- this.logger.warn(
507
- `Unable to recover missing session from author ${authorForeignId}`,
508
- error,
509
- );
510
- }
511
- }
512
-
513
- this.logger.warn('No session ID to be found!', req.session);
514
- res.status(403).json({ err: 'Web Channel Handler : Unauthorized!' });
515
-
516
- return null;
517
- }
518
-
519
- /**
520
- * Get or create a session profile for the subscriber
521
- *
522
- * @param req
523
- *
524
- * @returns Subscriber's profile
525
- */
526
- protected async getOrCreateSession(req: SocketRequest): Promise<Subscriber> {
527
- const data = req.query;
528
- // Subscriber has already a session
529
- const sessionProfile = req.session.web?.profile;
530
- if (sessionProfile) {
531
- const subscriber = await this.subscriberService.findOne(
532
- sessionProfile.id,
533
- );
534
- if (!subscriber || !req.session.web) {
535
- throw new Error('Subscriber session was not persisted in DB');
536
- }
537
- const thread = await this.threadService.resolveThread({
538
- subscriberId: subscriber.id,
539
- explicitThreadId: req.session.web.threadId,
540
- });
541
- req.session.web.profile = subscriber;
542
- req.session.web.threadId = thread?.id;
543
-
544
- return subscriber;
545
- }
546
-
547
- const newProfile: SubscriberCreateDto = {
548
- foreignId: this.generateId(),
549
- firstName: data.first_name ? data.first_name.toString() : 'Anon.',
550
- lastName: data.last_name ? data.last_name.toString() : 'Web User',
551
- assignedTo: null,
552
- assignedAt: null,
553
- lastvisit: new Date(),
554
- retainedFrom: new Date(),
555
- avatar: null,
556
- channel: {
557
- name: this.getName(),
558
- data: this.getChannelAttributes(req),
559
- },
560
- language: '',
561
- locale: '',
562
- timezone: 0,
563
- gender: 'male',
564
- country: '',
565
- labels: [],
566
- };
567
- const profile = await this.subscriberService.create(newProfile);
568
-
569
- req.session.web = {
570
- profile,
571
- };
572
-
573
- return profile;
292
+ return {
293
+ foreignId: this.generateId(),
294
+ firstName: data.first_name ? String(data.first_name) : 'Anon.',
295
+ lastName: data.last_name ? String(data.last_name) : 'Web User',
296
+ assignedTo: null,
297
+ assignedAt: null,
298
+ lastvisit: new Date(),
299
+ retainedFrom: new Date(),
300
+ avatar: null,
301
+ channel: {
302
+ name: this.getName(),
303
+ data: this.getChannelAttributes(req),
304
+ },
305
+ language: '',
306
+ locale: '',
307
+ timezone: 0,
308
+ gender: 'male',
309
+ country: '',
310
+ labels: [],
311
+ source: source.id,
312
+ };
313
+ });
574
314
  }
575
315
 
576
316
  /**
@@ -582,29 +322,37 @@ export default abstract class BaseWebChannelHandler<N extends ChannelName>
582
322
  protected async subscribe(
583
323
  req: SocketRequest,
584
324
  res: Response | SocketResponse,
585
- ) {
325
+ source: Source,
326
+ ): Promise<void> {
586
327
  this.logger.debug('subscribe (isSocket=true)');
587
328
  try {
588
- const profile = await this.getOrCreateSession(req);
329
+ const profile = await this.getOrCreateSession(req, source);
330
+ const profileForeignId = profile.foreignId;
331
+ if (!profileForeignId) {
332
+ throw new Error('Session profile foreignId is missing');
333
+ }
589
334
  try {
590
- await req.socket.join(profile.foreignId);
335
+ await req.socket.join(profileForeignId);
591
336
  } catch (err) {
592
337
  this.logger.error('Unable to subscribe via websocket', err);
593
338
  }
594
- // Fetch message history
595
339
  const criteria =
596
- 'since' in req.query ? req.query.since : req.body?.since || undefined;
597
- const messages = await this.fetchHistory(req, criteria);
340
+ 'since' in req.query ? req.query.since : (req.body?.since ?? undefined);
341
+ const messages = await this.historyService.fetchHistoryForRequest(
342
+ req,
343
+ this.sessionService,
344
+ this.formatCtx(source.id),
345
+ criteria,
346
+ );
598
347
 
599
- return res.status(200).json({
348
+ res.status(200).json({
600
349
  profile,
601
350
  messages,
602
351
  thread_id: req.session.web?.threadId ?? null,
603
352
  });
604
353
  } catch (err) {
605
354
  this.logger.warn('Unable to subscribe ', err);
606
-
607
- return res.status(500).json({ err: 'Unable to subscribe' });
355
+ res.status(500).json({ err: 'Unable to subscribe' });
608
356
  }
609
357
  }
610
358
 
@@ -614,6 +362,7 @@ export default abstract class BaseWebChannelHandler<N extends ChannelName>
614
362
  * @param req - The WebSocket request containing the session and the file data.
615
363
  * @returns A Promise that resolves to the stored `Attachment`, or `null` if
616
364
  * the session is invalid or no file is provided.
365
+ * @throws Error if missing file payload.
617
366
  * @throws Error if the max upload size is exceeded.
618
367
  * @throws Error when storing the uploaded file fails.
619
368
  */
@@ -626,8 +375,6 @@ export default abstract class BaseWebChannelHandler<N extends ChannelName>
626
375
 
627
376
  return null;
628
377
  }
629
-
630
- // Check if any file is provided
631
378
  if (type !== Web.InboundMessageType.file) {
632
379
  this.logger.debug('No files provided');
633
380
 
@@ -637,6 +384,10 @@ export default abstract class BaseWebChannelHandler<N extends ChannelName>
637
384
  throw new Error('File payload is missing');
638
385
  }
639
386
 
387
+ const { name: fileName, type: mimeType } = data as {
388
+ name: string;
389
+ type: string;
390
+ };
640
391
  const size = Buffer.byteLength(data.file);
641
392
 
642
393
  if (size > config.parameters.maxUploadSize) {
@@ -644,9 +395,9 @@ export default abstract class BaseWebChannelHandler<N extends ChannelName>
644
395
  }
645
396
 
646
397
  return await this.attachmentService.store(data.file, {
647
- name: data.name,
398
+ name: fileName,
648
399
  size,
649
- type: data.type,
400
+ type: mimeType,
650
401
  resourceRef: AttachmentResourceRef.MessageAttachment,
651
402
  access: AttachmentAccess.Private,
652
403
  createdByRef: AttachmentCreatedByRef.Subscriber,
@@ -658,43 +409,16 @@ export default abstract class BaseWebChannelHandler<N extends ChannelName>
658
409
  }
659
410
  }
660
411
 
661
- /**
662
- * Returns the request client IP address
663
- *
664
- * @param req Either a HTTP request or a WS Request (Synthetic object)
665
- *
666
- * @returns IP Address
667
- */
668
- protected getIpAddress(req: SocketRequest): string {
669
- return req.socket.handshake.address;
670
- }
671
-
672
- /**
673
- * Return subscriber channel specific attributes
674
- *
675
- * @param req Either a HTTP Express request or a WS request (Synthetic Object)
676
- *
677
- * @returns The subscriber channel's attributes
678
- */
679
- getChannelAttributes(
680
- req: SocketRequest,
681
- ): SubscriberChannelDict[typeof WEB_CHANNEL_NAME] {
682
- return {
683
- isSocket: true,
684
- ipAddress: this.getIpAddress(req),
685
- agent: req.headers['user-agent'] || 'browser',
686
- };
687
- }
688
-
689
412
  /**
690
413
  * Handle channel event (probably a message)
691
414
  *
692
- * @param req Either a HTTP Express request or a WS request (Synthetic Object)
693
- * @param res Either a HTTP Express response or a WS response (Synthetic Object)
415
+ * @param req - WS request (Synthetic Object)
416
+ * @param res - Either a HTTP Express response or a WS response (Synthetic Object)
694
417
  */
695
418
  async handleEvent(
696
419
  req: SocketRequest,
697
420
  res: Response | SocketResponse,
421
+ source: Source,
698
422
  workflowId?: string,
699
423
  ): Promise<void> {
700
424
  if (!req.body) {
@@ -702,12 +426,13 @@ export default abstract class BaseWebChannelHandler<N extends ChannelName>
702
426
  res.status(400).json({ err: 'Web Channel Handler : Bad Request!' });
703
427
 
704
428
  return;
705
- } else if (
429
+ }
430
+
431
+ if (
706
432
  typeof req.body === 'object' &&
707
433
  req.body !== null &&
708
434
  'data' in req.body
709
435
  ) {
710
- // Parse json form data (in case of content-type multipart/form-data)
711
436
  const payload = req.body as { data?: unknown };
712
437
  payload.data =
713
438
  typeof payload.data === 'string'
@@ -715,10 +440,13 @@ export default abstract class BaseWebChannelHandler<N extends ChannelName>
715
440
  : payload.data;
716
441
  }
717
442
 
718
- const profile = await this.validateSession(req, res);
719
- if (!profile) {
720
- return;
721
- }
443
+ const profile = await this.sessionService.validateSession(
444
+ req,
445
+ res,
446
+ source.id,
447
+ );
448
+ if (!profile) return;
449
+
722
450
  const channelAttrs = this.getChannelAttributes(req);
723
451
  let events: Array<
724
452
  BaseWebInboundEvent<N> | WebMessageInboundEvent<N, Web.InboundMessage>
@@ -745,16 +473,15 @@ export default abstract class BaseWebChannelHandler<N extends ChannelName>
745
473
  }
746
474
 
747
475
  const explicitThreadId =
748
- this.getThreadIdFromBody(req) ??
749
- this.getThreadIdFromQuery(req) ??
476
+ this.sessionService.getThreadIdFromBody(req) ??
477
+ this.sessionService.getThreadIdFromQuery(req) ??
750
478
  req.session.web?.threadId;
751
479
  const responseBody = events[0].getRaw();
752
480
 
753
481
  for (const event of events) {
754
482
  event.setHandler(this);
755
- if (explicitThreadId) {
756
- event.setThreadId(explicitThreadId);
757
- }
483
+ event.setSourceContext(source.id, source.settings);
484
+ if (explicitThreadId) event.setThreadId(explicitThreadId);
758
485
  event.setInitiator(profile);
759
486
  event.setWorkflowId(workflowId);
760
487
 
@@ -764,17 +491,15 @@ export default abstract class BaseWebChannelHandler<N extends ChannelName>
764
491
  Web.InboundMessage
765
492
  >;
766
493
 
767
- // Handle upload when files are provided
768
494
  if (messageEvent instanceof AttachmentMessageInboundEvent) {
769
495
  try {
770
496
  const attachment = await this.handleWsUpload(req);
771
-
772
497
  if (attachment) {
773
498
  messageEvent.setUploadedAttachment(attachment);
774
499
  messageEvent.setUploadedRawData(
775
500
  AttachmentOrmEntity.getTypeByMime(attachment.type),
776
501
  await this.channelAttachmentService.getPublicUrl(
777
- this.getName(),
502
+ source.id,
778
503
  attachment,
779
504
  ),
780
505
  );
@@ -788,55 +513,47 @@ export default abstract class BaseWebChannelHandler<N extends ChannelName>
788
513
  }
789
514
  }
790
515
 
791
- // Handle sync message sent by chatbot
792
516
  if (messageEvent.isSyncFromChatbot()) {
793
- const thread = await this.threadService.resolveThread({
794
- subscriberId: profile.id,
795
- explicitThreadId,
796
- });
517
+ const thread = await this.sessionService.resolveThreadForHistory(
518
+ req,
519
+ profile.id,
520
+ );
797
521
  if (!thread) {
798
522
  return void res.status(409).json({
799
523
  err: 'Web Channel Handler : No thread available before first user message',
800
524
  });
801
525
  }
802
-
803
526
  messageEvent.setThreadId(thread.id);
804
- if (req.session.web) {
805
- req.session.web.threadId = thread.id;
806
- }
527
+ if (req.session.web) req.session.web.threadId = thread.id;
528
+
807
529
  const sentMessage: MessageCreateDto = {
808
530
  mid: messageEvent.getId(),
809
- message: messageEvent.getMessage() as StdOutgoingMessage,
531
+ message: {
532
+ type: OutgoingMessageType.text,
533
+ data: { text: messageEvent.getText() },
534
+ },
810
535
  recipient: profile.id,
811
536
  thread: thread.id,
812
537
  read: true,
813
538
  delivery: true,
814
539
  };
815
- this.eventEmitter.emit(
816
- 'hook:chatbot:sent',
817
- sentMessage,
818
- messageEvent,
819
- );
820
-
540
+ this.channelEventBus.emitSent(sentMessage, messageEvent);
821
541
  continue;
822
542
  }
823
543
 
824
- // Generate unique ID and handle message
825
544
  messageEvent.setMessageId(this.generateId());
826
- // Force author id from session
827
- messageEvent.setAuthorForeignId(profile.foreignId);
828
- // Use a server-side timestamp so realtime clients can sort deterministically.
545
+ if (profile.foreignId) {
546
+ messageEvent.setAuthorForeignId(profile.foreignId);
547
+ }
829
548
  messageEvent.setCreatedAt(new Date());
830
549
 
831
550
  this.broadcast(profile, StdEventType.message, messageEvent.getRaw());
832
- await this.eventEmitter.emitAsync('hook:chatbot:message', messageEvent);
833
- const resolvedThreadId = messageEvent.getThreadId();
551
+ await this.channelEventBus.emitMessage(messageEvent);
834
552
 
553
+ const resolvedThreadId = messageEvent.getThreadId();
835
554
  if (resolvedThreadId) {
836
555
  messageEvent.setThreadIdOnRaw(resolvedThreadId);
837
- if (req.session.web) {
838
- req.session.web.threadId = resolvedThreadId;
839
- }
556
+ if (req.session.web) req.session.web.threadId = resolvedThreadId;
840
557
  }
841
558
 
842
559
  continue;
@@ -844,120 +561,65 @@ export default abstract class BaseWebChannelHandler<N extends ChannelName>
844
561
 
845
562
  const type = event.getEventType();
846
563
  const threadId = event.getThreadId();
847
-
848
- if (threadId) {
849
- event.setThreadIdOnRaw(threadId);
850
- }
564
+ if (threadId) event.setThreadIdOnRaw(threadId);
851
565
  this.broadcast(profile, type, event.getRaw());
852
- this.eventEmitter.emit(`hook:chatbot:${type}`, event);
566
+ this.channelEventBus.emitStatusEvent(event);
853
567
  }
854
568
 
855
569
  res.status(200).json(responseBody);
856
570
  }
857
571
 
858
- /**
859
- * Checks if a given request is a socket request
860
- *
861
- * @param req Either a HTTP express request or a WS request
862
- * @returns True if it's a WS request
863
- */
864
- isSocketRequest(req: Request | SocketRequest): req is SocketRequest {
865
- return 'isSocket' in req && req.isSocket;
866
- }
867
-
868
- /**
869
- * Process incoming Web Channel data (finding out its type and assigning it to its proper handler)
870
- *
871
- * @param req Either a HTTP Express request or a WS request (Synthetic Object)
872
- * @param res Either a HTTP Express response or a WS response (Synthetic Object)
873
- */
874
- async handle(
875
- req: Request | SocketRequest,
572
+ protected async processSocketGet(
573
+ req: SocketRequest,
876
574
  res: Response | SocketResponse,
877
- workflowId?: string,
878
- ) {
879
- if (!this.isSocketRequest(req)) {
880
- this.logger.warn(
881
- 'Web channel over HTTP is no longer supported. Use Socket.IO transport.',
882
- );
883
-
884
- return res
885
- .status(403)
886
- .json({ err: 'Web Channel Handler : Unauthorized!' });
887
- }
888
-
575
+ source: Source,
576
+ ): Promise<void> {
889
577
  try {
890
- await this.ensureValidCors(req, res);
891
- if (req.method === 'GET') {
892
- if (req.query._disconnect) {
893
- req.session.web = undefined;
894
-
895
- return res.status(200).json({ _disconnect: true });
896
- } else {
897
- // Handle webhook subscribe requests
898
- return await this.subscribe(req, res);
899
- }
900
- } else {
901
- // Handle incoming messages (through POST)
902
- return this.handleEvent(req, res, workflowId);
578
+ await this.ensureValidCors(req, res, source);
579
+ if (req.query._disconnect) {
580
+ req.session.web = undefined;
581
+
582
+ return void res.status(200).json({ _disconnect: true });
903
583
  }
584
+ await this.subscribe(req, res, source);
904
585
  } catch (err) {
905
586
  this.logger.warn('Request check failed', err);
906
-
907
- return res
908
- .status(403)
909
- .json({ err: 'Web Channel Handler : Unauthorized!' });
587
+ res.status(403).json({ err: 'Web Channel Handler : Unauthorized!' });
910
588
  }
911
589
  }
912
590
 
913
- /**
914
- * Returns a unique identifier for the subscriber
915
- *
916
- * @returns UUID
917
- */
918
- generateId(): string {
919
- return `${this.name}-${uuidv4()}`;
920
- }
921
-
922
- /**
923
- * Sends a message to the end-user using websocket
924
- *
925
- * @param subscriber - End-user toward which message will be sent
926
- * @param type - The message to be sent (message, typing, ...)
927
- * @param content - The message payload contain additional settings
928
- * @param [excludedRooms=[]] - Array of room names to exclude from receiving the message.
929
- */
930
- private broadcast(
931
- subscriber: Subscriber,
932
- type: StdEventType,
933
- content: any,
934
- excludedRooms: string[] = [],
935
- ): void {
936
- this.websocketGateway.broadcast(subscriber, type, content, excludedRooms);
591
+ protected async processSocketPost(
592
+ req: SocketRequest,
593
+ res: Response | SocketResponse,
594
+ source: Source,
595
+ workflowId?: string,
596
+ ): Promise<void> {
597
+ try {
598
+ await this.ensureValidCors(req, res, source);
599
+ await this.handleEvent(req, res, source, workflowId);
600
+ } catch (err) {
601
+ this.logger.warn('Request check failed', err);
602
+ res.status(403).json({ err: 'Web Channel Handler : Unauthorized!' });
603
+ }
937
604
  }
938
605
 
939
- /**
940
- * Send a Web Channel Message to the end-user
941
- *
942
- * @param event - Incoming event/message being responded to
943
- * @param envelope - The message to be sent {format, message}
944
- * @param options - Might contain additional settings
945
- *
946
- * @returns The web's response, otherwise an error
947
- */
948
- async sendMessage(
606
+ protected async doSendMessage(
949
607
  event: MessageInboundEvent<N>,
950
- envelope: StdOutgoingEnvelope,
608
+ envelope: StdOutgoingMessageEnvelope,
951
609
  options: ActionOptions,
952
610
  ): Promise<{ mid: string }> {
953
- if (envelope.format === OutgoingMessageFormat.system) {
954
- throw new UnsupportedOutgoingFormatError(envelope.format);
611
+ const sourceId = event.getSourceId();
612
+
613
+ if (!sourceId) {
614
+ throw new Error(
615
+ `Missing sourceId while sending ${this.getName()} outbound message`,
616
+ );
955
617
  }
956
618
 
957
- const messageBase = await this.outboundMessageEncoder.encode(
958
- envelope,
959
- options ?? {},
960
- );
619
+ const messageBase = await this.outboundMessageEncoder.encode(envelope, {
620
+ ...(options ?? {}),
621
+ sourceId,
622
+ });
961
623
  const subscriber = event.getInitiator();
962
624
  const message: Web.OutboundMessage = {
963
625
  ...messageBase,
@@ -967,15 +629,15 @@ export default abstract class BaseWebChannelHandler<N extends ChannelName>
967
629
  createdAt: new Date(),
968
630
  handover: !!(options && options.assignTo),
969
631
  };
970
- const next = async (): Promise<any> => {
632
+ const send = async (): Promise<{ mid: string }> => {
971
633
  this.broadcast(subscriber, StdEventType.message, message);
972
634
 
973
635
  return { mid: message.mid };
974
636
  };
975
637
 
976
- if (options && options.typing) {
638
+ if (options?.typing) {
977
639
  const autoTimeout =
978
- message && message.data && 'text' in message.data
640
+ message?.data && 'text' in message.data
979
641
  ? message.data.text.length * 10
980
642
  : 1000;
981
643
  const timeout =
@@ -983,37 +645,13 @@ export default abstract class BaseWebChannelHandler<N extends ChannelName>
983
645
  try {
984
646
  await this.sendTypingIndicator(subscriber, timeout);
985
647
 
986
- return next();
648
+ return send();
987
649
  } catch (err) {
988
650
  this.logger.error('Failed in sending typing indicator ', err);
989
651
  }
990
652
  }
991
653
 
992
- return next();
993
- }
994
-
995
- /**
996
- * Send a typing indicator (waterline) to the end user for a given duration
997
- *
998
- * @param recipient - The end-user object
999
- * @param timeout - Duration of the typing indicator in milliseconds
1000
- */
1001
- async sendTypingIndicator(
1002
- recipient: Subscriber,
1003
- timeout: number,
1004
- ): Promise<void> {
1005
- return new Promise((resolve, reject) => {
1006
- try {
1007
- this.broadcast(recipient, StdEventType.typing, true);
1008
- setTimeout(() => {
1009
- this.broadcast(recipient, StdEventType.typing, false);
1010
-
1011
- return resolve();
1012
- }, timeout);
1013
- } catch (err) {
1014
- reject(err);
1015
- }
1016
- });
654
+ return send();
1017
655
  }
1018
656
 
1019
657
  /**
@@ -1027,22 +665,22 @@ export default abstract class BaseWebChannelHandler<N extends ChannelName>
1027
665
  event: MessageInboundEvent<N>,
1028
666
  ): Promise<SubscriberCreateDto> {
1029
667
  const sender = event.getInitiator();
1030
- const {
1031
- id: _id,
1032
- createdAt: _createdAt,
1033
- updatedAt: _updatedAt,
1034
- ...rest
1035
- } = sender;
1036
- const subscriber: SubscriberCreateDto = {
668
+ if (!sender.source) {
669
+ throw new Error('Unable to resolve subscriber source for web channel');
670
+ }
671
+ const { id: _id, createdAt: _c, updatedAt: _u, ...rest } = sender;
672
+
673
+ return {
1037
674
  ...rest,
1038
- channel: sender.channel,
675
+ source: sender.source,
676
+ channel: sender.channel as SubscriberChannelData<N>,
1039
677
  };
1040
-
1041
- return subscriber;
1042
678
  }
1043
679
 
1044
680
  /**
1045
681
  * Checks if the request is authorized to download a given attachment file.
682
+ * Can be overridden by the channel handler to customize, by default it shouldn't
683
+ * allow any client to download a subscriber attachment for example.
1046
684
  *
1047
685
  * @param attachment The attachment object
1048
686
  * @param req - The HTTP express request object.
@@ -1050,26 +688,27 @@ export default abstract class BaseWebChannelHandler<N extends ChannelName>
1050
688
  */
1051
689
  public async hasDownloadAccess(attachment: Attachment, req: Request) {
1052
690
  const subscriberId = req.session.web?.profile?.id;
1053
- if (attachment.access === AttachmentAccess.Public) {
1054
- return true;
1055
- } else if (!subscriberId) {
691
+
692
+ if (attachment.access === AttachmentAccess.Public) return true;
693
+
694
+ if (!subscriberId) {
1056
695
  this.logger.warn(
1057
696
  `Unauthorized access attempt to attachment ${attachment.id}`,
1058
697
  );
1059
698
 
1060
699
  return false;
1061
- } else if (
700
+ }
701
+
702
+ if (
1062
703
  attachment.createdByRef === AttachmentCreatedByRef.Subscriber &&
1063
704
  subscriberId === attachment.createdBy
1064
705
  ) {
1065
- // Either subscriber wants to access the attachment he sent
1066
706
  return true;
1067
- } else {
1068
- // Or, he would like to access an attachment sent to him privately
1069
- return await this.messageService.isAttachmentAccessibleBySubscriber(
1070
- subscriberId,
1071
- attachment.id,
1072
- );
1073
707
  }
708
+
709
+ return this.messageService.isAttachmentAccessibleBySubscriber(
710
+ subscriberId,
711
+ attachment.id,
712
+ );
1074
713
  }
1075
714
  }