@hed-hog/core 0.0.387 → 0.0.390

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 (535) hide show
  1. package/README.md +12 -11
  2. package/dist/access-log/access-log.interceptor.d.ts.map +1 -1
  3. package/dist/access-log/access-log.interceptor.js +4 -2
  4. package/dist/access-log/access-log.interceptor.js.map +1 -1
  5. package/dist/ai/ai-attachment.fragments.d.ts +23 -0
  6. package/dist/ai/ai-attachment.fragments.d.ts.map +1 -0
  7. package/dist/ai/ai-attachment.fragments.js +34 -0
  8. package/dist/ai/ai-attachment.fragments.js.map +1 -0
  9. package/dist/ai/ai.controller.d.ts +7 -16
  10. package/dist/ai/ai.controller.d.ts.map +1 -1
  11. package/dist/ai/ai.prompts.d.ts +16 -0
  12. package/dist/ai/ai.prompts.d.ts.map +1 -0
  13. package/dist/ai/ai.prompts.js +37 -0
  14. package/dist/ai/ai.prompts.js.map +1 -0
  15. package/dist/ai/ai.service.d.ts +63 -12
  16. package/dist/ai/ai.service.d.ts.map +1 -1
  17. package/dist/ai/ai.service.js +215 -88
  18. package/dist/ai/ai.service.js.map +1 -1
  19. package/dist/ai/dto/chat.dto.d.ts +4 -1
  20. package/dist/ai/dto/chat.dto.d.ts.map +1 -1
  21. package/dist/ai/dto/chat.dto.js +23 -1
  22. package/dist/ai/dto/chat.dto.js.map +1 -1
  23. package/dist/ai/dto/create-agent.dto.d.ts +1 -1
  24. package/dist/ai/dto/create-agent.dto.d.ts.map +1 -1
  25. package/dist/ai/dto/create-agent.dto.js +1 -1
  26. package/dist/ai/dto/create-agent.dto.js.map +1 -1
  27. package/dist/ai/dto/update-agent.dto.d.ts +1 -1
  28. package/dist/ai/dto/update-agent.dto.d.ts.map +1 -1
  29. package/dist/ai/dto/update-agent.dto.js +1 -1
  30. package/dist/ai/dto/update-agent.dto.js.map +1 -1
  31. package/dist/ai-instruction/ai-instruction.controller.d.ts +61 -7
  32. package/dist/ai-instruction/ai-instruction.controller.d.ts.map +1 -1
  33. package/dist/ai-instruction/ai-instruction.controller.js +63 -20
  34. package/dist/ai-instruction/ai-instruction.controller.js.map +1 -1
  35. package/dist/ai-instruction/ai-instruction.module.d.ts.map +1 -1
  36. package/dist/ai-instruction/ai-instruction.module.js +13 -2
  37. package/dist/ai-instruction/ai-instruction.module.js.map +1 -1
  38. package/dist/ai-instruction/ai-instruction.service.d.ts +131 -6
  39. package/dist/ai-instruction/ai-instruction.service.d.ts.map +1 -1
  40. package/dist/ai-instruction/ai-instruction.service.js +533 -60
  41. package/dist/ai-instruction/ai-instruction.service.js.map +1 -1
  42. package/dist/ai-instruction/ai-prompt-builder.service.d.ts +8 -0
  43. package/dist/ai-instruction/ai-prompt-builder.service.d.ts.map +1 -1
  44. package/dist/ai-instruction/ai-prompt-builder.service.js +10 -1
  45. package/dist/ai-instruction/ai-prompt-builder.service.js.map +1 -1
  46. package/dist/ai-instruction/ai-prompt-registry.d.ts +45 -0
  47. package/dist/ai-instruction/ai-prompt-registry.d.ts.map +1 -0
  48. package/dist/ai-instruction/ai-prompt-registry.js +49 -0
  49. package/dist/ai-instruction/ai-prompt-registry.js.map +1 -0
  50. package/dist/ai-instruction/ai-prompt-resolver.service.d.ts +89 -0
  51. package/dist/ai-instruction/ai-prompt-resolver.service.d.ts.map +1 -0
  52. package/dist/ai-instruction/ai-prompt-resolver.service.js +222 -0
  53. package/dist/ai-instruction/ai-prompt-resolver.service.js.map +1 -0
  54. package/dist/ai-instruction/ai-prompt-template.util.d.ts +70 -0
  55. package/dist/ai-instruction/ai-prompt-template.util.d.ts.map +1 -0
  56. package/dist/ai-instruction/ai-prompt-template.util.js +154 -0
  57. package/dist/ai-instruction/ai-prompt-template.util.js.map +1 -0
  58. package/dist/ai-instruction/dto/create-ai-instruction.dto.d.ts +5 -0
  59. package/dist/ai-instruction/dto/create-ai-instruction.dto.d.ts.map +1 -1
  60. package/dist/ai-instruction/dto/create-ai-instruction.dto.js +27 -1
  61. package/dist/ai-instruction/dto/create-ai-instruction.dto.js.map +1 -1
  62. package/dist/ai-instruction/dto/preview-ai-instruction.dto.d.ts +14 -0
  63. package/dist/ai-instruction/dto/preview-ai-instruction.dto.d.ts.map +1 -0
  64. package/dist/ai-instruction/dto/preview-ai-instruction.dto.js +42 -0
  65. package/dist/ai-instruction/dto/preview-ai-instruction.dto.js.map +1 -0
  66. package/dist/ai-instruction/dto/update-ai-instruction.dto.d.ts +11 -0
  67. package/dist/ai-instruction/dto/update-ai-instruction.dto.d.ts.map +1 -1
  68. package/dist/ai-instruction/dto/update-ai-instruction.dto.js +34 -0
  69. package/dist/ai-instruction/dto/update-ai-instruction.dto.js.map +1 -1
  70. package/dist/ai-instruction/types/ai-instruction.types.d.ts +13 -1
  71. package/dist/ai-instruction/types/ai-instruction.types.d.ts.map +1 -1
  72. package/dist/ai-instruction/types/ai-instruction.types.js +10 -0
  73. package/dist/ai-instruction/types/ai-instruction.types.js.map +1 -1
  74. package/dist/auth/auth.controller.d.ts +24 -9
  75. package/dist/auth/auth.controller.d.ts.map +1 -1
  76. package/dist/auth/auth.controller.js +49 -21
  77. package/dist/auth/auth.controller.js.map +1 -1
  78. package/dist/auth/auth.service.d.ts +33 -8
  79. package/dist/auth/auth.service.d.ts.map +1 -1
  80. package/dist/auth/auth.service.js +78 -29
  81. package/dist/auth/auth.service.js.map +1 -1
  82. package/dist/captcha/captcha.module.d.ts +3 -0
  83. package/dist/captcha/captcha.module.d.ts.map +1 -0
  84. package/dist/captcha/captcha.module.js +23 -0
  85. package/dist/captcha/captcha.module.js.map +1 -0
  86. package/dist/captcha/captcha.service.d.ts +38 -0
  87. package/dist/captcha/captcha.service.d.ts.map +1 -0
  88. package/dist/captcha/captcha.service.js +144 -0
  89. package/dist/captcha/captcha.service.js.map +1 -0
  90. package/dist/challenge/challenge.service.d.ts +16 -7
  91. package/dist/challenge/challenge.service.d.ts.map +1 -1
  92. package/dist/challenge/challenge.service.js +64 -16
  93. package/dist/challenge/challenge.service.js.map +1 -1
  94. package/dist/core.module.d.ts +3 -1
  95. package/dist/core.module.d.ts.map +1 -1
  96. package/dist/core.module.js +29 -2
  97. package/dist/core.module.js.map +1 -1
  98. package/dist/dashboard/dashboard/dashboard.controller.d.ts +15 -15
  99. package/dist/dashboard/dashboard/dashboard.service.d.ts +15 -15
  100. package/dist/dashboard/dashboard-component/dashboard-component.controller.d.ts +6 -6
  101. package/dist/dashboard/dashboard-component/dashboard-component.service.d.ts +6 -6
  102. package/dist/dashboard/dashboard-component-role/dashboard-component-role.controller.d.ts +20 -20
  103. package/dist/dashboard/dashboard-component-role/dashboard-component-role.service.d.ts +20 -20
  104. package/dist/dashboard/dashboard-core/dashboard-core.controller.d.ts +1 -1
  105. package/dist/dashboard/dashboard-core/dashboard-core.service.d.ts +1 -1
  106. package/dist/dashboard/dashboard-role/dashboard-role.controller.d.ts +13 -13
  107. package/dist/dashboard/dashboard-role/dashboard-role.service.d.ts +13 -13
  108. package/dist/file/file.service.d.ts +6 -0
  109. package/dist/file/file.service.d.ts.map +1 -1
  110. package/dist/file/file.service.js +44 -4
  111. package/dist/file/file.service.js.map +1 -1
  112. package/dist/incident/incident-notifier.service.d.ts +36 -0
  113. package/dist/incident/incident-notifier.service.d.ts.map +1 -0
  114. package/dist/incident/incident-notifier.service.js +208 -0
  115. package/dist/incident/incident-notifier.service.js.map +1 -0
  116. package/dist/incident/incident.controller.d.ts +23 -0
  117. package/dist/incident/incident.controller.d.ts.map +1 -0
  118. package/dist/incident/incident.controller.js +75 -0
  119. package/dist/incident/incident.controller.js.map +1 -0
  120. package/dist/incident/incident.module.d.ts +7 -0
  121. package/dist/incident/incident.module.d.ts.map +1 -0
  122. package/dist/incident/incident.module.js +32 -0
  123. package/dist/incident/incident.module.js.map +1 -0
  124. package/dist/incident/incident.service.d.ts +72 -0
  125. package/dist/incident/incident.service.d.ts.map +1 -0
  126. package/dist/incident/incident.service.js +184 -0
  127. package/dist/incident/incident.service.js.map +1 -0
  128. package/dist/index.d.ts +26 -0
  129. package/dist/index.d.ts.map +1 -1
  130. package/dist/index.js +30 -0
  131. package/dist/index.js.map +1 -1
  132. package/dist/integration-profile/dto/test.dto.d.ts +13 -0
  133. package/dist/integration-profile/dto/test.dto.d.ts.map +1 -0
  134. package/dist/integration-profile/dto/test.dto.js +26 -0
  135. package/dist/integration-profile/dto/test.dto.js.map +1 -0
  136. package/dist/integration-profile/integration-profile.controller.d.ts +12 -1
  137. package/dist/integration-profile/integration-profile.controller.d.ts.map +1 -1
  138. package/dist/integration-profile/integration-profile.controller.js +9 -1
  139. package/dist/integration-profile/integration-profile.controller.js.map +1 -1
  140. package/dist/integration-profile/integration-profile.module.d.ts +6 -1
  141. package/dist/integration-profile/integration-profile.module.d.ts.map +1 -1
  142. package/dist/integration-profile/integration-profile.module.js +26 -3
  143. package/dist/integration-profile/integration-profile.module.js.map +1 -1
  144. package/dist/integration-profile/integration-profile.secrets.d.ts.map +1 -1
  145. package/dist/integration-profile/integration-profile.secrets.js +9 -1
  146. package/dist/integration-profile/integration-profile.secrets.js.map +1 -1
  147. package/dist/integration-profile/integration-profile.service.d.ts +26 -7
  148. package/dist/integration-profile/integration-profile.service.d.ts.map +1 -1
  149. package/dist/integration-profile/integration-profile.service.js +94 -91
  150. package/dist/integration-profile/integration-profile.service.js.map +1 -1
  151. package/dist/integration-profile/integration-profile.utils.d.ts +13 -1
  152. package/dist/integration-profile/integration-profile.utils.d.ts.map +1 -1
  153. package/dist/integration-profile/integration-profile.utils.js +20 -5
  154. package/dist/integration-profile/integration-profile.utils.js.map +1 -1
  155. package/dist/integration-profile/testers/ai.testers.d.ts +3 -0
  156. package/dist/integration-profile/testers/ai.testers.d.ts.map +1 -0
  157. package/dist/integration-profile/testers/ai.testers.js +125 -0
  158. package/dist/integration-profile/testers/ai.testers.js.map +1 -0
  159. package/dist/integration-profile/testers/captcha.testers.d.ts +3 -0
  160. package/dist/integration-profile/testers/captcha.testers.d.ts.map +1 -0
  161. package/dist/integration-profile/testers/captcha.testers.js +121 -0
  162. package/dist/integration-profile/testers/captcha.testers.js.map +1 -0
  163. package/dist/integration-profile/testers/email.testers.d.ts +3 -0
  164. package/dist/integration-profile/testers/email.testers.d.ts.map +1 -0
  165. package/dist/integration-profile/testers/email.testers.js +128 -0
  166. package/dist/integration-profile/testers/email.testers.js.map +1 -0
  167. package/dist/integration-profile/testers/http-probe.d.ts +57 -0
  168. package/dist/integration-profile/testers/http-probe.d.ts.map +1 -0
  169. package/dist/integration-profile/testers/http-probe.js +140 -0
  170. package/dist/integration-profile/testers/http-probe.js.map +1 -0
  171. package/dist/integration-profile/testers/index.d.ts +12 -0
  172. package/dist/integration-profile/testers/index.d.ts.map +1 -0
  173. package/dist/integration-profile/testers/index.js +45 -0
  174. package/dist/integration-profile/testers/index.js.map +1 -0
  175. package/dist/integration-profile/testers/infrastructure.testers.d.ts +3 -0
  176. package/dist/integration-profile/testers/infrastructure.testers.d.ts.map +1 -0
  177. package/dist/integration-profile/testers/infrastructure.testers.js +105 -0
  178. package/dist/integration-profile/testers/infrastructure.testers.js.map +1 -0
  179. package/dist/integration-profile/testers/integration-tester.registry.d.ts +17 -0
  180. package/dist/integration-profile/testers/integration-tester.registry.d.ts.map +1 -0
  181. package/dist/integration-profile/testers/integration-tester.registry.js +52 -0
  182. package/dist/integration-profile/testers/integration-tester.registry.js.map +1 -0
  183. package/dist/integration-profile/testers/integration-tester.types.d.ts +55 -0
  184. package/dist/integration-profile/testers/integration-tester.types.d.ts.map +1 -0
  185. package/dist/integration-profile/testers/integration-tester.types.js +16 -0
  186. package/dist/integration-profile/testers/integration-tester.types.js.map +1 -0
  187. package/dist/integration-profile/testers/messaging.testers.d.ts +3 -0
  188. package/dist/integration-profile/testers/messaging.testers.d.ts.map +1 -0
  189. package/dist/integration-profile/testers/messaging.testers.js +70 -0
  190. package/dist/integration-profile/testers/messaging.testers.js.map +1 -0
  191. package/dist/integration-profile/testers/oauth.testers.d.ts +3 -0
  192. package/dist/integration-profile/testers/oauth.testers.d.ts.map +1 -0
  193. package/dist/integration-profile/testers/oauth.testers.js +285 -0
  194. package/dist/integration-profile/testers/oauth.testers.js.map +1 -0
  195. package/dist/integration-profile/testers/payment.testers.d.ts +3 -0
  196. package/dist/integration-profile/testers/payment.testers.d.ts.map +1 -0
  197. package/dist/integration-profile/testers/payment.testers.js +169 -0
  198. package/dist/integration-profile/testers/payment.testers.js.map +1 -0
  199. package/dist/integration-profile/testers/storage.testers.d.ts +3 -0
  200. package/dist/integration-profile/testers/storage.testers.d.ts.map +1 -0
  201. package/dist/integration-profile/testers/storage.testers.js +208 -0
  202. package/dist/integration-profile/testers/storage.testers.js.map +1 -0
  203. package/dist/language/en.json +4 -2
  204. package/dist/language/pt.json +4 -2
  205. package/dist/leaked-password/leaked-password.controller.d.ts +24 -0
  206. package/dist/leaked-password/leaked-password.controller.d.ts.map +1 -0
  207. package/dist/leaked-password/leaked-password.controller.js +78 -0
  208. package/dist/leaked-password/leaked-password.controller.js.map +1 -0
  209. package/dist/leaked-password/leaked-password.module.d.ts +8 -0
  210. package/dist/leaked-password/leaked-password.module.d.ts.map +1 -0
  211. package/dist/leaked-password/leaked-password.module.js +31 -0
  212. package/dist/leaked-password/leaked-password.module.js.map +1 -0
  213. package/dist/leaked-password/leaked-password.service.d.ts +64 -0
  214. package/dist/leaked-password/leaked-password.service.d.ts.map +1 -0
  215. package/dist/leaked-password/leaked-password.service.js +218 -0
  216. package/dist/leaked-password/leaked-password.service.js.map +1 -0
  217. package/dist/locale/locale.controller.d.ts +1 -1
  218. package/dist/locale/locale.service.d.ts +1 -1
  219. package/dist/mail/dto/preview.dto.d.ts +18 -0
  220. package/dist/mail/dto/preview.dto.d.ts.map +1 -0
  221. package/dist/mail/dto/preview.dto.js +66 -0
  222. package/dist/mail/dto/preview.dto.js.map +1 -0
  223. package/dist/mail/dto/send.dto.d.ts +7 -0
  224. package/dist/mail/dto/send.dto.d.ts.map +1 -1
  225. package/dist/mail/dto/send.dto.js +10 -0
  226. package/dist/mail/dto/send.dto.js.map +1 -1
  227. package/dist/mail/mail.controller.d.ts +4 -0
  228. package/dist/mail/mail.controller.d.ts.map +1 -1
  229. package/dist/mail/mail.controller.js +16 -2
  230. package/dist/mail/mail.controller.js.map +1 -1
  231. package/dist/mail/mail.service.d.ts +23 -2
  232. package/dist/mail/mail.service.d.ts.map +1 -1
  233. package/dist/mail/mail.service.js +102 -13
  234. package/dist/mail/mail.service.js.map +1 -1
  235. package/dist/mail-layout/dto/update.dto.d.ts +17 -0
  236. package/dist/mail-layout/dto/update.dto.d.ts.map +1 -0
  237. package/dist/mail-layout/dto/update.dto.js +27 -0
  238. package/dist/mail-layout/dto/update.dto.js.map +1 -0
  239. package/dist/mail-layout/mail-layout.controller.d.ts +15 -0
  240. package/dist/mail-layout/mail-layout.controller.d.ts.map +1 -0
  241. package/dist/mail-layout/mail-layout.controller.js +71 -0
  242. package/dist/mail-layout/mail-layout.controller.js.map +1 -0
  243. package/dist/mail-layout/mail-layout.module.d.ts +3 -0
  244. package/dist/mail-layout/mail-layout.module.d.ts.map +1 -0
  245. package/dist/mail-layout/mail-layout.module.js +35 -0
  246. package/dist/mail-layout/mail-layout.module.js.map +1 -0
  247. package/dist/mail-layout/mail-layout.service.d.ts +27 -0
  248. package/dist/mail-layout/mail-layout.service.d.ts.map +1 -0
  249. package/dist/mail-layout/mail-layout.service.js +80 -0
  250. package/dist/mail-layout/mail-layout.service.js.map +1 -0
  251. package/dist/mcp-chat/mcp-chat.controller.d.ts +2 -2
  252. package/dist/mcp-chat/mcp-chat.service.d.ts +24 -2
  253. package/dist/mcp-chat/mcp-chat.service.d.ts.map +1 -1
  254. package/dist/mcp-chat/mcp-chat.service.js +80 -24
  255. package/dist/mcp-chat/mcp-chat.service.js.map +1 -1
  256. package/dist/menu/menu.controller.d.ts +3 -3
  257. package/dist/menu/menu.service.d.ts +3 -3
  258. package/dist/notification/notification.controller.d.ts +12 -12
  259. package/dist/notification/notification.service.d.ts +12 -12
  260. package/dist/oauth/oauth-token-broker.service.d.ts +72 -0
  261. package/dist/oauth/oauth-token-broker.service.d.ts.map +1 -0
  262. package/dist/oauth/oauth-token-broker.service.js +258 -0
  263. package/dist/oauth/oauth-token-broker.service.js.map +1 -0
  264. package/dist/oauth/oauth.module.d.ts.map +1 -1
  265. package/dist/oauth/oauth.module.js +3 -1
  266. package/dist/oauth/oauth.module.js.map +1 -1
  267. package/dist/oauth/oauth.service.d.ts +2 -0
  268. package/dist/oauth/oauth.service.d.ts.map +1 -1
  269. package/dist/oauth/oauth.service.js +6 -3
  270. package/dist/oauth/oauth.service.js.map +1 -1
  271. package/dist/pdf/pdf.service.d.ts +8 -0
  272. package/dist/pdf/pdf.service.d.ts.map +1 -1
  273. package/dist/pdf/pdf.service.js +52 -0
  274. package/dist/pdf/pdf.service.js.map +1 -1
  275. package/dist/presence/presence.controller.d.ts +16 -0
  276. package/dist/presence/presence.controller.d.ts.map +1 -0
  277. package/dist/presence/presence.controller.js +60 -0
  278. package/dist/presence/presence.controller.js.map +1 -0
  279. package/dist/presence/presence.listener.d.ts +29 -0
  280. package/dist/presence/presence.listener.d.ts.map +1 -0
  281. package/dist/presence/presence.listener.js +82 -0
  282. package/dist/presence/presence.listener.js.map +1 -0
  283. package/dist/presence/presence.module.d.ts +3 -0
  284. package/dist/presence/presence.module.d.ts.map +1 -0
  285. package/dist/presence/presence.module.js +32 -0
  286. package/dist/presence/presence.module.js.map +1 -0
  287. package/dist/presence/presence.service.d.ts +42 -0
  288. package/dist/presence/presence.service.d.ts.map +1 -0
  289. package/dist/presence/presence.service.js +147 -0
  290. package/dist/presence/presence.service.js.map +1 -0
  291. package/dist/profile/dto/delete-account.dto.d.ts +8 -0
  292. package/dist/profile/dto/delete-account.dto.d.ts.map +1 -0
  293. package/dist/profile/dto/delete-account.dto.js +22 -0
  294. package/dist/profile/dto/delete-account.dto.js.map +1 -0
  295. package/dist/profile/events/profile-account-deleted.event.d.ts +12 -0
  296. package/dist/profile/events/profile-account-deleted.event.d.ts.map +1 -0
  297. package/dist/profile/events/profile-account-deleted.event.js +17 -0
  298. package/dist/profile/events/profile-account-deleted.event.js.map +1 -0
  299. package/dist/profile/profile.controller.d.ts +21 -15
  300. package/dist/profile/profile.controller.d.ts.map +1 -1
  301. package/dist/profile/profile.controller.js +75 -46
  302. package/dist/profile/profile.controller.js.map +1 -1
  303. package/dist/profile/profile.service.d.ts +30 -18
  304. package/dist/profile/profile.service.d.ts.map +1 -1
  305. package/dist/profile/profile.service.js +113 -37
  306. package/dist/profile/profile.service.js.map +1 -1
  307. package/dist/realtime/realtime.gateway.d.ts +48 -0
  308. package/dist/realtime/realtime.gateway.d.ts.map +1 -0
  309. package/dist/realtime/realtime.gateway.js +156 -0
  310. package/dist/realtime/realtime.gateway.js.map +1 -0
  311. package/dist/realtime/realtime.module.d.ts +8 -0
  312. package/dist/realtime/realtime.module.d.ts.map +1 -0
  313. package/dist/realtime/realtime.module.js +29 -0
  314. package/dist/realtime/realtime.module.js.map +1 -0
  315. package/dist/realtime/realtime.service.d.ts +51 -0
  316. package/dist/realtime/realtime.service.d.ts.map +1 -0
  317. package/dist/realtime/realtime.service.js +177 -0
  318. package/dist/realtime/realtime.service.js.map +1 -0
  319. package/dist/redis/redis-pubsub.d.ts +27 -0
  320. package/dist/redis/redis-pubsub.d.ts.map +1 -0
  321. package/dist/redis/redis-pubsub.js +140 -0
  322. package/dist/redis/redis-pubsub.js.map +1 -0
  323. package/dist/role/role.controller.d.ts +3 -3
  324. package/dist/role/role.service.d.ts +3 -3
  325. package/dist/setting/dto/create.dto.d.ts.map +1 -1
  326. package/dist/setting/dto/create.dto.js +9 -2
  327. package/dist/setting/dto/create.dto.js.map +1 -1
  328. package/dist/setting/setting.controller.d.ts +5 -5
  329. package/dist/setting/setting.service.d.ts +8 -5
  330. package/dist/setting/setting.service.d.ts.map +1 -1
  331. package/dist/setting/setting.service.js +25 -1
  332. package/dist/setting/setting.service.js.map +1 -1
  333. package/dist/user/dto/create-with-email-and-password.dto.d.ts +2 -0
  334. package/dist/user/dto/create-with-email-and-password.dto.d.ts.map +1 -1
  335. package/dist/user/dto/create-with-email-and-password.dto.js +5 -0
  336. package/dist/user/dto/create-with-email-and-password.dto.js.map +1 -1
  337. package/dist/user/dto/query-user-mail-list.dto.d.ts +5 -0
  338. package/dist/user/dto/query-user-mail-list.dto.d.ts.map +1 -0
  339. package/dist/user/dto/query-user-mail-list.dto.js +25 -0
  340. package/dist/user/dto/query-user-mail-list.dto.js.map +1 -0
  341. package/dist/user/user-credential.util.d.ts +19 -0
  342. package/dist/user/user-credential.util.d.ts.map +1 -0
  343. package/dist/user/user-credential.util.js +32 -0
  344. package/dist/user/user-credential.util.js.map +1 -0
  345. package/dist/user/user.controller.d.ts +17 -5
  346. package/dist/user/user.controller.d.ts.map +1 -1
  347. package/dist/user/user.controller.js +18 -3
  348. package/dist/user/user.controller.js.map +1 -1
  349. package/dist/user/user.service.d.ts +28 -6
  350. package/dist/user/user.service.d.ts.map +1 -1
  351. package/dist/user/user.service.js +204 -13
  352. package/dist/user/user.service.js.map +1 -1
  353. package/dist/validators/is-strong-password-with-settings.validator.d.ts.map +1 -1
  354. package/dist/validators/is-strong-password-with-settings.validator.js +11 -0
  355. package/dist/validators/is-strong-password-with-settings.validator.js.map +1 -1
  356. package/dist/validators/service-locator.d.ts +9 -0
  357. package/dist/validators/service-locator.d.ts.map +1 -1
  358. package/dist/validators/service-locator.js +12 -0
  359. package/dist/validators/service-locator.js.map +1 -1
  360. package/dist/whatsapp-sender/whatsapp-sender.module.d.ts +3 -0
  361. package/dist/whatsapp-sender/whatsapp-sender.module.d.ts.map +1 -0
  362. package/dist/whatsapp-sender/whatsapp-sender.module.js +23 -0
  363. package/dist/whatsapp-sender/whatsapp-sender.module.js.map +1 -0
  364. package/dist/whatsapp-sender/whatsapp-sender.service.d.ts +50 -0
  365. package/dist/whatsapp-sender/whatsapp-sender.service.d.ts.map +1 -0
  366. package/dist/whatsapp-sender/whatsapp-sender.service.js +224 -0
  367. package/dist/whatsapp-sender/whatsapp-sender.service.js.map +1 -0
  368. package/hedhog/data/integration_provider.yaml +16 -0
  369. package/hedhog/data/mail.yaml +88 -61
  370. package/hedhog/data/mail_layout.yaml +188 -0
  371. package/hedhog/data/menu.yaml +67 -3
  372. package/hedhog/data/route.yaml +135 -0
  373. package/hedhog/data/setting_group.yaml +139 -1
  374. package/hedhog/frontend/app/account/components/mfa-setup-dialog.tsx.ejs +36 -0
  375. package/hedhog/frontend/app/account/components/two-factor-auth.tsx.ejs +2 -0
  376. package/hedhog/frontend/app/account/hooks/use-mfa-setup.ts.ejs +10 -7
  377. package/hedhog/frontend/app/ai_agent/page.tsx.ejs +7 -4
  378. package/hedhog/frontend/app/ai_instruction/_components/ai-instruction-form.tsx.ejs +580 -0
  379. package/hedhog/frontend/app/ai_instruction/_components/ai-instruction-preview.tsx.ejs +150 -0
  380. package/hedhog/frontend/app/ai_instruction/_components/ai-instruction-versions.tsx.ejs +199 -0
  381. package/hedhog/frontend/app/ai_instruction/_components/prompt-diff.tsx.ejs +63 -0
  382. package/hedhog/frontend/app/ai_instruction/_lib/line-diff.spec.ts.ejs +59 -0
  383. package/hedhog/frontend/app/ai_instruction/_lib/line-diff.ts.ejs +72 -0
  384. package/hedhog/frontend/app/ai_instruction/_lib/prompt-template.spec.ts.ejs +170 -0
  385. package/hedhog/frontend/app/ai_instruction/_lib/prompt-template.ts.ejs +167 -0
  386. package/hedhog/frontend/app/ai_instruction/_lib/types.ts.ejs +99 -0
  387. package/hedhog/frontend/app/ai_instruction/page.tsx.ejs +422 -0
  388. package/hedhog/frontend/app/configurations/[slug]/components/setting-field.tsx.ejs +51 -4
  389. package/hedhog/frontend/app/incidents/page.tsx.ejs +400 -0
  390. package/hedhog/frontend/app/integration/profiles/page.tsx.ejs +153 -84
  391. package/hedhog/frontend/app/mail/layout/page.tsx.ejs +344 -0
  392. package/hedhog/frontend/app/mail/template/page.tsx.ejs +155 -121
  393. package/hedhog/frontend/app/mcp_chat/page.tsx.ejs +129 -17
  394. package/hedhog/frontend/app/pages/_components/page-delete-dialog.tsx.ejs +343 -0
  395. package/hedhog/frontend/app/pages/_components/page-detail-sheet.tsx.ejs +438 -0
  396. package/hedhog/frontend/app/pages/_components/page-wizard-sheet.tsx.ejs +1009 -0
  397. package/hedhog/frontend/app/pages/_components/system-page-types.ts.ejs +56 -0
  398. package/hedhog/frontend/app/pages/_components/use-system-pages.ts.ejs +171 -0
  399. package/hedhog/frontend/app/pages/page.tsx.ejs +514 -0
  400. package/hedhog/frontend/app/users/page.tsx.ejs +119 -13
  401. package/hedhog/frontend/app/users/user-activity-timeline.tsx.ejs +231 -0
  402. package/hedhog/frontend/app/users/user-mails.tsx.ejs +399 -0
  403. package/hedhog/frontend/app/users/user-sheet.tsx.ejs +60 -75
  404. package/hedhog/frontend/messages/en.json +499 -3
  405. package/hedhog/frontend/messages/pt.json +499 -3
  406. package/hedhog/table/ai_agent.yaml +1 -0
  407. package/hedhog/table/ai_instruction.yaml +15 -0
  408. package/hedhog/table/leaked_password.yaml +18 -0
  409. package/hedhog/table/mail_layout.yaml +35 -0
  410. package/hedhog/table/mail_var.yaml +4 -0
  411. package/hedhog/table/setting.yaml +1 -0
  412. package/hedhog/table/system_incident.yaml +59 -0
  413. package/hedhog/table/user_presence.yaml +36 -0
  414. package/package.json +8 -4
  415. package/src/access-log/access-log.interceptor.ts +4 -2
  416. package/src/ai/ai-attachment.fragments.spec.ts +319 -0
  417. package/src/ai/ai-attachment.fragments.ts +35 -0
  418. package/src/ai/ai.prompts.ts +38 -0
  419. package/src/ai/ai.service.spec.ts +280 -0
  420. package/src/ai/ai.service.ts +338 -82
  421. package/src/ai/dto/chat.dto.ts +33 -3
  422. package/src/ai/dto/create-agent.dto.ts +2 -2
  423. package/src/ai/dto/update-agent.dto.ts +2 -2
  424. package/src/ai-instruction/ai-instruction.controller.ts +40 -9
  425. package/src/ai-instruction/ai-instruction.module.ts +13 -2
  426. package/src/ai-instruction/ai-instruction.service.spec.ts +658 -0
  427. package/src/ai-instruction/ai-instruction.service.ts +661 -62
  428. package/src/ai-instruction/ai-prompt-builder.service.ts +10 -1
  429. package/src/ai-instruction/ai-prompt-registry.ts +87 -0
  430. package/src/ai-instruction/ai-prompt-resolver.service.spec.ts +375 -0
  431. package/src/ai-instruction/ai-prompt-resolver.service.ts +295 -0
  432. package/src/ai-instruction/ai-prompt-template.util.spec.ts +162 -0
  433. package/src/ai-instruction/ai-prompt-template.util.ts +199 -0
  434. package/src/ai-instruction/dto/create-ai-instruction.dto.ts +39 -3
  435. package/src/ai-instruction/dto/preview-ai-instruction.dto.ts +26 -0
  436. package/src/ai-instruction/dto/update-ai-instruction.dto.ts +42 -1
  437. package/src/ai-instruction/types/ai-instruction.types.ts +24 -1
  438. package/src/auth/auth.controller.ts +31 -5
  439. package/src/auth/auth.service.spec.ts +3 -1
  440. package/src/auth/auth.service.ts +101 -36
  441. package/src/captcha/captcha.module.ts +10 -0
  442. package/src/captcha/captcha.service.spec.ts +210 -0
  443. package/src/captcha/captcha.service.ts +191 -0
  444. package/src/challenge/challenge.service.spec.ts +39 -4
  445. package/src/challenge/challenge.service.ts +72 -17
  446. package/src/core.module.ts +27 -1
  447. package/src/file/file.service.spec.ts +105 -0
  448. package/src/file/file.service.ts +60 -3
  449. package/src/incident/incident-notifier.service.spec.ts +205 -0
  450. package/src/incident/incident-notifier.service.ts +241 -0
  451. package/src/incident/incident.controller.ts +38 -0
  452. package/src/incident/incident.module.ts +19 -0
  453. package/src/incident/incident.service.spec.ts +150 -0
  454. package/src/incident/incident.service.ts +209 -0
  455. package/src/index.ts +37 -0
  456. package/src/integration-profile/dto/test.dto.ts +19 -0
  457. package/src/integration-profile/integration-profile.controller.ts +10 -1
  458. package/src/integration-profile/integration-profile.module.spec.ts +51 -0
  459. package/src/integration-profile/integration-profile.module.ts +23 -4
  460. package/src/integration-profile/integration-profile.secrets.ts +9 -1
  461. package/src/integration-profile/integration-profile.service.spec.ts +279 -0
  462. package/src/integration-profile/integration-profile.service.ts +120 -124
  463. package/src/integration-profile/integration-profile.utils.spec.ts +22 -0
  464. package/src/integration-profile/integration-profile.utils.ts +40 -3
  465. package/src/integration-profile/testers/ai.testers.ts +165 -0
  466. package/src/integration-profile/testers/captcha.testers.spec.ts +92 -0
  467. package/src/integration-profile/testers/captcha.testers.ts +139 -0
  468. package/src/integration-profile/testers/email.testers.ts +161 -0
  469. package/src/integration-profile/testers/http-probe.spec.ts +153 -0
  470. package/src/integration-profile/testers/http-probe.ts +171 -0
  471. package/src/integration-profile/testers/index.ts +30 -0
  472. package/src/integration-profile/testers/infrastructure.testers.ts +122 -0
  473. package/src/integration-profile/testers/integration-tester.registry.spec.ts +75 -0
  474. package/src/integration-profile/testers/integration-tester.registry.ts +43 -0
  475. package/src/integration-profile/testers/integration-tester.types.ts +61 -0
  476. package/src/integration-profile/testers/messaging.testers.ts +102 -0
  477. package/src/integration-profile/testers/oauth.testers.spec.ts +220 -0
  478. package/src/integration-profile/testers/oauth.testers.ts +305 -0
  479. package/src/integration-profile/testers/payment.testers.ts +185 -0
  480. package/src/integration-profile/testers/remaining.testers.spec.ts +401 -0
  481. package/src/integration-profile/testers/storage.testers.spec.ts +185 -0
  482. package/src/integration-profile/testers/storage.testers.ts +226 -0
  483. package/src/integration-profile/testers/tester-coverage.spec.ts +58 -0
  484. package/src/language/en.json +4 -2
  485. package/src/language/pt.json +4 -2
  486. package/src/leaked-password/README.md +83 -0
  487. package/src/leaked-password/leaked-password.controller.ts +52 -0
  488. package/src/leaked-password/leaked-password.module.ts +18 -0
  489. package/src/leaked-password/leaked-password.service.ts +242 -0
  490. package/src/leaked-password/seed/build-seed-sql.mjs +180 -0
  491. package/src/leaked-password/seed/common-passwords.txt +335 -0
  492. package/src/mail/dto/preview.dto.ts +50 -0
  493. package/src/mail/dto/send.dto.ts +14 -1
  494. package/src/mail/mail-template.spec.ts +197 -0
  495. package/src/mail/mail.controller.ts +9 -2
  496. package/src/mail/mail.service.spec.ts +116 -1
  497. package/src/mail/mail.service.ts +118 -12
  498. package/src/mail-layout/dto/update.dto.ts +19 -0
  499. package/src/mail-layout/mail-layout.controller.ts +47 -0
  500. package/src/mail-layout/mail-layout.module.ts +22 -0
  501. package/src/mail-layout/mail-layout.service.ts +94 -0
  502. package/src/mcp-chat/mcp-chat.service.spec.ts +236 -0
  503. package/src/mcp-chat/mcp-chat.service.ts +122 -26
  504. package/src/oauth/oauth-token-broker.service.spec.ts +172 -0
  505. package/src/oauth/oauth-token-broker.service.ts +363 -0
  506. package/src/oauth/oauth.module.ts +3 -1
  507. package/src/oauth/oauth.service.ts +8 -2
  508. package/src/pdf/pdf.service.ts +75 -0
  509. package/src/presence/presence.controller.ts +29 -0
  510. package/src/presence/presence.listener.ts +53 -0
  511. package/src/presence/presence.module.ts +19 -0
  512. package/src/presence/presence.service.spec.ts +97 -0
  513. package/src/presence/presence.service.ts +160 -0
  514. package/src/profile/dto/delete-account.dto.ts +11 -0
  515. package/src/profile/events/profile-account-deleted.event.ts +13 -0
  516. package/src/profile/profile.controller.ts +46 -34
  517. package/src/profile/profile.service.ts +138 -38
  518. package/src/realtime/realtime.gateway.ts +138 -0
  519. package/src/realtime/realtime.module.ts +16 -0
  520. package/src/realtime/realtime.service.spec.ts +50 -0
  521. package/src/realtime/realtime.service.ts +187 -0
  522. package/src/redis/redis-pubsub.ts +179 -0
  523. package/src/setting/dto/create.dto.ts +13 -2
  524. package/src/setting/setting.service.spec.ts +56 -0
  525. package/src/setting/setting.service.ts +29 -1
  526. package/src/user/dto/create-with-email-and-password.dto.ts +6 -1
  527. package/src/user/dto/query-user-mail-list.dto.ts +10 -0
  528. package/src/user/user-credential.util.ts +35 -0
  529. package/src/user/user.controller.ts +17 -2
  530. package/src/user/user.service.spec.ts +153 -0
  531. package/src/user/user.service.ts +255 -12
  532. package/src/validators/is-strong-password-with-settings.validator.ts +12 -0
  533. package/src/validators/service-locator.ts +15 -0
  534. package/src/whatsapp-sender/whatsapp-sender.module.ts +10 -0
  535. package/src/whatsapp-sender/whatsapp-sender.service.ts +313 -0
