@hexabot-ai/api 3.2.2-alpha.1 → 3.2.2-alpha.10

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 (525) hide show
  1. package/README.md +1 -1
  2. package/dist/actions/actions.service.d.ts +3 -3
  3. package/dist/actions/base-action.d.ts +3 -3
  4. package/dist/actions/create-action.d.ts +1 -1
  5. package/dist/actions/types.d.ts +3 -3
  6. package/dist/analytics/controllers/stats.controller.d.ts +1 -1
  7. package/dist/analytics/dto/stats.dto.d.ts +1 -1
  8. package/dist/analytics/entities/stats.entity.d.ts +1 -1
  9. package/dist/analytics/repositories/stats.repository.d.ts +1 -1
  10. package/dist/analytics/services/stats.service.d.ts +7 -7
  11. package/dist/app.controller.d.ts +1 -0
  12. package/dist/app.controller.js +1 -0
  13. package/dist/app.controller.js.map +1 -1
  14. package/dist/app.module.js +11 -1
  15. package/dist/app.module.js.map +1 -1
  16. package/dist/attachment/controllers/attachment.controller.d.ts +1 -1
  17. package/dist/attachment/dto/attachment.dto.d.ts +2 -2
  18. package/dist/attachment/entities/attachment.entity.d.ts +3 -3
  19. package/dist/attachment/guards/attachment-ability.guard.d.ts +2 -2
  20. package/dist/attachment/repositories/attachment.repository.d.ts +2 -2
  21. package/dist/attachment/services/attachment.service.d.ts +3 -3
  22. package/dist/attachment/utilities/index.js +2 -2
  23. package/dist/attachment/utilities/index.js.map +1 -1
  24. package/dist/audit/controllers/audit-log.controller.d.ts +2 -2
  25. package/dist/audit/dto/audit-log.dto.d.ts +1 -1
  26. package/dist/audit/entities/audit-log.entity.d.ts +1 -1
  27. package/dist/audit/exporters/audit-backend.factory.d.ts +1 -1
  28. package/dist/audit/exporters/audit-safe.exporter.d.ts +1 -1
  29. package/dist/audit/repositories/audit-log.repository.d.ts +1 -1
  30. package/dist/audit/services/audit-log-record.service.d.ts +1 -1
  31. package/dist/bindings/base-binding-kind.d.ts +2 -2
  32. package/dist/bindings/runtime-bindings.service.d.ts +2 -2
  33. package/dist/bootstrap.js +11 -0
  34. package/dist/bootstrap.js.map +1 -1
  35. package/dist/channel/channel.controller.d.ts +1 -1
  36. package/dist/channel/channel.service.d.ts +5 -5
  37. package/dist/channel/channel.service.js +3 -1
  38. package/dist/channel/channel.service.js.map +1 -1
  39. package/dist/channel/dto/source.dto.d.ts +1 -1
  40. package/dist/channel/entities/source.entity.d.ts +2 -2
  41. package/dist/channel/lib/Handler.d.ts +7 -7
  42. package/dist/channel/lib/Handler.js +2 -2
  43. package/dist/channel/lib/Handler.js.map +1 -1
  44. package/dist/channel/lib/__test__/label.mock.js +0 -24
  45. package/dist/channel/lib/__test__/label.mock.js.map +1 -1
  46. package/dist/channel/lib/channel-event-bus.d.ts +1 -1
  47. package/dist/channel/lib/inbound-events/channel-inbound-event-context.d.ts +1 -1
  48. package/dist/channel/lib/inbound-events/channel-inbound-event-decoder.d.ts +1 -1
  49. package/dist/channel/lib/inbound-events/channel-inbound-event.d.ts +2 -2
  50. package/dist/channel/lib/inbound-events/message-inbound-event.d.ts +1 -1
  51. package/dist/channel/lib/transports/http-channel-handler.d.ts +2 -2
  52. package/dist/channel/lib/transports/websocket-channel-handler.d.ts +3 -3
  53. package/dist/channel/repositories/source.repository.d.ts +1 -1
  54. package/dist/channel/services/channel-attachment.service.d.ts +3 -3
  55. package/dist/channel/services/source.service.d.ts +5 -3
  56. package/dist/channel/services/source.service.js +22 -0
  57. package/dist/channel/services/source.service.js.map +1 -1
  58. package/dist/channel/services/subscriber-resolver.service.d.ts +2 -2
  59. package/dist/channel/source.controller.d.ts +1 -1
  60. package/dist/channel/webhook.controller.d.ts +1 -1
  61. package/dist/chat/chat.module.js +1 -1
  62. package/dist/chat/chat.module.js.map +1 -1
  63. package/dist/chat/controllers/label-group.controller.d.ts +1 -1
  64. package/dist/chat/controllers/label.controller.d.ts +1 -1
  65. package/dist/chat/controllers/message.controller.d.ts +2 -2
  66. package/dist/chat/controllers/subscriber.controller.d.ts +3 -3
  67. package/dist/chat/controllers/thread.controller.d.ts +2 -2
  68. package/dist/chat/dto/label-group.dto.d.ts +1 -1
  69. package/dist/chat/dto/label.dto.d.ts +1 -2
  70. package/dist/chat/dto/label.dto.js +0 -6
  71. package/dist/chat/dto/label.dto.js.map +1 -1
  72. package/dist/chat/dto/message.dto.d.ts +1 -1
  73. package/dist/chat/dto/subscriber.dto.d.ts +3 -3
  74. package/dist/chat/dto/thread.dto.d.ts +1 -1
  75. package/dist/chat/entities/label-group.entity.d.ts +1 -3
  76. package/dist/chat/entities/label.entity.d.ts +1 -5
  77. package/dist/chat/entities/label.entity.js +0 -5
  78. package/dist/chat/entities/label.entity.js.map +1 -1
  79. package/dist/chat/entities/message.entity.d.ts +2 -2
  80. package/dist/chat/entities/subscriber.entity.d.ts +4 -4
  81. package/dist/chat/entities/subscriber.entity.js +3 -1
  82. package/dist/chat/entities/subscriber.entity.js.map +1 -1
  83. package/dist/chat/entities/thread.entity.d.ts +2 -2
  84. package/dist/chat/repositories/label-group.repository.d.ts +1 -1
  85. package/dist/chat/repositories/label.repository.d.ts +1 -1
  86. package/dist/chat/repositories/message.repository.d.ts +1 -1
  87. package/dist/chat/repositories/subscriber.repository.d.ts +1 -1
  88. package/dist/chat/repositories/thread.repository.d.ts +1 -1
  89. package/dist/chat/services/chat.service.d.ts +4 -4
  90. package/dist/chat/services/label-group.service.d.ts +1 -1
  91. package/dist/chat/services/label.service.d.ts +1 -1
  92. package/dist/chat/services/message.service.d.ts +2 -2
  93. package/dist/chat/services/subscriber.service.d.ts +5 -6
  94. package/dist/chat/services/subscriber.service.js +2 -2
  95. package/dist/chat/services/subscriber.service.js.map +1 -1
  96. package/dist/chat/services/thread.service.d.ts +2 -2
  97. package/dist/chat/types/channel.d.ts +1 -1
  98. package/dist/cms/controllers/content-type.controller.d.ts +1 -1
  99. package/dist/cms/controllers/content.controller.d.ts +1 -1
  100. package/dist/cms/controllers/menu.controller.d.ts +2 -2
  101. package/dist/cms/dto/content.dto.d.ts +1 -1
  102. package/dist/cms/dto/contentType.dto.d.ts +2 -2
  103. package/dist/cms/dto/menu.dto.d.ts +1 -1
  104. package/dist/cms/entities/content-type.entity.d.ts +2 -2
  105. package/dist/cms/entities/content-type.entity.js +3 -2
  106. package/dist/cms/entities/content-type.entity.js.map +1 -1
  107. package/dist/cms/entities/content.entity.d.ts +2 -2
  108. package/dist/cms/entities/content.entity.js +4 -3
  109. package/dist/cms/entities/content.entity.js.map +1 -1
  110. package/dist/cms/entities/menu.entity.d.ts +1 -1
  111. package/dist/cms/repositories/content-type.repository.d.ts +1 -1
  112. package/dist/cms/repositories/content.repository.d.ts +1 -1
  113. package/dist/cms/repositories/menu.repository.d.ts +1 -1
  114. package/dist/cms/services/content-type.service.d.ts +2 -2
  115. package/dist/cms/services/content-type.service.js.map +1 -1
  116. package/dist/cms/services/content.service.d.ts +1 -1
  117. package/dist/cms/services/menu.service.d.ts +1 -1
  118. package/dist/cms/services/rag-backend.service.d.ts +2 -2
  119. package/dist/cms/services/rag-indexer.service.d.ts +2 -2
  120. package/dist/cms/services/rag-retriever.service.d.ts +1 -1
  121. package/dist/cms/services/rag.service.d.ts +4 -4
  122. package/dist/config/index.js +14 -2
  123. package/dist/config/index.js.map +1 -1
  124. package/dist/config/types.d.ts +9 -0
  125. package/dist/database/decorators/json-column.decorator.js +1 -0
  126. package/dist/database/decorators/json-column.decorator.js.map +1 -1
  127. package/dist/database/entities/base.entity.d.ts +1 -1
  128. package/dist/database/typeorm-config.service.js +1 -1
  129. package/dist/database/typeorm-config.service.js.map +1 -1
  130. package/dist/extension/cleanup.service.d.ts +3 -3
  131. package/dist/extension/extension.module.d.ts +1 -1
  132. package/dist/extension/types.d.ts +1 -1
  133. package/dist/extensions/actions/ai/agent.action.d.ts +3 -3
  134. package/dist/extensions/actions/ai/ai-base.action.d.ts +5 -5
  135. package/dist/extensions/actions/ai/generate-object.action.d.ts +2 -2
  136. package/dist/extensions/actions/ai/generate-object.base.action.d.ts +3 -3
  137. package/dist/extensions/actions/ai/generate-reply.action.d.ts +2 -2
  138. package/dist/extensions/actions/ai/generate-text.action.d.ts +2 -2
  139. package/dist/extensions/actions/ai/generate-text.base.action.d.ts +3 -3
  140. package/dist/extensions/actions/ai/infer-object.action.d.ts +2 -2
  141. package/dist/extensions/actions/ai/mcp.binding.js +4 -3
  142. package/dist/extensions/actions/ai/mcp.binding.js.map +1 -1
  143. package/dist/extensions/actions/ai/retrieve-content-rag.action.d.ts +1 -1
  144. package/dist/extensions/actions/memory/update-memory.action.d.ts +4 -4
  145. package/dist/extensions/actions/messaging/attachment.action.d.ts +3 -3
  146. package/dist/extensions/actions/messaging/await-reply.action.d.ts +4 -4
  147. package/dist/extensions/actions/messaging/buttons.action.d.ts +3 -3
  148. package/dist/extensions/actions/messaging/list.action.d.ts +3 -3
  149. package/dist/extensions/actions/messaging/message-action.base.d.ts +6 -6
  150. package/dist/extensions/actions/messaging/quick-replies.action.d.ts +3 -3
  151. package/dist/extensions/actions/messaging/text-message.action.d.ts +3 -3
  152. package/dist/extensions/actions/subscriber/handover.action.d.ts +1 -1
  153. package/dist/extensions/actions/subscriber/update-labels.action.d.ts +1 -1
  154. package/dist/extensions/actions/web/http-request.action.d.ts +1 -1
  155. package/dist/extensions/actions/web/http-request.action.js +15 -4
  156. package/dist/extensions/actions/web/http-request.action.js.map +1 -1
  157. package/dist/extensions/actions/web/send-mail.action.d.ts +4 -4
  158. package/dist/extensions/channels/web/base-web-channel.d.ts +8 -6
  159. package/dist/extensions/channels/web/base-web-channel.js +37 -17
  160. package/dist/extensions/channels/web/base-web-channel.js.map +1 -1
  161. package/dist/extensions/channels/web/inbound/events/base-web-inbound.event.d.ts +3 -3
  162. package/dist/extensions/channels/web/inbound/events/delivery.event.d.ts +2 -2
  163. package/dist/extensions/channels/web/inbound/events/messages/attachment.event.d.ts +2 -2
  164. package/dist/extensions/channels/web/inbound/events/messages/location.event.d.ts +2 -2
  165. package/dist/extensions/channels/web/inbound/events/messages/payload.event.d.ts +2 -2
  166. package/dist/extensions/channels/web/inbound/events/messages/postback.event.d.ts +2 -2
  167. package/dist/extensions/channels/web/inbound/events/messages/quick-reply.event.d.ts +2 -2
  168. package/dist/extensions/channels/web/inbound/events/messages/text.event.d.ts +2 -2
  169. package/dist/extensions/channels/web/inbound/events/messages/web-message.event.d.ts +3 -3
  170. package/dist/extensions/channels/web/inbound/events/read.event.d.ts +2 -2
  171. package/dist/extensions/channels/web/inbound/events/typing.event.d.ts +2 -2
  172. package/dist/extensions/channels/web/inbound/events/unsupported.event.d.ts +2 -2
  173. package/dist/extensions/channels/web/inbound/web-inbound-event-decoder.d.ts +2 -2
  174. package/dist/extensions/channels/web/inbound/web-inbound-message-encoder.d.ts +1 -1
  175. package/dist/extensions/channels/web/outbound/web-outbound-message-encoder.d.ts +4 -4
  176. package/dist/extensions/channels/web/outbound/web-outbound-message-encoder.js +4 -4
  177. package/dist/extensions/channels/web/outbound/web-outbound-message-encoder.js.map +1 -1
  178. package/dist/extensions/channels/web/services/web-history.service.d.ts +2 -2
  179. package/dist/extensions/channels/web/services/web-session.service.d.ts +12 -6
  180. package/dist/extensions/channels/web/services/web-session.service.js +15 -0
  181. package/dist/extensions/channels/web/services/web-session.service.js.map +1 -1
  182. package/dist/extensions/helpers/local-storage/index.helper.d.ts +2 -2
  183. package/dist/health/health.service.d.ts +3 -3
  184. package/dist/helper/helper.service.d.ts +2 -2
  185. package/dist/helper/lib/base-helper.d.ts +2 -2
  186. package/dist/helper/lib/base-storage-helper.d.ts +1 -1
  187. package/dist/helper/types.d.ts +1 -1
  188. package/dist/i18n/controllers/language.controller.d.ts +1 -1
  189. package/dist/i18n/controllers/translation.controller.d.ts +1 -1
  190. package/dist/i18n/dto/language.dto.d.ts +1 -1
  191. package/dist/i18n/dto/translation.dto.d.ts +1 -1
  192. package/dist/i18n/entities/language.entity.d.ts +1 -1
  193. package/dist/i18n/entities/translation.entity.d.ts +1 -1
  194. package/dist/i18n/repositories/language.repository.d.ts +1 -1
  195. package/dist/i18n/repositories/translation.repository.d.ts +1 -1
  196. package/dist/i18n/seeds/language.seed.d.ts +1 -1
  197. package/dist/i18n/seeds/translation.seed.d.ts +1 -1
  198. package/dist/i18n/services/i18n.service.d.ts +2 -2
  199. package/dist/i18n/services/language.service.d.ts +1 -1
  200. package/dist/i18n/services/translation.service.d.ts +3 -3
  201. package/dist/license/services/lemon-squeezy.service.js +2 -2
  202. package/dist/license/services/lemon-squeezy.service.js.map +1 -1
  203. package/dist/license/services/license.service.d.ts +5 -5
  204. package/dist/mailer/mailer.module.js +1 -49
  205. package/dist/mailer/mailer.module.js.map +1 -1
  206. package/dist/mailer/mailer.service.d.ts +11 -2
  207. package/dist/mailer/mailer.service.js +69 -3
  208. package/dist/mailer/mailer.service.js.map +1 -1
  209. package/dist/mcp/controllers/mcp-token.controller.d.ts +47 -0
  210. package/dist/mcp/controllers/mcp-token.controller.js +70 -0
  211. package/dist/mcp/controllers/mcp-token.controller.js.map +1 -0
  212. package/dist/mcp/decorators/mcp-permission.decorator.d.ts +8 -0
  213. package/dist/mcp/decorators/mcp-permission.decorator.js +11 -0
  214. package/dist/mcp/decorators/mcp-permission.decorator.js.map +1 -0
  215. package/dist/mcp/dto/mcp-token.dto.d.ts +17 -0
  216. package/dist/mcp/dto/mcp-token.dto.js +40 -0
  217. package/dist/mcp/dto/mcp-token.dto.js.map +1 -0
  218. package/dist/mcp/entities/mcp-token.entity.d.ts +111 -0
  219. package/dist/mcp/entities/mcp-token.entity.js +69 -0
  220. package/dist/mcp/entities/mcp-token.entity.js.map +1 -0
  221. package/dist/mcp/guards/hexabot-mcp-token.guard.d.ts +9 -0
  222. package/dist/mcp/guards/hexabot-mcp-token.guard.js +49 -0
  223. package/dist/mcp/guards/hexabot-mcp-token.guard.js.map +1 -0
  224. package/dist/mcp/guards/mcp-permission.guard.d.ts +9 -0
  225. package/dist/mcp/guards/mcp-permission.guard.js +47 -0
  226. package/dist/mcp/guards/mcp-permission.guard.js.map +1 -0
  227. package/dist/mcp/mcp-api.module.d.ts +2 -0
  228. package/dist/mcp/mcp-api.module.js +65 -0
  229. package/dist/mcp/mcp-api.module.js.map +1 -0
  230. package/dist/mcp/repositories/mcp-token.repository.d.ts +8 -0
  231. package/dist/mcp/repositories/mcp-token.repository.js +41 -0
  232. package/dist/mcp/repositories/mcp-token.repository.js.map +1 -0
  233. package/dist/mcp/services/mcp-token.service.d.ts +24 -0
  234. package/dist/mcp/services/mcp-token.service.js +106 -0
  235. package/dist/mcp/services/mcp-token.service.js.map +1 -0
  236. package/dist/mcp/tools/hexabot-mcp.tools.d.ts +1141 -0
  237. package/dist/mcp/tools/hexabot-mcp.tools.js +957 -0
  238. package/dist/mcp/tools/hexabot-mcp.tools.js.map +1 -0
  239. package/dist/mcp/types.d.ts +7 -0
  240. package/dist/{utils/types/extension.js → mcp/types.js} +1 -1
  241. package/dist/mcp/types.js.map +1 -0
  242. package/dist/migration/migration.command.d.ts +1 -1
  243. package/dist/migration/migration.service.d.ts +3 -3
  244. package/dist/migration/types.d.ts +2 -2
  245. package/dist/setting/base-setting-group.d.ts +2 -2
  246. package/dist/setting/controllers/setting.controller.d.ts +1 -1
  247. package/dist/setting/create-setting-group.d.ts +2 -2
  248. package/dist/setting/dto/metadata.dto.d.ts +1 -1
  249. package/dist/setting/dto/setting.dto.d.ts +1 -1
  250. package/dist/setting/entities/metadata.entity.d.ts +1 -1
  251. package/dist/setting/entities/setting.entity.d.ts +1 -1
  252. package/dist/setting/repositories/metadata.repository.d.ts +1 -1
  253. package/dist/setting/repositories/setting.repository.d.ts +1 -1
  254. package/dist/setting/runtime-settings.seed.d.ts +3 -3
  255. package/dist/setting/seeds/metadata.seed.d.ts +1 -1
  256. package/dist/setting/seeds/setting.seed.d.ts +1 -1
  257. package/dist/setting/services/metadata.service.d.ts +1 -1
  258. package/dist/setting/services/runtime-settings.service.d.ts +1 -1
  259. package/dist/setting/services/setting.service.d.ts +4 -4
  260. package/dist/static/assets/browser-ponyfill-DN-Mu1Dr.js +2 -0
  261. package/dist/static/assets/{cssMode-ClQbC1-G.js → cssMode-BCWxI_Ux.js} +1 -1
  262. package/dist/static/assets/{freemarker2-DRxgvoL0.js → freemarker2-CFvevPey.js} +1 -1
  263. package/dist/static/assets/{handlebars-CTQECjcj.js → handlebars-BCStA9Eg.js} +1 -1
  264. package/dist/static/assets/{html-DvVbNWXL.js → html-DkIwCA7q.js} +1 -1
  265. package/dist/static/assets/{htmlMode-DHCoon1T.js → htmlMode-DHeMkUp8.js} +1 -1
  266. package/dist/static/assets/{index-BgFwJPy7.js → index-C6VeVxYx.js} +2152 -2149
  267. package/dist/static/assets/{javascript-CiEs6Ej5.js → javascript-DLPKJzLc.js} +1 -1
  268. package/dist/static/assets/{jsonMode-DTfAuumC.js → jsonMode-BUIDFK3O.js} +1 -1
  269. package/dist/static/assets/{liquid-B714yIaN.js → liquid-B0XmwdKh.js} +1 -1
  270. package/dist/static/assets/{lspLanguageFeatures-r73pyfl4.js → lspLanguageFeatures-Fcpw3Ev_.js} +1 -1
  271. package/dist/static/assets/{mdx-D5IAs7yq.js → mdx-DmJKi-dU.js} +1 -1
  272. package/dist/static/assets/{python-ehBpsG6S.js → python-B1WnWY4I.js} +1 -1
  273. package/dist/static/assets/{razor-V-Gitx5J.js → razor-CL2s-6qt.js} +1 -1
  274. package/dist/static/assets/{tsMode-D_iFxZ-O.js → tsMode-DSFhDcf0.js} +1 -1
  275. package/dist/static/assets/{typescript-CEGzsf5j.js → typescript-CmHv7Jwl.js} +1 -1
  276. package/dist/static/assets/{xml-N5EKZaXL.js → xml-Cyy6zXDM.js} +1 -1
  277. package/dist/static/assets/{yaml-IWZvbW4T.js → yaml-D_D6TAHE.js} +1 -1
  278. package/dist/static/assets/{yaml.worker.entry-BdO9k22I.js → yaml.worker.entry-BB81z30Q.js} +228 -228
  279. package/dist/static/index.html +1 -1
  280. package/dist/static/locales/en/translation.json +26 -2
  281. package/dist/static/locales/fr/translation.json +26 -2
  282. package/dist/tsconfig.build.tsbuildinfo +1 -1
  283. package/dist/user/controllers/auth.controller.d.ts +2 -2
  284. package/dist/user/controllers/credential.controller.d.ts +1 -1
  285. package/dist/user/controllers/model.controller.d.ts +3 -3
  286. package/dist/user/controllers/permission.controller.d.ts +2 -2
  287. package/dist/user/controllers/role.controller.d.ts +1 -1
  288. package/dist/user/controllers/user.controller.d.ts +3 -5
  289. package/dist/user/dto/credential.dto.d.ts +1 -1
  290. package/dist/user/dto/model.dto.d.ts +1 -1
  291. package/dist/user/dto/permission.dto.d.ts +1 -1
  292. package/dist/user/dto/role.dto.d.ts +1 -1
  293. package/dist/user/dto/user-profile.dto.d.ts +1 -1
  294. package/dist/user/dto/user.dto.d.ts +2 -2
  295. package/dist/user/entities/credential.entity.d.ts +1 -1
  296. package/dist/user/entities/model.entity.d.ts +2 -2
  297. package/dist/user/entities/model.entity.js +4 -3
  298. package/dist/user/entities/model.entity.js.map +1 -1
  299. package/dist/user/entities/permission.entity.d.ts +3 -3
  300. package/dist/user/entities/permission.entity.js +7 -7
  301. package/dist/user/entities/permission.entity.js.map +1 -1
  302. package/dist/user/entities/role.entity.d.ts +2 -2
  303. package/dist/user/entities/role.entity.js +3 -2
  304. package/dist/user/entities/role.entity.js.map +1 -1
  305. package/dist/user/entities/user-profile.entity.d.ts +3 -3
  306. package/dist/user/entities/user.entity.d.ts +1 -3
  307. package/dist/user/guards/ability.guard.js +12 -2
  308. package/dist/user/guards/ability.guard.js.map +1 -1
  309. package/dist/user/repositories/credential.repository.d.ts +1 -1
  310. package/dist/user/repositories/model.repository.d.ts +1 -1
  311. package/dist/user/repositories/permission.repository.d.ts +1 -1
  312. package/dist/user/repositories/role.repository.d.ts +1 -1
  313. package/dist/user/repositories/user.repository.d.ts +1 -1
  314. package/dist/user/seeds/model.seed.d.ts +1 -1
  315. package/dist/user/seeds/permission.seed.d.ts +1 -1
  316. package/dist/user/seeds/role.seed.d.ts +1 -1
  317. package/dist/user/seeds/user.seed.d.ts +1 -1
  318. package/dist/user/services/credential.service.d.ts +1 -1
  319. package/dist/user/services/model.service.d.ts +1 -1
  320. package/dist/user/services/passwordReset.service.d.ts +4 -4
  321. package/dist/user/services/permission.service.d.ts +1 -1
  322. package/dist/user/services/role.service.d.ts +1 -1
  323. package/dist/user/services/user.service.d.ts +1 -1
  324. package/dist/user/services/validate-account.service.d.ts +4 -4
  325. package/dist/utils/decorators/roles.decorator.d.ts +1 -1
  326. package/dist/utils/generics/base-orm.controller.d.ts +2 -2
  327. package/dist/utils/generics/base-orm.repository.d.ts +2 -2
  328. package/dist/utils/generics/base-orm.seeder.d.ts +1 -1
  329. package/dist/utils/generics/base-orm.service.d.ts +2 -2
  330. package/dist/utils/generics/extension.d.ts +3 -4
  331. package/dist/utils/generics/extension.js.map +1 -1
  332. package/dist/utils/helpers/zod.d.ts +1 -1
  333. package/dist/utils/index.d.ts +0 -1
  334. package/dist/utils/index.js +0 -1
  335. package/dist/utils/index.js.map +1 -1
  336. package/dist/utils/pipes/uuid.pipe.js +3 -3
  337. package/dist/utils/pipes/uuid.pipe.js.map +1 -1
  338. package/dist/utils/test/dummy/controllers/dummy.controller.d.ts +1 -1
  339. package/dist/utils/test/dummy/dto/dummy.dto.d.ts +1 -1
  340. package/dist/utils/test/dummy/dummy.action.d.ts +1 -1
  341. package/dist/utils/test/dummy/entities/dummy.entity.d.ts +1 -1
  342. package/dist/utils/test/dummy/repositories/dummy.repository.d.ts +1 -1
  343. package/dist/utils/test/dummy/services/dummy.service.d.ts +1 -1
  344. package/dist/utils/test/fixtures/attachment.d.ts +1 -1
  345. package/dist/utils/test/fixtures/content.d.ts +2 -2
  346. package/dist/utils/test/fixtures/contenttype.d.ts +2 -2
  347. package/dist/utils/test/fixtures/contenttype.js +2 -2
  348. package/dist/utils/test/fixtures/contenttype.js.map +1 -1
  349. package/dist/utils/test/fixtures/dummy.d.ts +2 -2
  350. package/dist/utils/test/fixtures/label-group.d.ts +4 -5
  351. package/dist/utils/test/fixtures/label.d.ts +3 -4
  352. package/dist/utils/test/fixtures/label.js +0 -19
  353. package/dist/utils/test/fixtures/label.js.map +1 -1
  354. package/dist/utils/test/fixtures/language.d.ts +2 -2
  355. package/dist/utils/test/fixtures/mcp-server.d.ts +3 -3
  356. package/dist/utils/test/fixtures/memory-definition.d.ts +2 -2
  357. package/dist/utils/test/fixtures/memory-record.d.ts +2 -2
  358. package/dist/utils/test/fixtures/menu.d.ts +1 -1
  359. package/dist/utils/test/fixtures/message.d.ts +1 -1
  360. package/dist/utils/test/fixtures/migration.d.ts +1 -1
  361. package/dist/utils/test/fixtures/model.d.ts +2 -2
  362. package/dist/utils/test/fixtures/permission.d.ts +4 -4
  363. package/dist/utils/test/fixtures/role.d.ts +2 -2
  364. package/dist/utils/test/fixtures/setting.d.ts +1 -1
  365. package/dist/utils/test/fixtures/stats.d.ts +1 -1
  366. package/dist/utils/test/fixtures/subscriber.d.ts +4 -4
  367. package/dist/utils/test/fixtures/translation.d.ts +1 -1
  368. package/dist/utils/test/fixtures/user.d.ts +2 -2
  369. package/dist/utils/test/fixtures/workflow-run.d.ts +2 -2
  370. package/dist/utils/test/fixtures/workflow.d.ts +2 -2
  371. package/dist/utils/test/providers/i18n-service.provider.d.ts +1 -1
  372. package/dist/utils/test/providers/i18n-service.provider.js +2 -2
  373. package/dist/utils/test/providers/i18n-service.provider.js.map +1 -1
  374. package/dist/utils/test/providers/mailer-service.provider.d.ts +3 -3
  375. package/dist/utils/test/providers/mailer-service.provider.js +2 -2
  376. package/dist/utils/test/providers/mailer-service.provider.js.map +1 -1
  377. package/dist/utils/test/providers/setting-service.provider.d.ts +1 -1
  378. package/dist/utils/test/providers/setting-service.provider.js +2 -2
  379. package/dist/utils/test/providers/setting-service.provider.js.map +1 -1
  380. package/dist/utils/test/test.d.ts +4 -0
  381. package/dist/utils/test/test.js +34 -1
  382. package/dist/utils/test/test.js.map +1 -1
  383. package/dist/utils/test/types.d.ts +1 -1
  384. package/dist/utils/test/utils.d.ts +2 -1
  385. package/dist/utils/test/utils.js +203 -46
  386. package/dist/utils/test/utils.js.map +1 -1
  387. package/dist/utils/types/dto.types.d.ts +1 -1
  388. package/dist/utils/types/entity-event.types.d.ts +1 -1
  389. package/dist/websocket/services/socket-event-dispatcher.service.d.ts +1 -1
  390. package/dist/websocket/websocket.gateway.d.ts +6 -6
  391. package/dist/websocket/websocket.gateway.js +2 -2
  392. package/dist/websocket/websocket.gateway.js.map +1 -1
  393. package/dist/workflow/contexts/conversational-workflow.context.d.ts +1 -1
  394. package/dist/workflow/contexts/workflow-runtime.context.d.ts +10 -10
  395. package/dist/workflow/contexts/workflow-runtime.context.js +6 -6
  396. package/dist/workflow/contexts/workflow-runtime.context.js.map +1 -1
  397. package/dist/workflow/controllers/mcp-server.controller.d.ts +1 -1
  398. package/dist/workflow/controllers/memory-definition.controller.d.ts +1 -1
  399. package/dist/workflow/controllers/workflow-run.controller.d.ts +1 -1
  400. package/dist/workflow/controllers/workflow-version.controller.d.ts +1 -1
  401. package/dist/workflow/controllers/workflow.controller.d.ts +4 -4
  402. package/dist/workflow/controllers/workflow.controller.js +9 -9
  403. package/dist/workflow/controllers/workflow.controller.js.map +1 -1
  404. package/dist/workflow/dto/mcp-server.dto.d.ts +1 -1
  405. package/dist/workflow/dto/memory-definition.dto.d.ts +1 -1
  406. package/dist/workflow/dto/memory-record.dto.d.ts +1 -1
  407. package/dist/workflow/dto/workflow-run.dto.d.ts +1 -1
  408. package/dist/workflow/dto/workflow-version.dto.d.ts +1 -1
  409. package/dist/workflow/dto/workflow.dto.d.ts +1 -1
  410. package/dist/workflow/entities/mcp-server.entity.d.ts +2 -2
  411. package/dist/workflow/entities/mcp-server.entity.js +4 -4
  412. package/dist/workflow/entities/mcp-server.entity.js.map +1 -1
  413. package/dist/workflow/entities/memory-definition.entity.d.ts +1 -1
  414. package/dist/workflow/entities/memory-record.entity.d.ts +4 -4
  415. package/dist/workflow/entities/workflow-run.entity.d.ts +4 -4
  416. package/dist/workflow/entities/workflow-version.entity.d.ts +3 -3
  417. package/dist/workflow/entities/workflow-version.entity.js +6 -4
  418. package/dist/workflow/entities/workflow-version.entity.js.map +1 -1
  419. package/dist/workflow/entities/workflow.entity.d.ts +2 -2
  420. package/dist/workflow/entities/workflow.entity.js +2 -1
  421. package/dist/workflow/entities/workflow.entity.js.map +1 -1
  422. package/dist/workflow/lib/trigger-event-wrapper.d.ts +1 -1
  423. package/dist/workflow/repositories/mcp-server.repository.d.ts +1 -1
  424. package/dist/workflow/repositories/memory-definition.repository.d.ts +1 -1
  425. package/dist/workflow/repositories/memory-record.repository.d.ts +1 -1
  426. package/dist/workflow/repositories/workflow-run.repository.d.ts +1 -1
  427. package/dist/workflow/repositories/workflow-version.repository.d.ts +1 -1
  428. package/dist/workflow/repositories/workflow.repository.d.ts +1 -1
  429. package/dist/workflow/seeds/memory-definition.seed.d.ts +1 -1
  430. package/dist/workflow/seeds/workflow.seed.d.ts +1 -1
  431. package/dist/workflow/services/agentic.service.d.ts +6 -5
  432. package/dist/workflow/services/agentic.service.js +11 -6
  433. package/dist/workflow/services/agentic.service.js.map +1 -1
  434. package/dist/workflow/services/mcp-client-pool.service.d.ts +2 -2
  435. package/dist/workflow/services/mcp-server.service.d.ts +1 -1
  436. package/dist/workflow/services/memory-definition.service.d.ts +1 -1
  437. package/dist/workflow/services/memory-record.service.d.ts +1 -1
  438. package/dist/workflow/services/memory.service.js +1 -0
  439. package/dist/workflow/services/memory.service.js.map +1 -1
  440. package/dist/workflow/services/workflow-run.service.d.ts +1 -1
  441. package/dist/workflow/services/workflow-scheduler.service.d.ts +3 -3
  442. package/dist/workflow/services/workflow-scheduler.service.js +2 -2
  443. package/dist/workflow/services/workflow-scheduler.service.js.map +1 -1
  444. package/dist/workflow/services/workflow-version.service.d.ts +1 -1
  445. package/dist/workflow/services/workflow.service.d.ts +3 -3
  446. package/dist/workflow/utils/memory-store.js +12 -1
  447. package/dist/workflow/utils/memory-store.js.map +1 -1
  448. package/dist/workflow/workflow.module.js +4 -4
  449. package/dist/workflow/workflow.module.js.map +1 -1
  450. package/package.json +65 -32
  451. package/src/app.controller.ts +1 -0
  452. package/src/app.module.ts +15 -1
  453. package/src/attachment/utilities/index.ts +2 -2
  454. package/src/bootstrap.ts +13 -1
  455. package/src/channel/channel.service.ts +5 -2
  456. package/src/channel/lib/Handler.ts +3 -2
  457. package/src/channel/lib/__test__/label.mock.ts +0 -24
  458. package/src/channel/services/source.service.ts +38 -1
  459. package/src/chat/chat.module.ts +1 -1
  460. package/src/chat/dto/label.dto.ts +1 -12
  461. package/src/chat/entities/label.entity.ts +0 -4
  462. package/src/chat/entities/subscriber.entity.ts +14 -7
  463. package/src/chat/services/subscriber.service.ts +3 -2
  464. package/src/cms/entities/content-type.entity.ts +12 -4
  465. package/src/cms/entities/content.entity.ts +13 -5
  466. package/src/cms/services/content-type.service.ts +1 -1
  467. package/src/cms/services/rag.service.ts +1 -1
  468. package/src/config/index.ts +17 -2
  469. package/src/config/types.ts +9 -0
  470. package/src/database/decorators/json-column.decorator.ts +1 -0
  471. package/src/database/typeorm-config.service.ts +1 -1
  472. package/src/extensions/actions/ai/mcp.binding.ts +4 -3
  473. package/src/extensions/actions/web/http-request.action.ts +23 -4
  474. package/src/extensions/channels/web/base-web-channel.ts +51 -13
  475. package/src/extensions/channels/web/outbound/web-outbound-message-encoder.ts +2 -2
  476. package/src/extensions/channels/web/services/web-session.service.ts +35 -0
  477. package/src/global.d.ts +0 -6
  478. package/src/license/services/lemon-squeezy.service.ts +3 -2
  479. package/src/mailer/mailer.module.ts +1 -54
  480. package/src/mailer/mailer.service.ts +86 -2
  481. package/src/mcp/README.md +244 -0
  482. package/src/mcp/controllers/mcp-token.controller.ts +64 -0
  483. package/src/mcp/decorators/mcp-permission.decorator.ts +23 -0
  484. package/src/mcp/dto/mcp-token.dto.ts +48 -0
  485. package/src/mcp/entities/mcp-token.entity.ts +60 -0
  486. package/src/mcp/guards/hexabot-mcp-token.guard.ts +55 -0
  487. package/src/mcp/guards/mcp-permission.guard.ts +61 -0
  488. package/src/mcp/mcp-api.module.ts +61 -0
  489. package/src/mcp/repositories/mcp-token.repository.ts +34 -0
  490. package/src/mcp/services/mcp-token.service.ts +138 -0
  491. package/src/mcp/tools/hexabot-mcp.tools.ts +1041 -0
  492. package/src/mcp/types.ts +14 -0
  493. package/src/user/entities/model.entity.ts +13 -5
  494. package/src/user/entities/permission.entity.ts +21 -9
  495. package/src/user/entities/role.entity.ts +12 -4
  496. package/src/user/guards/ability.guard.ts +15 -3
  497. package/src/utils/generics/extension.ts +1 -3
  498. package/src/utils/index.ts +0 -2
  499. package/src/utils/pipes/uuid.pipe.ts +3 -3
  500. package/src/utils/test/fixtures/contenttype.ts +1 -1
  501. package/src/utils/test/fixtures/label.ts +0 -19
  502. package/src/utils/test/fixtures/workflow.ts +1 -1
  503. package/src/utils/test/providers/i18n-service.provider.ts +1 -1
  504. package/src/utils/test/providers/mailer-service.provider.ts +1 -1
  505. package/src/utils/test/providers/setting-service.provider.ts +1 -1
  506. package/src/utils/test/test.ts +39 -0
  507. package/src/utils/test/utils.ts +332 -57
  508. package/src/websocket/websocket.gateway.ts +2 -2
  509. package/src/workflow/contexts/workflow-runtime.context.ts +2 -2
  510. package/src/workflow/controllers/workflow.controller.ts +2 -2
  511. package/src/workflow/entities/mcp-server.entity.ts +2 -2
  512. package/src/workflow/entities/workflow-version.entity.ts +8 -3
  513. package/src/workflow/entities/workflow.entity.ts +2 -1
  514. package/src/workflow/services/agentic.service.ts +19 -8
  515. package/src/workflow/services/memory.service.ts +1 -0
  516. package/src/workflow/services/workflow-scheduler.service.ts +1 -1
  517. package/src/workflow/utils/memory-store.ts +13 -1
  518. package/src/workflow/workflow.module.ts +2 -2
  519. package/dist/mailer/mjml-adapter.class.d.ts +0 -4
  520. package/dist/mailer/mjml-adapter.class.js +0 -67
  521. package/dist/mailer/mjml-adapter.class.js.map +0 -1
  522. package/dist/utils/types/extension.d.ts +0 -4
  523. package/dist/utils/types/extension.js.map +0 -1
  524. package/src/mailer/mjml-adapter.class.ts +0 -41
  525. package/src/utils/types/extension.ts +0 -13
@@ -14,6 +14,7 @@ import {
14
14
  DataSource,
15
15
  DataSourceOptions,
16
16
  EntitySchema,
17
+ EntitySubscriberInterface,
17
18
  EntityTarget,
18
19
  getMetadataArgsStorage,
19
20
  } from 'typeorm';
@@ -33,7 +34,7 @@ import { SettingModule } from '@/setting/setting.module';
33
34
 
34
35
  import { I18nTestingModule } from './modules/i18n-testing.module';
35
36
  import { I18nServiceProvider } from './providers/i18n-service.provider';
36
- import { registerTypeOrmDataSource } from './test';
37
+ import { registerTestingModule, registerTypeOrmDataSource } from './test';
37
38
 
38
39
  type TTypeOrToken = [
39
40
  new (...args: any[]) => any,
@@ -51,12 +52,16 @@ type TypeOrmTestingConfig = {
51
52
  fixtures?: TypeOrmFixture | TypeOrmFixture[];
52
53
  dataSourceOptions?: Partial<DataSourceOptions>;
53
54
  };
55
+ type TypeOrmTestingInput =
56
+ | TypeOrmTestingConfig
57
+ | TypeOrmTestingConfig[]
58
+ | false;
54
59
 
55
60
  type buildTestingMocksProps<
56
61
  P extends ModuleMetadata['providers'] = ModuleMetadata['providers'],
57
62
  C extends ModuleMetadata['controllers'] = ModuleMetadata['controllers'],
58
63
  > = ModuleMetadata & {
59
- typeorm?: TypeOrmTestingConfig | TypeOrmTestingConfig[];
64
+ typeorm?: TypeOrmTestingInput;
60
65
  } & (
61
66
  | {
62
67
  providers: NonNullable<P>;
@@ -108,7 +113,10 @@ const getParamTypes = (provider: Provider) =>
108
113
  * @param parentClass - The root provider class whose dependency graph is resolved.
109
114
  * @returns A complete array of unique provider dependencies.
110
115
  */
111
- const getClassDependencies = (parentClass: Provider): Provider[] => {
116
+ const getClassDependencies = (
117
+ parentClass: Provider,
118
+ providedTokens = new Set<Provider>(),
119
+ ): Provider[] => {
112
120
  const dependencies: Provider[] = [];
113
121
  const seenClasses = new Set<Provider>();
114
122
  const classQueue: Provider[] = [parentClass];
@@ -124,7 +132,11 @@ const getClassDependencies = (parentClass: Provider): Provider[] => {
124
132
 
125
133
  if (currentClass) {
126
134
  getParamTypes(currentClass).forEach((paramType: Provider) => {
127
- if (paramType && !seenClasses.has(paramType)) {
135
+ if (
136
+ paramType &&
137
+ !seenClasses.has(paramType) &&
138
+ !providedTokens.has(paramType)
139
+ ) {
128
140
  classQueue.push(paramType);
129
141
  dependencies.push(paramType);
130
142
  }
@@ -136,6 +148,17 @@ const getClassDependencies = (parentClass: Provider): Provider[] => {
136
148
  };
137
149
  const filterNestedDependencies = (dependency: Provider) =>
138
150
  dependency.valueOf().toString().slice(0, 6) === 'class ';
151
+ const resolveProviderToken = (provider: Provider): Provider | undefined => {
152
+ if (
153
+ typeof provider === 'object' &&
154
+ provider !== null &&
155
+ 'provide' in provider
156
+ ) {
157
+ return provider.provide as Provider;
158
+ }
159
+
160
+ return provider;
161
+ };
139
162
  /**
140
163
  * Identifies nested class-based dependencies to be automatically injected into test modules.
141
164
  *
@@ -145,9 +168,14 @@ const filterNestedDependencies = (dependency: Provider) =>
145
168
  const autoInjectExclusions = new Set<Provider>([DataSource]);
146
169
  const getNestedDependencies = (providers: Provider[]): Provider[] => {
147
170
  const nestedDependencies = new Set<Provider>();
171
+ const providedTokens = new Set<Provider>(
172
+ providers
173
+ .map(resolveProviderToken)
174
+ .filter((provider): provider is Provider => provider !== undefined),
175
+ );
148
176
 
149
177
  providers.filter(filterNestedDependencies).forEach((provider) => {
150
- getClassDependencies(provider)
178
+ getClassDependencies(provider, providedTokens)
151
179
  .filter(filterNestedDependencies)
152
180
  .forEach((dependency) => {
153
181
  if (autoInjectExclusions.has(dependency)) {
@@ -213,15 +241,56 @@ const buildEntityLookup = () => {
213
241
 
214
242
  return lookup;
215
243
  };
216
- const registeredSubscribers = new Set<unknown>();
244
+ const addEntityToLookup = (
245
+ lookup: Map<string, EntityTarget<any>>,
246
+ entity: EntityTarget<any> | undefined,
247
+ ): EntityTarget<any> | undefined => {
248
+ if (!entity) {
249
+ return undefined;
250
+ }
251
+
252
+ const key = resolveEntityTargetName(entity);
253
+ if (key) {
254
+ lookup.set(key, entity);
255
+ }
256
+
257
+ return entity;
258
+ };
259
+ const refreshEntityLookup = (lookup: Map<string, EntityTarget<any>>): void => {
260
+ buildEntityLookup().forEach((entity, key) => lookup.set(key, entity));
261
+ };
262
+ const GENERATED_ORM_HOOK_SUBSCRIBER = Symbol('generatedOrmHookSubscriber');
263
+ type SubscriberWithListenTo = EntitySubscriberInterface & {
264
+ listenTo: NonNullable<EntitySubscriberInterface['listenTo']>;
265
+ };
266
+ type GeneratedOrmHookSubscriber = SubscriberWithListenTo & {
267
+ [GENERATED_ORM_HOOK_SUBSCRIBER]: true;
268
+ };
269
+ const isGeneratedOrmHookSubscriber = (
270
+ subscriber: unknown,
271
+ ): subscriber is GeneratedOrmHookSubscriber =>
272
+ Boolean(
273
+ subscriber &&
274
+ typeof subscriber === 'object' &&
275
+ (subscriber as Record<PropertyKey, unknown>)[
276
+ GENERATED_ORM_HOOK_SUBSCRIBER
277
+ ],
278
+ );
279
+ const hasListenTo = (
280
+ subscriber: unknown,
281
+ ): subscriber is SubscriberWithListenTo =>
282
+ Boolean(
283
+ subscriber &&
284
+ typeof subscriber === 'object' &&
285
+ typeof (subscriber as { listenTo?: unknown }).listenTo === 'function',
286
+ );
217
287
  const registerAllRepositorySubscribers = (
218
288
  dataSource: DataSource,
219
289
  entityClasses: (new (...args: any[]) => BaseOrmEntity<any>)[],
220
290
  ): void => {
221
291
  for (const EntityClass of entityClasses) {
222
- if (registeredSubscribers.has(EntityClass)) continue;
223
-
224
292
  const subscriber = {
293
+ [GENERATED_ORM_HOOK_SUBSCRIBER]: true,
225
294
  listenTo: () => EntityClass,
226
295
  ...Object.fromEntries(
227
296
  ORM_HOOK_NAMES.map((name) => [
@@ -238,14 +307,34 @@ const registerAllRepositorySubscribers = (
238
307
  ),
239
308
  };
240
309
  const exists = dataSource.subscribers.some(
241
- (s) => typeof s.listenTo === 'function' && s.listenTo() === EntityClass,
310
+ (subscriber) =>
311
+ hasListenTo(subscriber) && subscriber.listenTo() === EntityClass,
242
312
  );
243
313
  if (!exists) {
244
314
  dataSource.subscribers.push(subscriber as any);
245
- registeredSubscribers.add(EntityClass);
246
315
  }
247
316
  }
248
317
  };
318
+ const pruneGeneratedRepositorySubscribers = (dataSource: DataSource): void => {
319
+ const concreteSubscriberTargets = new Set(
320
+ dataSource.subscribers
321
+ .filter(
322
+ (subscriber): subscriber is SubscriberWithListenTo =>
323
+ !isGeneratedOrmHookSubscriber(subscriber) && hasListenTo(subscriber),
324
+ )
325
+ .map((subscriber) => subscriber.listenTo()),
326
+ );
327
+ const subscribers = dataSource.subscribers.filter(
328
+ (subscriber) =>
329
+ !isGeneratedOrmHookSubscriber(subscriber) ||
330
+ !concreteSubscriberTargets.has(subscriber.listenTo()),
331
+ );
332
+ dataSource.subscribers.splice(
333
+ 0,
334
+ dataSource.subscribers.length,
335
+ ...subscribers,
336
+ );
337
+ };
249
338
  const normalizeRepositoryToken = (token: string): string | undefined => {
250
339
  if (!token.endsWith(TYPEORM_REPOSITORY_SUFFIX)) {
251
340
  return undefined;
@@ -314,22 +403,41 @@ const extractInjectTokensFromProvider = (provider: ProviderLike): unknown[] => {
314
403
 
315
404
  return [];
316
405
  };
317
- const registerMetadataEntities = (
318
- currentEntities: Set<EntityTarget<any>>,
319
- lookup: Map<string, EntityTarget<any>>,
320
- ): void => {
321
- lookup.forEach((entity) => currentEntities.add(entity));
406
+ const dependsOnDataSource = (provider: ProviderLike): boolean => {
407
+ if (!provider) {
408
+ return false;
409
+ }
410
+
411
+ if (typeof provider === 'function') {
412
+ return (
413
+ getParamTypes(provider).includes(DataSource) ||
414
+ extractCustomInjectTokens(provider).includes(DataSource)
415
+ );
416
+ }
417
+
418
+ if (typeof provider === 'object') {
419
+ if ('useClass' in provider && typeof provider.useClass === 'function') {
420
+ return dependsOnDataSource(provider.useClass);
421
+ }
422
+
423
+ if ('inject' in provider && Array.isArray(provider.inject)) {
424
+ return provider.inject.includes(DataSource);
425
+ }
426
+ }
427
+
428
+ return false;
322
429
  };
323
430
  const registerAutoDetectedTypeOrmEntities = (
324
431
  currentEntities: Set<EntityTarget<any>>,
325
432
  providers: Provider[],
326
433
  controllers: ModuleMetadata['controllers'],
327
434
  lookup: Map<string, EntityTarget<any>>,
328
- ) => {
435
+ ): boolean => {
329
436
  if (!lookup.size) {
330
- return;
437
+ return false;
331
438
  }
332
439
 
440
+ let detected = false;
333
441
  const controllerList = Array.isArray(controllers) ? controllers : [];
334
442
  const tokens = [
335
443
  ...providers.flatMap(extractInjectTokensFromProvider),
@@ -340,8 +448,147 @@ const registerAutoDetectedTypeOrmEntities = (
340
448
  const entity = resolveEntityFromToken(token, lookup);
341
449
  if (entity) {
342
450
  currentEntities.add(entity);
451
+ detected = true;
343
452
  }
344
453
  });
454
+
455
+ return detected;
456
+ };
457
+ const addEntityToSet = (
458
+ entities: Set<EntityTarget<any>>,
459
+ entity: EntityTarget<any> | undefined,
460
+ queue: EntityTarget<any>[],
461
+ ): void => {
462
+ if (!entity || entities.has(entity)) {
463
+ return;
464
+ }
465
+
466
+ entities.add(entity);
467
+ queue.push(entity);
468
+ };
469
+ const isSameEntityTarget = (
470
+ left: EntityTarget<any> | undefined,
471
+ right: EntityTarget<any>,
472
+ ): boolean => {
473
+ if (!left) {
474
+ return false;
475
+ }
476
+
477
+ if (left === right) {
478
+ return true;
479
+ }
480
+
481
+ const leftName = resolveEntityTargetName(left);
482
+ const rightName = resolveEntityTargetName(right);
483
+
484
+ return !!leftName && leftName === rightName;
485
+ };
486
+ const resolveRelationTarget = async (
487
+ relationType: unknown,
488
+ lookup: Map<string, EntityTarget<any>>,
489
+ ): Promise<EntityTarget<any> | undefined> => {
490
+ if (typeof relationType === 'string') {
491
+ return lookup.get(relationType);
492
+ }
493
+
494
+ if (typeof relationType === 'function') {
495
+ try {
496
+ const resolved = relationType();
497
+
498
+ if (typeof resolved === 'string') {
499
+ return resolveRelationTarget(resolved, lookup);
500
+ }
501
+
502
+ return addEntityToLookup(lookup, resolved as EntityTarget<any>);
503
+ } catch {
504
+ return addEntityToLookup(lookup, relationType as EntityTarget<any>);
505
+ }
506
+ }
507
+
508
+ return undefined;
509
+ };
510
+ const registerInheritedTypeOrmEntities = (
511
+ currentEntities: Set<EntityTarget<any>>,
512
+ entity: EntityTarget<any>,
513
+ lookup: Map<string, EntityTarget<any>>,
514
+ queue: EntityTarget<any>[],
515
+ ): void => {
516
+ if (typeof entity !== 'function') {
517
+ return;
518
+ }
519
+
520
+ let prototype = Object.getPrototypeOf(entity.prototype);
521
+
522
+ while (prototype?.constructor && prototype.constructor !== Object) {
523
+ const parent = lookup.get(prototype.constructor.name);
524
+ if (parent) {
525
+ addEntityToSet(currentEntities, parent, queue);
526
+ }
527
+
528
+ prototype = Object.getPrototypeOf(prototype);
529
+ }
530
+ };
531
+ const registerChildTypeOrmEntities = (
532
+ currentEntities: Set<EntityTarget<any>>,
533
+ entity: EntityTarget<any>,
534
+ lookup: Map<string, EntityTarget<any>>,
535
+ queue: EntityTarget<any>[],
536
+ ): void => {
537
+ if (typeof entity !== 'function') {
538
+ return;
539
+ }
540
+
541
+ getMetadataArgsStorage().tables.forEach((table) => {
542
+ if (
543
+ table.type !== 'entity-child' ||
544
+ typeof table.target !== 'function' ||
545
+ !entity.prototype.isPrototypeOf(table.target.prototype)
546
+ ) {
547
+ return;
548
+ }
549
+
550
+ addEntityToSet(
551
+ currentEntities,
552
+ addEntityToLookup(lookup, table.target as EntityTarget<any>),
553
+ queue,
554
+ );
555
+ });
556
+ };
557
+ const registerRelatedTypeOrmEntities = async (
558
+ currentEntities: Set<EntityTarget<any>>,
559
+ lookup: Map<string, EntityTarget<any>>,
560
+ ): Promise<void> => {
561
+ const queue = Array.from(currentEntities);
562
+
563
+ while (queue.length > 0) {
564
+ const entity = queue.shift()!;
565
+ const storage = getMetadataArgsStorage();
566
+
567
+ refreshEntityLookup(lookup);
568
+ registerInheritedTypeOrmEntities(currentEntities, entity, lookup, queue);
569
+ registerChildTypeOrmEntities(currentEntities, entity, lookup, queue);
570
+
571
+ const relations = storage.relations.filter((relation) =>
572
+ isSameEntityTarget(relation.target as EntityTarget<any>, entity),
573
+ );
574
+
575
+ for (const relation of relations) {
576
+ const relationEntity = await resolveRelationTarget(relation.type, lookup);
577
+ addEntityToSet(currentEntities, relationEntity, queue);
578
+ }
579
+
580
+ for (const relation of storage.relations) {
581
+ const relationEntity = await resolveRelationTarget(relation.type, lookup);
582
+
583
+ if (isSameEntityTarget(relationEntity, entity)) {
584
+ addEntityToSet(
585
+ currentEntities,
586
+ addEntityToLookup(lookup, relation.target as EntityTarget<any>),
587
+ queue,
588
+ );
589
+ }
590
+ }
591
+ }
345
592
  };
346
593
 
347
594
  /**
@@ -421,27 +668,33 @@ export const buildTestingMocks = async ({
421
668
  overrideTokens.has(provider as unknown as Provider)
422
669
  ),
423
670
  );
424
- const defaultTypeOrmEntities: EntityTarget<any>[] = [
425
- SettingOrmEntity,
426
- MetadataOrmEntity,
427
- LanguageOrmEntity,
428
- ];
429
- const typeOrmEntities = new Set<EntityTarget<any>>(defaultTypeOrmEntities);
671
+ const typeOrmDisabled = typeorm === false;
672
+ let typeOrmOptions: Partial<DataSourceOptions> | undefined;
673
+ const typeOrmFixtures: TypeOrmFixture[] = [];
674
+ const typeOrmConfigs =
675
+ !typeOrmDisabled && Array.isArray(typeorm)
676
+ ? typeorm.filter(Boolean)
677
+ : !typeOrmDisabled && typeorm
678
+ ? [typeorm]
679
+ : [];
680
+ const hasExplicitTypeOrmConfig = typeOrmConfigs.length > 0;
681
+ const typeOrmEntities = new Set<EntityTarget<any>>();
430
682
  const entityLookup = buildEntityLookup();
431
- registerMetadataEntities(typeOrmEntities, entityLookup);
432
- registerAutoDetectedTypeOrmEntities(
683
+ const hasTypeOrmEntityDependencies = registerAutoDetectedTypeOrmEntities(
433
684
  typeOrmEntities,
434
685
  providersList,
435
686
  controllers,
436
687
  entityLookup,
437
688
  );
438
- let typeOrmOptions: Partial<DataSourceOptions> | undefined;
439
- const typeOrmFixtures: TypeOrmFixture[] = [];
440
- const typeOrmConfigs = Array.isArray(typeorm)
441
- ? typeorm.filter(Boolean)
442
- : typeorm
443
- ? [typeorm]
444
- : [];
689
+ const controllerList = Array.isArray(controllers) ? controllers : [];
690
+ const hasDataSourceDependencies = [...providersList, ...controllerList].some(
691
+ dependsOnDataSource,
692
+ );
693
+ const shouldUseTypeOrm =
694
+ !typeOrmDisabled &&
695
+ (hasExplicitTypeOrmConfig ||
696
+ hasTypeOrmEntityDependencies ||
697
+ hasDataSourceDependencies);
445
698
 
446
699
  typeOrmConfigs.forEach((config) => {
447
700
  config.entities?.forEach((entity) => typeOrmEntities.add(entity));
@@ -459,43 +712,61 @@ export const buildTestingMocks = async ({
459
712
  }
460
713
  });
461
714
 
715
+ if (shouldUseTypeOrm && typeOrmEntities.size === 0) {
716
+ entityLookup.forEach((entity) => typeOrmEntities.add(entity));
717
+ }
718
+
719
+ if (shouldUseTypeOrm) {
720
+ [SettingOrmEntity, MetadataOrmEntity, LanguageOrmEntity].forEach((entity) =>
721
+ typeOrmEntities.add(entity),
722
+ );
723
+ await registerRelatedTypeOrmEntities(typeOrmEntities, entityLookup);
724
+ }
725
+
462
726
  const runTypeOrmFixtures = async (dataSource: DataSource) => {
463
727
  for (const fixture of typeOrmFixtures) {
464
728
  await fixture(dataSource);
465
729
  }
466
730
  };
467
731
  const entitiesArray = Array.from(typeOrmEntities);
468
- const baseOptions: DataSourceOptions = {
469
- type: 'sqlite',
470
- database: ':memory:',
471
- synchronize: true,
472
- dropSchema: true,
473
- logging: false,
474
- entities: entitiesArray,
475
- ...(typeOrmOptions ?? {}),
476
- } as DataSourceOptions;
477
- const dataSource = new DataSource(baseOptions);
478
- await dataSource.initialize();
479
- registerAllRepositorySubscribers(dataSource, entitiesArray as any[]);
480
- await runTypeOrmFixtures(dataSource);
481
- registerTypeOrmDataSource(dataSource);
482
-
483
- const typeOrmRootModule: DynamicModule = TypeOrmModule.forRootAsync({
484
- useFactory: async () => baseOptions as DataSourceOptions,
485
- dataSourceFactory: async () => dataSource,
486
- });
487
- const typeOrmProviders = entitiesArray.map((entity) => ({
488
- provide: getRepositoryToken(entity as any),
489
- useValue: dataSource.getRepository(entity),
490
- }));
732
+ let typeOrmRootModule: DynamicModule | undefined;
733
+ let typeOrmProviders: Provider[] = [];
734
+ let typeOrmDataSource: DataSource | undefined;
735
+
736
+ if (shouldUseTypeOrm) {
737
+ const baseOptions: DataSourceOptions = {
738
+ type: 'better-sqlite3',
739
+ database: ':memory:',
740
+ synchronize: true,
741
+ dropSchema: true,
742
+ logging: false,
743
+ entities: entitiesArray,
744
+ ...(typeOrmOptions ?? {}),
745
+ } as DataSourceOptions;
746
+ const dataSource = new DataSource(baseOptions);
747
+ await dataSource.initialize();
748
+ typeOrmDataSource = dataSource;
749
+ registerAllRepositorySubscribers(dataSource, entitiesArray as any[]);
750
+ await runTypeOrmFixtures(dataSource);
751
+ registerTypeOrmDataSource(dataSource);
752
+
753
+ typeOrmRootModule = TypeOrmModule.forRootAsync({
754
+ useFactory: async () => baseOptions as DataSourceOptions,
755
+ dataSourceFactory: async () => dataSource,
756
+ });
757
+ typeOrmProviders = entitiesArray.map((entity) => ({
758
+ provide: getRepositoryToken(entity as any),
759
+ useValue: dataSource.getRepository(entity),
760
+ }));
761
+ }
762
+
491
763
  const testingModuleBuilder = Test.createTestingModule({
492
764
  imports: [
493
765
  LoggerModule,
494
766
  EventEmitterModule.forRoot({ global: true }),
495
767
  CacheModule.register({ isGlobal: true }),
496
- typeOrmRootModule,
497
768
  I18nTestingModule,
498
- SettingModule,
769
+ ...(typeOrmRootModule ? [typeOrmRootModule, SettingModule] : []),
499
770
  ...imports,
500
771
  ],
501
772
  providers: [
@@ -507,6 +778,10 @@ export const buildTestingMocks = async ({
507
778
  ...rest,
508
779
  });
509
780
  const module = await testingModuleBuilder.compile();
781
+ if (typeOrmDataSource) {
782
+ pruneGeneratedRepositorySubscribers(typeOrmDataSource);
783
+ }
784
+ registerTestingModule(module);
510
785
 
511
786
  return {
512
787
  module,
@@ -18,6 +18,7 @@ import {
18
18
  WebSocketGateway,
19
19
  WebSocketServer,
20
20
  } from '@nestjs/websockets';
21
+ import { isUUID } from 'class-validator';
21
22
  import Cookie from 'cookie';
22
23
  import signature from 'cookie-signature';
23
24
  import { Request } from 'express';
@@ -25,7 +26,6 @@ import { Session as ExpressSession, SessionData } from 'express-session';
25
26
  import { ExtendedError, Server, Socket } from 'socket.io';
26
27
  import { DataSource } from 'typeorm';
27
28
  import { sync as uid } from 'uid-safe';
28
- import { validate as isUuid } from 'uuid';
29
29
 
30
30
  import { SourceOrmEntity } from '@/channel/entities/source.entity';
31
31
  import { config } from '@/config';
@@ -179,7 +179,7 @@ export class WebsocketGateway
179
179
  }
180
180
 
181
181
  private normalizeSourceId(value: string | null): string | null {
182
- if (!value || !isUuid(value)) {
182
+ if (!value || !isUUID(value)) {
183
183
  return null;
184
184
  }
185
185
 
@@ -9,7 +9,7 @@ import { WorkflowRunFull } from '@hexabot-ai/types';
9
9
  import { forwardRef, Inject, Injectable, Scope } from '@nestjs/common';
10
10
  import { EventEmitter2 } from '@nestjs/event-emitter';
11
11
 
12
- import { ActionService } from '@/actions';
12
+ import { ActionService } from '@/actions/actions.service';
13
13
  import { MessageService } from '@/chat/services/message.service';
14
14
  import { SubscriberService } from '@/chat/services/subscriber.service';
15
15
  import { ContentTypeService } from '@/cms/services/content-type.service';
@@ -17,7 +17,7 @@ import { ContentService } from '@/cms/services/content.service';
17
17
  import { I18nService } from '@/i18n/services/i18n.service';
18
18
  import { LoggerService } from '@/logger/logger.service';
19
19
  import { SettingService } from '@/setting/services/setting.service';
20
- import { CredentialService } from '@/user';
20
+ import { CredentialService } from '@/user/services/credential.service';
21
21
  import { cloneObject } from '@/utils/helpers/clone';
22
22
  import { WorkflowContextState, WorkflowType } from '@/workflow/types';
23
23
 
@@ -27,8 +27,8 @@ import { DeleteResult } from 'typeorm/driver/mongodb/typings';
27
27
 
28
28
  import { ActionService } from '@/actions/actions.service';
29
29
  import { I18nService } from '@/i18n/services/i18n.service';
30
- import { UserService } from '@/user';
31
- import { UuidParam } from '@/utils';
30
+ import { UserService } from '@/user/services/user.service';
31
+ import { UuidParam } from '@/utils/decorators/uuid-param.decorator';
32
32
  import { BaseOrmController } from '@/utils/generics/base-orm.controller';
33
33
  import { PopulatePipe } from '@/utils/pipes/populate.pipe';
34
34
  import { TypeOrmSearchFilterPipe } from '@/utils/pipes/typeorm-search-filter.pipe';
@@ -24,8 +24,8 @@ import {
24
24
  OnBeforeUpdate,
25
25
  } from '@/database/decorators/orm-event-hooks.decorator';
26
26
  import { BaseOrmEntity } from '@/database/entities/base.entity';
27
- import { CredentialOrmEntity } from '@/user';
28
- import { AsRelation } from '@/utils';
27
+ import { CredentialOrmEntity } from '@/user/entities/credential.entity';
28
+ import { AsRelation } from '@/utils/decorators/relation-ref.decorator';
29
29
 
30
30
  import { McpServerDto } from '../dto/mcp-server.dto';
31
31
  import { McpServerTransport } from '../types';
@@ -5,6 +5,7 @@
5
5
  */
6
6
 
7
7
  import { createHash } from 'crypto';
8
+ import { createRequire } from 'node:module';
8
9
 
9
10
  import {
10
11
  workflowVersionSchema,
@@ -32,7 +33,9 @@ import { AsRelation } from '@/utils';
32
33
  import { WorkflowVersionDto } from '../dto/workflow-version.dto';
33
34
  import { WorkflowVersionAction } from '../types';
34
35
 
35
- import { WorkflowOrmEntity } from './workflow.entity';
36
+ import type { WorkflowOrmEntity } from './workflow.entity';
37
+
38
+ const requireEntity = createRequire(__filename);
36
39
 
37
40
  @Entity({ name: 'workflow_versions' })
38
41
  @Index(['workflow', 'version'], { unique: true })
@@ -42,7 +45,7 @@ export class WorkflowVersionOrmEntity extends BaseOrmEntity<WorkflowVersionDto>
42
45
  fullCls = workflowVersionFullSchema;
43
46
 
44
47
  /** Workflow that owns this version snapshot. */
45
- @ManyToOne(() => WorkflowOrmEntity, {
48
+ @ManyToOne(() => requireEntity('./workflow.entity').WorkflowOrmEntity, {
46
49
  nullable: false,
47
50
  onDelete: 'CASCADE',
48
51
  })
@@ -130,7 +133,9 @@ export class WorkflowVersionOrmEntity extends BaseOrmEntity<WorkflowVersionDto>
130
133
  return;
131
134
  }
132
135
 
133
- const workflowRepository = event.manager.getRepository(WorkflowOrmEntity);
136
+ const WorkflowEntity = requireEntity('./workflow.entity').WorkflowOrmEntity;
137
+ const workflowRepository =
138
+ event.manager.getRepository<WorkflowOrmEntity>(WorkflowEntity);
134
139
  const workflow = await workflowRepository.findOne({
135
140
  where: { id: workflowId },
136
141
  });
@@ -181,7 +181,8 @@ export class WorkflowOrmEntity extends BaseOrmEntity<WorkflowDto> {
181
181
  });
182
182
  await event.manager.save(WorkflowVersionOrmEntity, version);
183
183
  } catch (error: any) {
184
- if (error.code !== 'SQLITE_CONSTRAINT') {
184
+ const codes = [error?.code, error?.driverError?.code];
185
+ if (!codes.includes('SQLITE_CONSTRAINT_UNIQUE')) {
185
186
  throw error;
186
187
  }
187
188
  }