@@ -0,0 +1,399 @@
1
+ 'use client';
2
+
3
+ import {
4
+ EmptyState,
5
+ PaginationFooter,
6
+ SearchBar,
7
+ type SearchBarControl,
8
+ } from '@/components/entity-list';
9
+ import { Badge } from '@/components/ui/badge';
10
+ import { KpiCardsGrid, type KpiCardItem } from '@/components/ui/kpi-cards-grid';
11
+ import { ResizableSheetContent } from '@/components/ui/resizable-sheet-content';
12
+ import { ScrollArea } from '@/components/ui/scroll-area';
13
+ import {
14
+ Sheet,
15
+ SheetDescription,
16
+ SheetHeader,
17
+ SheetTitle,
18
+ } from '@/components/ui/sheet';
19
+ import { useDebounce } from '@/hooks/use-debounce';
20
+ import { usePersistedPageSize } from '@/hooks/use-persisted-page-size';
21
+ import { formatDateTime } from '@/lib/format-date';
22
+ import { User } from '@hed-hog/api-types';
23
+ import { useApp, useQuery } from '@hed-hog/next-app-provider';
24
+ import {
25
+ AlertCircle,
26
+ CheckCircle2,
27
+ Clock,
28
+ Eye,
29
+ Loader2,
30
+ Mail,
31
+ TriangleAlert,
32
+ } from 'lucide-react';
33
+ import { useTranslations } from 'next-intl';
34
+ import { useMemo, useState } from 'react';
35
+
36
+ type UserMailStatus = 'received' | 'read' | 'error';
37
+ type StatusFilter = 'all' | UserMailStatus;
38
+
39
+ type UserMail = {
40
+ id: number;
41
+ mailId: number;
42
+ mailSlug: string | null;
43
+ subject: string;
44
+ from: string;
45
+ to: string | null;
46
+ cc: string | null;
47
+ bcc: string | null;
48
+ body: string;
49
+ createdAt: string | null;
50
+ tracked: boolean;
51
+ recipientEmail: string | null;
52
+ status: UserMailStatus | null;
53
+ readAt: string | null;
54
+ errorCode: string | null;
55
+ errorMessage: string | null;
56
+ };
57
+
58
+ type UserMailStats = {
59
+ total: number;
60
+ received: number;
61
+ read: number;
62
+ error: number;
63
+ };
64
+
65
+ type UserMailsResponse = {
66
+ data: UserMail[];
67
+ total: number;
68
+ stats: UserMailStats;
69
+ };
70
+
71
+ const PAGE_SIZE_OPTIONS = [5, 10, 20, 50] as const;
72
+
73
+ export function UserMails({ editingUser }: { editingUser: User }) {
74
+ const { request, currentLocaleCode, getSettingValue } = useApp();
75
+ const t = useTranslations('core.UserMails');
76
+ const userId = editingUser?.id;
77
+
78
+ const [searchTerm, setSearchTerm] = useState('');
79
+ const [statusFilter, setStatusFilter] = useState<StatusFilter>('all');
80
+ const [page, setPage] = useState(1);
81
+ const [selectedMail, setSelectedMail] = useState<UserMail | null>(null);
82
+ const [isDetailOpen, setIsDetailOpen] = useState(false);
83
+ const debouncedSearch = useDebounce(searchTerm);
84
+
85
+ const [pageSize, setPageSize] = usePersistedPageSize({
86
+ storageKey: 'pagination:core-user-mails:pageSize',
87
+ defaultValue: 10,
88
+ allowedValues: PAGE_SIZE_OPTIONS,
89
+ });
90
+
91
+ const { data, isLoading } = useQuery<UserMailsResponse>({
92
+ queryKey: [
93
+ 'user-mails',
94
+ userId,
95
+ page,
96
+ pageSize,
97
+ debouncedSearch,
98
+ statusFilter,
99
+ currentLocaleCode,
100
+ ],
101
+ queryFn: async () => {
102
+ const response = await request<UserMailsResponse>({
103
+ url: `/user/${userId}/mail`,
104
+ method: 'GET',
105
+ params: {
106
+ page,
107
+ pageSize,
108
+ search: debouncedSearch || undefined,
109
+ status: statusFilter !== 'all' ? statusFilter : undefined,
110
+ },
111
+ });
112
+ return response.data;
113
+ },
114
+ enabled: !!userId,
115
+ });
116
+
117
+ const mails = data?.data ?? [];
118
+ const total = data?.total ?? 0;
119
+ const stats = data?.stats;
120
+
121
+ const kpiCards = useMemo<KpiCardItem[]>(
122
+ () => [
123
+ {
124
+ key: 'total',
125
+ title: t('kpiTotal'),
126
+ value: stats?.total ?? 0,
127
+ icon: Mail,
128
+ layout: 'compact',
129
+ accentClassName: 'from-purple-500/20 via-purple-400/10 to-transparent',
130
+ iconContainerClassName: 'bg-purple-50 text-purple-600',
131
+ },
132
+ {
133
+ key: 'read',
134
+ title: t('kpiRead'),
135
+ value: stats?.read ?? 0,
136
+ icon: Eye,
137
+ layout: 'compact',
138
+ accentClassName: 'from-green-500/20 via-emerald-400/10 to-transparent',
139
+ iconContainerClassName: 'bg-green-50 text-green-600',
140
+ },
141
+ {
142
+ key: 'error',
143
+ title: t('kpiError'),
144
+ value: stats?.error ?? 0,
145
+ icon: TriangleAlert,
146
+ layout: 'compact',
147
+ accentClassName: 'from-rose-500/20 via-rose-400/10 to-transparent',
148
+ iconContainerClassName: 'bg-rose-50 text-rose-600',
149
+ },
150
+ ],
151
+ [stats, t]
152
+ );
153
+
154
+ const searchControls = useMemo<SearchBarControl[]>(
155
+ () => [
156
+ {
157
+ id: 'status',
158
+ type: 'select',
159
+ value: statusFilter,
160
+ onChange: (value) => {
161
+ setStatusFilter(value as StatusFilter);
162
+ setPage(1);
163
+ },
164
+ placeholder: t('filterByStatus'),
165
+ options: [
166
+ { value: 'all', label: t('statusAll') },
167
+ { value: 'received', label: t('statusReceived') },
168
+ { value: 'read', label: t('statusRead') },
169
+ { value: 'error', label: t('statusError') },
170
+ ],
171
+ },
172
+ ],
173
+ [statusFilter, t]
174
+ );
175
+
176
+ const handleViewDetails = (mail: UserMail) => {
177
+ setSelectedMail(mail);
178
+ setIsDetailOpen(true);
179
+ };
180
+
181
+ const renderStatusBadge = (mail: UserMail) => {
182
+ if (!mail.tracked || !mail.status) {
183
+ return <Badge variant="outline">{t('statusUntracked')}</Badge>;
184
+ }
185
+
186
+ return (
187
+ <Badge variant={mail.status === 'error' ? 'destructive' : 'outline'}>
188
+ {t(`status_${mail.status}` as never)}
189
+ </Badge>
190
+ );
191
+ };
192
+
193
+ return (
194
+ <div className="space-y-3">
195
+ <KpiCardsGrid items={kpiCards} columns={3} />
196
+
197
+ <SearchBar
198
+ searchQuery={searchTerm}
199
+ onSearchChange={(value) => {
200
+ setSearchTerm(value);
201
+ setPage(1);
202
+ }}
203
+ onSearch={() => setPage(1)}
204
+ placeholder={t('searchPlaceholder')}
205
+ controls={searchControls}
206
+ />
207
+
208
+ {isLoading ? (
209
+ <div className="flex items-center justify-center py-8 text-muted-foreground">
210
+ <Loader2 className="h-5 w-5 animate-spin" />
211
+ </div>
212
+ ) : mails.length === 0 ? (
213
+ <EmptyState
214
+ icon={<Mail className="h-6 w-6" />}
215
+ title={t('emptyTitle')}
216
+ description={t('emptyDescription')}
217
+ />
218
+ ) : (
219
+ <div className="space-y-2">
220
+ {mails.map((mail) => (
221
+ <div
222
+ key={mail.id}
223
+ onDoubleClick={() => handleViewDetails(mail)}
224
+ className="cursor-pointer rounded-lg border p-3 transition-colors hover:border-border hover:bg-muted/40"
225
+ >
226
+ <div className="flex items-start gap-3">
227
+ <div className="rounded-md bg-slate-50 p-2">
228
+ <Mail className="h-5 w-5 text-muted-foreground" />
229
+ </div>
230
+ <div className="flex-1">
231
+ <div className="flex flex-wrap items-center justify-between gap-2">
232
+ <p className="text-sm font-medium">{mail.subject}</p>
233
+ {renderStatusBadge(mail)}
234
+ </div>
235
+ <p className="text-xs text-muted-foreground">
236
+ {mail.recipientEmail || mail.to}
237
+ </p>
238
+ <div className="mt-1 flex flex-wrap items-center gap-3 text-[11px] text-muted-foreground">
239
+ {mail.createdAt && (
240
+ <span className="flex items-center gap-1">
241
+ <Clock className="h-3 w-3" />
242
+ {formatDateTime(
243
+ mail.createdAt,
244
+ getSettingValue,
245
+ currentLocaleCode
246
+ )}
247
+ </span>
248
+ )}
249
+ {mail.readAt && (
250
+ <span className="flex items-center gap-1">
251
+ <CheckCircle2 className="h-3 w-3" />
252
+ {t('readAt')}:{' '}
253
+ {formatDateTime(
254
+ mail.readAt,
255
+ getSettingValue,
256
+ currentLocaleCode
257
+ )}
258
+ </span>
259
+ )}
260
+ {mail.errorMessage && (
261
+ <span className="flex items-center gap-1 text-red-600 dark:text-red-400">
262
+ <AlertCircle className="h-3 w-3" />
263
+ {mail.errorMessage}
264
+ {mail.errorCode ? ` (${mail.errorCode})` : ''}
265
+ </span>
266
+ )}
267
+ </div>
268
+ </div>
269
+ </div>
270
+ </div>
271
+ ))}
272
+ </div>
273
+ )}
274
+
275
+ <PaginationFooter
276
+ currentPage={page}
277
+ pageSize={pageSize}
278
+ totalItems={total}
279
+ onPageChange={setPage}
280
+ onPageSizeChange={(size) => {
281
+ setPageSize(size);
282
+ setPage(1);
283
+ }}
284
+ pageSizeOptions={PAGE_SIZE_OPTIONS}
285
+ />
286
+
287
+ {selectedMail && (
288
+ <Sheet open={isDetailOpen} onOpenChange={setIsDetailOpen}>
289
+ <ResizableSheetContent
290
+ sheetId="core-users-mail-detail"
291
+ defaultWidth={672}
292
+ >
293
+ <SheetHeader>
294
+ <SheetTitle>{t('detailsTitle')}</SheetTitle>
295
+ <SheetDescription>{t('detailsDescription')}</SheetDescription>
296
+ </SheetHeader>
297
+ <ScrollArea className="h-[calc(100vh-9rem)] px-4 pb-4">
298
+ <div className="space-y-4 py-2">
299
+ <div>
300
+ <h4 className="mb-2 text-sm font-semibold">{t('subject')}</h4>
301
+ <p className="rounded-md bg-muted p-3 text-sm">
302
+ {selectedMail.subject}
303
+ </p>
304
+ </div>
305
+ <div>
306
+ <h4 className="mb-2 text-sm font-semibold">{t('from')}</h4>
307
+ <p className="rounded-md bg-muted p-3 text-sm">
308
+ {selectedMail.from}
309
+ </p>
310
+ </div>
311
+ <div>
312
+ <h4 className="mb-2 text-sm font-semibold">{t('to')}</h4>
313
+ <p className="rounded-md bg-muted p-3 text-sm">
314
+ {selectedMail.recipientEmail || selectedMail.to}
315
+ </p>
316
+ </div>
317
+ {selectedMail.cc && (
318
+ <div>
319
+ <h4 className="mb-2 text-sm font-semibold">{t('cc')}</h4>
320
+ <p className="rounded-md bg-muted p-3 text-sm">
321
+ {selectedMail.cc}
322
+ </p>
323
+ </div>
324
+ )}
325
+ {selectedMail.bcc && (
326
+ <div>
327
+ <h4 className="mb-2 text-sm font-semibold">{t('bcc')}</h4>
328
+ <p className="rounded-md bg-muted p-3 text-sm">
329
+ {selectedMail.bcc}
330
+ </p>
331
+ </div>
332
+ )}
333
+
334
+ <div>
335
+ <h4 className="mb-2 text-sm font-semibold">{t('delivery')}</h4>
336
+ <div className="space-y-2 rounded-md border p-3">
337
+ <div className="flex flex-wrap items-center gap-2">
338
+ {renderStatusBadge(selectedMail)}
339
+ {selectedMail.mailSlug && (
340
+ <Badge variant="outline">{selectedMail.mailSlug}</Badge>
341
+ )}
342
+ </div>
343
+ <div className="space-y-1 text-xs text-muted-foreground">
344
+ {selectedMail.createdAt && (
345
+ <div className="flex items-center gap-1.5">
346
+ <Clock className="h-3.5 w-3.5" />
347
+ <span>
348
+ {t('createdAt')}:{' '}
349
+ {formatDateTime(
350
+ selectedMail.createdAt,
351
+ getSettingValue,
352
+ currentLocaleCode
353
+ )}
354
+ </span>
355
+ </div>
356
+ )}
357
+ {selectedMail.readAt && (
358
+ <div className="flex items-center gap-1.5">
359
+ <CheckCircle2 className="h-3.5 w-3.5" />
360
+ <span>
361
+ {t('readAt')}:{' '}
362
+ {formatDateTime(
363
+ selectedMail.readAt,
364
+ getSettingValue,
365
+ currentLocaleCode
366
+ )}
367
+ </span>
368
+ </div>
369
+ )}
370
+ {selectedMail.errorMessage && (
371
+ <div className="flex items-start gap-1.5 text-red-600 dark:text-red-400">
372
+ <AlertCircle className="mt-0.5 h-3.5 w-3.5" />
373
+ <span>
374
+ {t('errorMessage')}: {selectedMail.errorMessage}
375
+ {selectedMail.errorCode
376
+ ? ` (${selectedMail.errorCode})`
377
+ : ''}
378
+ </span>
379
+ </div>
380
+ )}
381
+ </div>
382
+ </div>
383
+ </div>
384
+
385
+ <div>
386
+ <h4 className="mb-2 text-sm font-semibold">{t('body')}</h4>
387
+ <div
388
+ className="rounded-md bg-muted p-3 text-sm"
389
+ dangerouslySetInnerHTML={{ __html: selectedMail.body }}
390
+ />
391
+ </div>
392
+ </div>
393
+ </ScrollArea>
394
+ </ResizableSheetContent>
395
+ </Sheet>
396
+ )}
397
+ </div>
398
+ );
399
+ }
@@ -11,10 +11,10 @@ import {
11
11
  AlertDialogHeader,
12
12
  AlertDialogTitle,
13
13
  } from '@/components/ui/alert-dialog';
14
+ import { Badge } from '@/components/ui/badge';
14
15
  import { Button } from '@/components/ui/button';
15
16
  import {
16
17
  Card,
17
- CardContent,
18
18
  CardDescription,
19
19
  CardHeader,
20
20
  CardTitle,
@@ -61,9 +61,6 @@ import {
61
61
  EyeOff,
62
62
  Fingerprint,
63
63
  Key,
64
- KeyRound,
65
- LogOut,
66
- LucideIcon,
67
64
  Mail,
68
65
  Monitor,
69
66
  ScrollText,
@@ -71,10 +68,8 @@ import {
71
68
  Save,
72
69
  Shield,
73
70
  ShieldCheck,
74
- ShieldOff,
75
71
  Trash2,
76
72
  UserCircle,
77
- UserIcon,
78
73
  Users,
79
74
  } from 'lucide-react';
80
75
  import { useTranslations } from 'next-intl';
@@ -85,7 +80,12 @@ import { z } from 'zod';
85
80
  import { ActiveSessions } from './active-session';
86
81
  import { UserIdentifiersSection } from './identifiers';
87
82
  import { PermissionsSection } from './permissions';
83
+ import {
84
+ MAX_RECENT_ACTIVITIES,
85
+ UserActivityTimeline,
86
+ } from './user-activity-timeline';
88
87
  import { UserLogs } from './user-logs';
88
+ import { UserMails } from './user-mails';
89
89
 
90
90
  export type UserSheetProps = {
91
91
  open: boolean;
@@ -414,8 +414,19 @@ function UserEditSheet({
414
414
  }) {
415
415
  const t = useTranslations('core.UserPage');
416
416
  const userActivityT = useTranslations('core.UserActivity');
417
- const { request, currentLocaleCode, getSettingValue } = useApp();
417
+ const {
418
+ request,
419
+ currentLocaleCode,
420
+ getSettingValue,
421
+ user: currentUser,
422
+ } = useApp();
418
423
  const minPasswordLength = Number(getSettingValue('password-min-length')) || 6;
424
+ // Resetar a própria senha por aqui força `requires_reset` na conta logada
425
+ // sem passar pelo fluxo de troca (que exige a senha atual). Como o admin
426
+ // não sabe essa senha nova gerada, ele fica preso na tela de troca forçada
427
+ // assim que a sessão revalidar — por isso essa ação some para a própria conta.
428
+ const isSelf =
429
+ !!currentUser?.id && !!userId && Number(currentUser.id) === Number(userId);
419
430
  const enabledOAuthProviders = useMemo(
420
431
  () =>
421
432
  OAUTH_PROVIDER_TOGGLE_MAP.filter(
@@ -775,6 +786,10 @@ function UserEditSheet({
775
786
  <Monitor className="h-4 w-4" />
776
787
  <span>{t('tabSessions')}</span>
777
788
  </TabsTrigger>
789
+ <TabsTrigger value="emails">
790
+ <Mail className="h-4 w-4" />
791
+ <span>{t('tabEmails')}</span>
792
+ </TabsTrigger>
778
793
  <TabsTrigger value="logs">
779
794
  <ScrollText className="h-4 w-4" />
780
795
  <span>{t('tabLogs')}</span>
@@ -1003,65 +1018,22 @@ function UserEditSheet({
1003
1018
  <div className="space-y-3">
1004
1019
  <div className="flex items-center justify-between">
1005
1020
  <h4 className="text-sm font-semibold flex items-center gap-2">
1006
- <Shield className="h-4 w-4" />
1021
+ <Activity className="h-4 w-4" />
1007
1022
  {t('recentActivityTitle')}
1008
1023
  </h4>
1024
+ {Boolean(editingUser.user_activity?.length) && (
1025
+ <Badge variant="secondary" className="text-[10px]">
1026
+ {t('activityEventsCount', {
1027
+ count: Math.min(
1028
+ editingUser.user_activity?.length ?? 0,
1029
+ MAX_RECENT_ACTIVITIES
1030
+ ),
1031
+ })}
1032
+ </Badge>
1033
+ )}
1009
1034
  </div>
1010
1035
 
1011
- <Card className="rounded-md p-0">
1012
- <CardContent className="p-4 gap-2 flex flex-col">
1013
- {editingUser.user_activity?.length ? (
1014
- <div className="space-y-3">
1015
- {editingUser.user_activity
1016
- ?.slice(0, 5)
1017
- .map((activity, index) => {
1018
- const actionIcons: Record<string, LucideIcon> = {
1019
- login: UserIcon,
1020
- forgotPassword: KeyRound,
1021
- logout: LogOut,
1022
- resetPassword: RefreshCcw,
1023
- revokeAllSessions: ShieldOff,
1024
- revokeSession: Shield,
1025
- };
1026
- const Icon = actionIcons[activity.action] || UserIcon;
1027
-
1028
- return (
1029
- <div
1030
- key={index}
1031
- className="flex items-start gap-3 border-b pb-3 last:border-none"
1032
- >
1033
- <div className="rounded-md bg-blue-50 p-2">
1034
- <Icon className="w-4 h-4 text-gray-600" />
1035
- </div>
1036
- <div className="flex-1">
1037
- <p className="text-sm font-medium">
1038
- {userActivityT(activity.action)}
1039
- </p>
1040
- <p className="text-[11px] text-gray-500 mt-1">
1041
- {activity.created_at &&
1042
- formatDistanceToNow(
1043
- new Date(activity.created_at),
1044
- {
1045
- addSuffix: true,
1046
- locale:
1047
- currentLocaleCode === 'en'
1048
- ? enUS
1049
- : ptBR,
1050
- }
1051
- )}
1052
- </p>
1053
- </div>
1054
- </div>
1055
- );
1056
- })}
1057
- </div>
1058
- ) : (
1059
- <span className="text-sm text-muted-foreground">
1060
- {t('noRecentActivity')}
1061
- </span>
1062
- )}
1063
- </CardContent>
1064
- </Card>
1036
+ <UserActivityTimeline activities={editingUser.user_activity} />
1065
1037
  </div>
1066
1038
 
1067
1039
  <div className="flex justify-end">
@@ -1165,19 +1137,27 @@ function UserEditSheet({
1165
1137
  {t('passwordLastChangedUnavailable')}
1166
1138
  </p>
1167
1139
  )}
1168
- <p className="text-xs text-muted-foreground">
1169
- {t('passwordResetNotice')}
1170
- </p>
1171
- <div className="flex flex-col gap-2">
1172
- <Button
1173
- type="button"
1174
- onClick={openResetPasswordDialog}
1175
- className="w-full sm:w-fit"
1176
- >
1177
- <RefreshCcw className="mr-2 h-4 w-4" />
1178
- {t('buttonResetPassword')}
1179
- </Button>
1180
- </div>
1140
+ {isSelf ? (
1141
+ <p className="rounded-md border border-amber-200 bg-amber-50 px-3 py-2 text-xs text-amber-900">
1142
+ {t('passwordResetSelfNotice')}
1143
+ </p>
1144
+ ) : (
1145
+ <>
1146
+ <p className="text-xs text-muted-foreground">
1147
+ {t('passwordResetNotice')}
1148
+ </p>
1149
+ <div className="flex flex-col gap-2">
1150
+ <Button
1151
+ type="button"
1152
+ onClick={openResetPasswordDialog}
1153
+ className="w-full sm:w-fit"
1154
+ >
1155
+ <RefreshCcw className="mr-2 h-4 w-4" />
1156
+ {t('buttonResetPassword')}
1157
+ </Button>
1158
+ </div>
1159
+ </>
1160
+ )}
1181
1161
  </div>
1182
1162
 
1183
1163
  <div className="space-y-3">
@@ -1496,6 +1476,11 @@ function UserEditSheet({
1496
1476
  />
1497
1477
  </TabsContent>
1498
1478
 
1479
+ {/* Emails Tab */}
1480
+ <TabsContent value="emails" className="space-y-4 mt-4 p-4 pt-0">
1481
+ <UserMails editingUser={editingUser} />
1482
+ </TabsContent>
1483
+
1499
1484
  {/* Logs Tab */}
1500
1485
  <TabsContent value="logs" className="space-y-4 mt-4 p-4 pt-0">
1501
1486
  <UserLogs editingUser={editingUser} />