@hed-hog/core 0.0.390 → 0.0.393

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 (528) hide show
  1. package/README.md +39 -0
  2. package/dist/access-log/access-log.controller.d.ts.map +1 -1
  3. package/dist/access-log/access-log.controller.js +1 -1
  4. package/dist/access-log/access-log.controller.js.map +1 -1
  5. package/dist/access-log/access-log.interceptor.d.ts.map +1 -1
  6. package/dist/access-log/access-log.interceptor.js +8 -5
  7. package/dist/access-log/access-log.interceptor.js.map +1 -1
  8. package/dist/access-log/access-log.service.d.ts +4 -0
  9. package/dist/access-log/access-log.service.d.ts.map +1 -1
  10. package/dist/access-log/access-log.service.js +31 -4
  11. package/dist/access-log/access-log.service.js.map +1 -1
  12. package/dist/access-log/dto/query-access-log.dto.d.ts +2 -0
  13. package/dist/access-log/dto/query-access-log.dto.d.ts.map +1 -1
  14. package/dist/access-log/dto/query-access-log.dto.js +5 -0
  15. package/dist/access-log/dto/query-access-log.dto.js.map +1 -1
  16. package/dist/ai/ai.controller.d.ts +12 -8
  17. package/dist/ai/ai.controller.d.ts.map +1 -1
  18. package/dist/ai/ai.controller.js +17 -2
  19. package/dist/ai/ai.controller.js.map +1 -1
  20. package/dist/ai/ai.module.d.ts.map +1 -1
  21. package/dist/ai/ai.module.js +3 -2
  22. package/dist/ai/ai.module.js.map +1 -1
  23. package/dist/ai/ai.service.d.ts +30 -1
  24. package/dist/ai/ai.service.d.ts.map +1 -1
  25. package/dist/ai/ai.service.js +97 -3
  26. package/dist/ai/ai.service.js.map +1 -1
  27. package/dist/ai/dto/richtext-edit-html.dto.d.ts +5 -0
  28. package/dist/ai/dto/richtext-edit-html.dto.d.ts.map +1 -0
  29. package/dist/ai/dto/richtext-edit-html.dto.js +27 -0
  30. package/dist/ai/dto/richtext-edit-html.dto.js.map +1 -0
  31. package/dist/ai/richtext-ai.prompts.d.ts +5 -0
  32. package/dist/ai/richtext-ai.prompts.d.ts.map +1 -0
  33. package/dist/ai/richtext-ai.prompts.js +57 -0
  34. package/dist/ai/richtext-ai.prompts.js.map +1 -0
  35. package/dist/ai/richtext-ai.service.d.ts +34 -0
  36. package/dist/ai/richtext-ai.service.d.ts.map +1 -0
  37. package/dist/ai/richtext-ai.service.js +95 -0
  38. package/dist/ai/richtext-ai.service.js.map +1 -0
  39. package/dist/ai-instruction/ai-instruction.controller.d.ts +5 -5
  40. package/dist/auth/auth.controller.d.ts +66 -7
  41. package/dist/auth/auth.controller.d.ts.map +1 -1
  42. package/dist/auth/auth.controller.js +67 -23
  43. package/dist/auth/auth.controller.js.map +1 -1
  44. package/dist/auth/auth.module.d.ts.map +1 -1
  45. package/dist/auth/auth.module.js +2 -0
  46. package/dist/auth/auth.module.js.map +1 -1
  47. package/dist/auth/auth.service.d.ts +136 -4
  48. package/dist/auth/auth.service.d.ts.map +1 -1
  49. package/dist/auth/auth.service.js +246 -48
  50. package/dist/auth/auth.service.js.map +1 -1
  51. package/dist/auth/dto/confirm-email.dto.d.ts +4 -0
  52. package/dist/auth/dto/confirm-email.dto.d.ts.map +1 -0
  53. package/dist/auth/dto/confirm-email.dto.js +22 -0
  54. package/dist/auth/dto/confirm-email.dto.js.map +1 -0
  55. package/dist/auth/dto/resend-confirmation.dto.d.ts +8 -0
  56. package/dist/auth/dto/resend-confirmation.dto.d.ts.map +1 -0
  57. package/dist/auth/dto/resend-confirmation.dto.js +36 -0
  58. package/dist/auth/dto/resend-confirmation.dto.js.map +1 -0
  59. package/dist/authorize/authorize.controller.d.ts +1 -1
  60. package/dist/authorize/authorize.controller.d.ts.map +1 -1
  61. package/dist/authorize/authorize.controller.js +4 -2
  62. package/dist/authorize/authorize.controller.js.map +1 -1
  63. package/dist/authorize/authorize.service.d.ts +7 -0
  64. package/dist/authorize/authorize.service.d.ts.map +1 -1
  65. package/dist/authorize/authorize.service.js +1 -1
  66. package/dist/authorize/authorize.service.js.map +1 -1
  67. package/dist/challenge/challenge.service.d.ts +18 -5
  68. package/dist/challenge/challenge.service.d.ts.map +1 -1
  69. package/dist/challenge/challenge.service.js +50 -3
  70. package/dist/challenge/challenge.service.js.map +1 -1
  71. package/dist/core.module.d.ts.map +1 -1
  72. package/dist/core.module.js +17 -0
  73. package/dist/core.module.js.map +1 -1
  74. package/dist/dashboard/dashboard/dashboard.controller.d.ts +6 -6
  75. package/dist/dashboard/dashboard/dashboard.service.d.ts +6 -6
  76. package/dist/dashboard/dashboard-component/dashboard-component.controller.d.ts +4 -4
  77. package/dist/dashboard/dashboard-component/dashboard-component.service.d.ts +4 -4
  78. package/dist/dashboard/dashboard-component-role/dashboard-component-role.controller.d.ts +1 -1
  79. package/dist/dashboard/dashboard-component-role/dashboard-component-role.service.d.ts +1 -1
  80. package/dist/dashboard/dashboard-core/dashboard-core.controller.d.ts +2 -2
  81. package/dist/dashboard/dashboard-core/dashboard-core.service.d.ts +2 -2
  82. package/dist/dashboard/dashboard-item/dashboard-item.controller.d.ts +2 -2
  83. package/dist/dashboard/dashboard-item/dashboard-item.service.d.ts +2 -2
  84. package/dist/file/file.controller.d.ts +8 -1
  85. package/dist/file/file.controller.d.ts.map +1 -1
  86. package/dist/file/file.controller.js +45 -7
  87. package/dist/file/file.controller.js.map +1 -1
  88. package/dist/file/file.service.d.ts +128 -1
  89. package/dist/file/file.service.d.ts.map +1 -1
  90. package/dist/file/file.service.js +319 -8
  91. package/dist/file/file.service.js.map +1 -1
  92. package/dist/file/image-optimization.service.d.ts +43 -0
  93. package/dist/file/image-optimization.service.d.ts.map +1 -1
  94. package/dist/file/image-optimization.service.js +154 -0
  95. package/dist/file/image-optimization.service.js.map +1 -1
  96. package/dist/file/provider/abstract.provider.d.ts +16 -0
  97. package/dist/file/provider/abstract.provider.d.ts.map +1 -1
  98. package/dist/file/provider/abstract.provider.js +4 -0
  99. package/dist/file/provider/abstract.provider.js.map +1 -1
  100. package/dist/file/provider/gcs.provider.d.ts +2 -0
  101. package/dist/file/provider/gcs.provider.d.ts.map +1 -1
  102. package/dist/file/provider/gcs.provider.js +10 -0
  103. package/dist/file/provider/gcs.provider.js.map +1 -1
  104. package/dist/file/provider/local.provider.d.ts +1 -0
  105. package/dist/file/provider/local.provider.d.ts.map +1 -1
  106. package/dist/file/provider/local.provider.js +13 -0
  107. package/dist/file/provider/local.provider.js.map +1 -1
  108. package/dist/file/provider/s3.provider.d.ts +5 -0
  109. package/dist/file/provider/s3.provider.d.ts.map +1 -1
  110. package/dist/file/provider/s3.provider.js +15 -0
  111. package/dist/file/provider/s3.provider.js.map +1 -1
  112. package/dist/file/provider/spaces.provider.d.ts +5 -0
  113. package/dist/file/provider/spaces.provider.d.ts.map +1 -1
  114. package/dist/file/provider/spaces.provider.js +16 -0
  115. package/dist/file/provider/spaces.provider.js.map +1 -1
  116. package/dist/impersonation/dto/redeem-impersonation.dto.d.ts +4 -0
  117. package/dist/impersonation/dto/redeem-impersonation.dto.d.ts.map +1 -0
  118. package/dist/impersonation/dto/redeem-impersonation.dto.js +23 -0
  119. package/dist/impersonation/dto/redeem-impersonation.dto.js.map +1 -0
  120. package/dist/impersonation/dto/start-impersonation.dto.d.ts +7 -0
  121. package/dist/impersonation/dto/start-impersonation.dto.d.ts.map +1 -0
  122. package/dist/impersonation/dto/start-impersonation.dto.js +27 -0
  123. package/dist/impersonation/dto/start-impersonation.dto.js.map +1 -0
  124. package/dist/impersonation/impersonation-restrictions.d.ts +26 -0
  125. package/dist/impersonation/impersonation-restrictions.d.ts.map +1 -0
  126. package/dist/impersonation/impersonation-restrictions.js +76 -0
  127. package/dist/impersonation/impersonation-restrictions.js.map +1 -0
  128. package/dist/impersonation/impersonation.controller.d.ts +90 -0
  129. package/dist/impersonation/impersonation.controller.d.ts.map +1 -0
  130. package/dist/impersonation/impersonation.controller.js +135 -0
  131. package/dist/impersonation/impersonation.controller.js.map +1 -0
  132. package/dist/impersonation/impersonation.module.d.ts +8 -0
  133. package/dist/impersonation/impersonation.module.d.ts.map +1 -0
  134. package/dist/impersonation/impersonation.module.js +44 -0
  135. package/dist/impersonation/impersonation.module.js.map +1 -0
  136. package/dist/impersonation/impersonation.service.d.ts +164 -0
  137. package/dist/impersonation/impersonation.service.d.ts.map +1 -0
  138. package/dist/impersonation/impersonation.service.js +408 -0
  139. package/dist/impersonation/impersonation.service.js.map +1 -0
  140. package/dist/index.d.ts +17 -0
  141. package/dist/index.d.ts.map +1 -1
  142. package/dist/index.js +19 -0
  143. package/dist/index.js.map +1 -1
  144. package/dist/integration/services/outbox-polling.coordinator.d.ts +2 -0
  145. package/dist/integration/services/outbox-polling.coordinator.d.ts.map +1 -1
  146. package/dist/integration/services/outbox-polling.coordinator.js +50 -30
  147. package/dist/integration/services/outbox-polling.coordinator.js.map +1 -1
  148. package/dist/integration/services/outbox.service.d.ts.map +1 -1
  149. package/dist/integration/services/outbox.service.js +5 -1
  150. package/dist/integration/services/outbox.service.js.map +1 -1
  151. package/dist/integration-profile/integration-profile.secrets.d.ts.map +1 -1
  152. package/dist/integration-profile/integration-profile.secrets.js +3 -0
  153. package/dist/integration-profile/integration-profile.secrets.js.map +1 -1
  154. package/dist/integration-profile/integration-profile.utils.d.ts +14 -0
  155. package/dist/integration-profile/integration-profile.utils.d.ts.map +1 -1
  156. package/dist/integration-profile/integration-profile.utils.js +26 -0
  157. package/dist/integration-profile/integration-profile.utils.js.map +1 -1
  158. package/dist/integration-profile/testers/email.testers.d.ts.map +1 -1
  159. package/dist/integration-profile/testers/email.testers.js +28 -0
  160. package/dist/integration-profile/testers/email.testers.js.map +1 -1
  161. package/dist/language/en.json +11 -0
  162. package/dist/language/pt.json +11 -0
  163. package/dist/mail/dto/send.dto.d.ts +38 -1
  164. package/dist/mail/dto/send.dto.d.ts.map +1 -1
  165. package/dist/mail/dto/send.dto.js +10 -0
  166. package/dist/mail/dto/send.dto.js.map +1 -1
  167. package/dist/mail/mail.controller.d.ts +1 -0
  168. package/dist/mail/mail.controller.d.ts.map +1 -1
  169. package/dist/mail/mail.module.d.ts.map +1 -1
  170. package/dist/mail/mail.module.js +2 -0
  171. package/dist/mail/mail.module.js.map +1 -1
  172. package/dist/mail/mail.service.d.ts +48 -4
  173. package/dist/mail/mail.service.d.ts.map +1 -1
  174. package/dist/mail/mail.service.js +187 -35
  175. package/dist/mail/mail.service.js.map +1 -1
  176. package/dist/mail-delivery/mail-delivery-provision.service.d.ts +21 -0
  177. package/dist/mail-delivery/mail-delivery-provision.service.d.ts.map +1 -0
  178. package/dist/mail-delivery/mail-delivery-provision.service.js +64 -0
  179. package/dist/mail-delivery/mail-delivery-provision.service.js.map +1 -0
  180. package/dist/mail-delivery/mail-delivery.constants.d.ts +17 -0
  181. package/dist/mail-delivery/mail-delivery.constants.d.ts.map +1 -0
  182. package/dist/mail-delivery/mail-delivery.constants.js +31 -0
  183. package/dist/mail-delivery/mail-delivery.constants.js.map +1 -0
  184. package/dist/mail-delivery/mail-delivery.controller.d.ts +19 -0
  185. package/dist/mail-delivery/mail-delivery.controller.d.ts.map +1 -0
  186. package/dist/mail-delivery/mail-delivery.controller.js +53 -0
  187. package/dist/mail-delivery/mail-delivery.controller.js.map +1 -0
  188. package/dist/mail-delivery/mail-delivery.module.d.ts +7 -0
  189. package/dist/mail-delivery/mail-delivery.module.d.ts.map +1 -0
  190. package/dist/mail-delivery/mail-delivery.module.js +36 -0
  191. package/dist/mail-delivery/mail-delivery.module.js.map +1 -0
  192. package/dist/mail-delivery/mail-delivery.service.d.ts +38 -0
  193. package/dist/mail-delivery/mail-delivery.service.d.ts.map +1 -0
  194. package/dist/mail-delivery/mail-delivery.service.js +140 -0
  195. package/dist/mail-delivery/mail-delivery.service.js.map +1 -0
  196. package/dist/mail-delivery/ses-event.parser.d.ts +27 -0
  197. package/dist/mail-delivery/ses-event.parser.d.ts.map +1 -0
  198. package/dist/mail-delivery/ses-event.parser.js +131 -0
  199. package/dist/mail-delivery/ses-event.parser.js.map +1 -0
  200. package/dist/mail-delivery/ses-webhook.service.d.ts +58 -0
  201. package/dist/mail-delivery/ses-webhook.service.d.ts.map +1 -0
  202. package/dist/mail-delivery/ses-webhook.service.js +214 -0
  203. package/dist/mail-delivery/ses-webhook.service.js.map +1 -0
  204. package/dist/mail-delivery/sns-message.util.d.ts +38 -0
  205. package/dist/mail-delivery/sns-message.util.d.ts.map +1 -0
  206. package/dist/mail-delivery/sns-message.util.js +109 -0
  207. package/dist/mail-delivery/sns-message.util.js.map +1 -0
  208. package/dist/mail-sent/dto/query-mail-sent-list.dto.d.ts +5 -0
  209. package/dist/mail-sent/dto/query-mail-sent-list.dto.d.ts.map +1 -1
  210. package/dist/mail-sent/dto/query-mail-sent-list.dto.js +6 -0
  211. package/dist/mail-sent/dto/query-mail-sent-list.dto.js.map +1 -1
  212. package/dist/mail-sent/mail-sent.controller.d.ts +39 -0
  213. package/dist/mail-sent/mail-sent.controller.d.ts.map +1 -1
  214. package/dist/mail-sent/mail-sent.service.d.ts +39 -0
  215. package/dist/mail-sent/mail-sent.service.d.ts.map +1 -1
  216. package/dist/mail-sent/mail-sent.service.js +45 -4
  217. package/dist/mail-sent/mail-sent.service.js.map +1 -1
  218. package/dist/mailbox/mailbox-fetcher.registry.d.ts +100 -0
  219. package/dist/mailbox/mailbox-fetcher.registry.d.ts.map +1 -0
  220. package/dist/mailbox/mailbox-fetcher.registry.js +59 -0
  221. package/dist/mailbox/mailbox-fetcher.registry.js.map +1 -0
  222. package/dist/mailbox/mailbox.module.d.ts +8 -0
  223. package/dist/mailbox/mailbox.module.d.ts.map +1 -0
  224. package/dist/mailbox/mailbox.module.js +27 -0
  225. package/dist/mailbox/mailbox.module.js.map +1 -0
  226. package/dist/meeting/meeting-provider.registry.d.ts +155 -0
  227. package/dist/meeting/meeting-provider.registry.d.ts.map +1 -0
  228. package/dist/meeting/meeting-provider.registry.js +53 -0
  229. package/dist/meeting/meeting-provider.registry.js.map +1 -0
  230. package/dist/meeting/meeting.constants.d.ts +47 -0
  231. package/dist/meeting/meeting.constants.d.ts.map +1 -0
  232. package/dist/meeting/meeting.constants.js +21 -0
  233. package/dist/meeting/meeting.constants.js.map +1 -0
  234. package/dist/meeting/meeting.module.d.ts +7 -0
  235. package/dist/meeting/meeting.module.d.ts.map +1 -0
  236. package/dist/meeting/meeting.module.js +26 -0
  237. package/dist/meeting/meeting.module.js.map +1 -0
  238. package/dist/middlewares/locale-injection.middleware.d.ts +12 -0
  239. package/dist/middlewares/locale-injection.middleware.d.ts.map +1 -1
  240. package/dist/middlewares/locale-injection.middleware.js +20 -4
  241. package/dist/middlewares/locale-injection.middleware.js.map +1 -1
  242. package/dist/oauth/providers/google.provider.d.ts +7 -0
  243. package/dist/oauth/providers/google.provider.d.ts.map +1 -1
  244. package/dist/oauth/providers/google.provider.js +43 -13
  245. package/dist/oauth/providers/google.provider.js.map +1 -1
  246. package/dist/observability/monitored-cron.d.ts +34 -0
  247. package/dist/observability/monitored-cron.d.ts.map +1 -0
  248. package/dist/observability/monitored-cron.js +118 -0
  249. package/dist/observability/monitored-cron.js.map +1 -0
  250. package/dist/pairing/dto/approve-reverse-pairing.dto.d.ts +12 -0
  251. package/dist/pairing/dto/approve-reverse-pairing.dto.d.ts.map +1 -0
  252. package/dist/pairing/dto/approve-reverse-pairing.dto.js +30 -0
  253. package/dist/pairing/dto/approve-reverse-pairing.dto.js.map +1 -0
  254. package/dist/pairing/dto/claim-pairing.dto.d.ts +11 -0
  255. package/dist/pairing/dto/claim-pairing.dto.d.ts.map +1 -0
  256. package/dist/pairing/dto/claim-pairing.dto.js +35 -0
  257. package/dist/pairing/dto/claim-pairing.dto.js.map +1 -0
  258. package/dist/pairing/dto/confirm-pairing.dto.d.ts +10 -0
  259. package/dist/pairing/dto/confirm-pairing.dto.d.ts.map +1 -0
  260. package/dist/pairing/dto/confirm-pairing.dto.js +24 -0
  261. package/dist/pairing/dto/confirm-pairing.dto.js.map +1 -0
  262. package/dist/pairing/dto/poll-reverse-pairing.dto.d.ts +5 -0
  263. package/dist/pairing/dto/poll-reverse-pairing.dto.d.ts.map +1 -0
  264. package/dist/pairing/dto/poll-reverse-pairing.dto.js +24 -0
  265. package/dist/pairing/dto/poll-reverse-pairing.dto.js.map +1 -0
  266. package/dist/pairing/dto/start-pairing.dto.d.ts +11 -0
  267. package/dist/pairing/dto/start-pairing.dto.d.ts.map +1 -0
  268. package/dist/pairing/dto/start-pairing.dto.js +30 -0
  269. package/dist/pairing/dto/start-pairing.dto.js.map +1 -0
  270. package/dist/pairing/dto/start-reverse-pairing.dto.d.ts +24 -0
  271. package/dist/pairing/dto/start-reverse-pairing.dto.d.ts.map +1 -0
  272. package/dist/pairing/dto/start-reverse-pairing.dto.js +47 -0
  273. package/dist/pairing/dto/start-reverse-pairing.dto.js.map +1 -0
  274. package/dist/pairing/pairing.controller.d.ts +118 -0
  275. package/dist/pairing/pairing.controller.d.ts.map +1 -0
  276. package/dist/pairing/pairing.controller.js +296 -0
  277. package/dist/pairing/pairing.controller.js.map +1 -0
  278. package/dist/pairing/pairing.module.d.ts +10 -0
  279. package/dist/pairing/pairing.module.d.ts.map +1 -0
  280. package/dist/pairing/pairing.module.js +40 -0
  281. package/dist/pairing/pairing.module.js.map +1 -0
  282. package/dist/pairing/pairing.service.d.ts +238 -0
  283. package/dist/pairing/pairing.service.d.ts.map +1 -0
  284. package/dist/pairing/pairing.service.js +495 -0
  285. package/dist/pairing/pairing.service.js.map +1 -0
  286. package/dist/pdf/pdf.service.d.ts +3 -6
  287. package/dist/pdf/pdf.service.d.ts.map +1 -1
  288. package/dist/pdf/pdf.service.js +8 -20
  289. package/dist/pdf/pdf.service.js.map +1 -1
  290. package/dist/profile/profile.controller.d.ts +11 -0
  291. package/dist/profile/profile.controller.d.ts.map +1 -1
  292. package/dist/profile/profile.service.d.ts +11 -0
  293. package/dist/profile/profile.service.d.ts.map +1 -1
  294. package/dist/profile/profile.service.js +20 -11
  295. package/dist/profile/profile.service.js.map +1 -1
  296. package/dist/redis/redis-pubsub.d.ts.map +1 -1
  297. package/dist/redis/redis-pubsub.js +44 -0
  298. package/dist/redis/redis-pubsub.js.map +1 -1
  299. package/dist/role/guards/role.guard.d.ts +5 -0
  300. package/dist/role/guards/role.guard.d.ts.map +1 -1
  301. package/dist/role/guards/role.guard.js +41 -39
  302. package/dist/role/guards/role.guard.js.map +1 -1
  303. package/dist/session/session.controller.d.ts +2 -0
  304. package/dist/session/session.controller.d.ts.map +1 -1
  305. package/dist/session/session.service.d.ts +39 -0
  306. package/dist/session/session.service.d.ts.map +1 -1
  307. package/dist/session/session.service.js +91 -8
  308. package/dist/session/session.service.js.map +1 -1
  309. package/dist/setting/brand-asset.service.d.ts +48 -0
  310. package/dist/setting/brand-asset.service.d.ts.map +1 -0
  311. package/dist/setting/brand-asset.service.js +130 -0
  312. package/dist/setting/brand-asset.service.js.map +1 -0
  313. package/dist/setting/setting.module.d.ts.map +1 -1
  314. package/dist/setting/setting.module.js +3 -2
  315. package/dist/setting/setting.module.js.map +1 -1
  316. package/dist/setting/setting.service.d.ts +33 -0
  317. package/dist/setting/setting.service.d.ts.map +1 -1
  318. package/dist/setting/setting.service.js +88 -0
  319. package/dist/setting/setting.service.js.map +1 -1
  320. package/dist/token/token.service.d.ts +23 -2
  321. package/dist/token/token.service.d.ts.map +1 -1
  322. package/dist/token/token.service.js +39 -4
  323. package/dist/token/token.service.js.map +1 -1
  324. package/dist/user/user.controller.d.ts +8 -22
  325. package/dist/user/user.controller.d.ts.map +1 -1
  326. package/dist/user/user.service.d.ts +44 -24
  327. package/dist/user/user.service.d.ts.map +1 -1
  328. package/dist/user/user.service.js +89 -6
  329. package/dist/user/user.service.js.map +1 -1
  330. package/dist/user-device/user-device.controller.d.ts +54 -0
  331. package/dist/user-device/user-device.controller.d.ts.map +1 -0
  332. package/dist/user-device/user-device.controller.js +103 -0
  333. package/dist/user-device/user-device.controller.js.map +1 -0
  334. package/dist/user-device/user-device.module.d.ts +3 -0
  335. package/dist/user-device/user-device.module.d.ts.map +1 -0
  336. package/dist/user-device/user-device.module.js +26 -0
  337. package/dist/user-device/user-device.module.js.map +1 -0
  338. package/dist/user-device/user-device.service.d.ts +71 -0
  339. package/dist/user-device/user-device.service.d.ts.map +1 -0
  340. package/dist/user-device/user-device.service.js +158 -0
  341. package/dist/user-device/user-device.service.js.map +1 -0
  342. package/dist/utils/device-key.d.ts +23 -0
  343. package/dist/utils/device-key.d.ts.map +1 -0
  344. package/dist/utils/device-key.js +31 -0
  345. package/dist/utils/device-key.js.map +1 -0
  346. package/dist/utils/geo-ip.d.ts +38 -0
  347. package/dist/utils/geo-ip.d.ts.map +1 -0
  348. package/dist/utils/geo-ip.js +122 -0
  349. package/dist/utils/geo-ip.js.map +1 -0
  350. package/dist/utils/locale-context.d.ts +10 -7
  351. package/dist/utils/locale-context.d.ts.map +1 -1
  352. package/dist/utils/locale-context.js +14 -8
  353. package/dist/utils/locale-context.js.map +1 -1
  354. package/dist/utils/security-event-vars.d.ts +56 -0
  355. package/dist/utils/security-event-vars.d.ts.map +1 -0
  356. package/dist/utils/security-event-vars.js +109 -0
  357. package/dist/utils/security-event-vars.js.map +1 -0
  358. package/dist/utils/user-agent.d.ts +19 -0
  359. package/dist/utils/user-agent.d.ts.map +1 -0
  360. package/dist/utils/user-agent.js +36 -0
  361. package/dist/utils/user-agent.js.map +1 -0
  362. package/dist/webhook-integration/webhook-integration.service.d.ts +5 -0
  363. package/dist/webhook-integration/webhook-integration.service.d.ts.map +1 -1
  364. package/dist/webhook-integration/webhook-integration.service.js +50 -4
  365. package/dist/webhook-integration/webhook-integration.service.js.map +1 -1
  366. package/dist/webhook-integration/webhook-protocol.registry.d.ts +6 -0
  367. package/dist/webhook-integration/webhook-protocol.registry.d.ts.map +1 -1
  368. package/dist/webhook-integration/webhook-protocol.registry.js.map +1 -1
  369. package/hedhog/data/integration_provider.yaml +9 -0
  370. package/hedhog/data/mail.yaml +198 -62
  371. package/hedhog/data/mail_layout.yaml +43 -33
  372. package/hedhog/data/menu.yaml +2 -0
  373. package/hedhog/data/role.yaml +16 -0
  374. package/hedhog/data/route.yaml +172 -3
  375. package/hedhog/data/setting_group.yaml +178 -2
  376. package/hedhog/data/setting_subgroup.yaml +8 -0
  377. package/hedhog/frontend/app/_lib/hooks/use-core-access.test.tsx.ejs +125 -0
  378. package/hedhog/frontend/app/_lib/hooks/use-core-access.ts.ejs +29 -0
  379. package/hedhog/frontend/app/_lib/hooks/use-impersonation-access.test.ts.ejs +71 -0
  380. package/hedhog/frontend/app/_lib/hooks/use-impersonation-access.ts.ejs +32 -0
  381. package/hedhog/frontend/app/access-log/page.tsx.ejs +96 -22
  382. package/hedhog/frontend/app/account/components/active-sessions.tsx.ejs +17 -1
  383. package/hedhog/frontend/app/account/components/known-devices.tsx.ejs +89 -0
  384. package/hedhog/frontend/app/account/components/profile-form.tsx.ejs +2 -1
  385. package/hedhog/frontend/app/account/components/user-devices-list.tsx.ejs +186 -0
  386. package/hedhog/frontend/app/account/devices/page.tsx.ejs +5 -0
  387. package/hedhog/frontend/app/account/layout.tsx.ejs +2 -0
  388. package/hedhog/frontend/app/configurations/[slug]/components/setting-field.test.tsx.ejs +298 -0
  389. package/hedhog/frontend/app/configurations/[slug]/components/setting-field.tsx.ejs +376 -1236
  390. package/hedhog/frontend/app/mail/log/page.tsx.ejs +210 -3
  391. package/hedhog/frontend/app/mail/template/page.tsx.ejs +190 -132
  392. package/hedhog/frontend/app/users/active-session.tsx.ejs +58 -11
  393. package/hedhog/frontend/app/users/page.tsx.ejs +69 -10
  394. package/hedhog/frontend/app/users/simulate-access-dialog.test.tsx.ejs +202 -0
  395. package/hedhog/frontend/app/users/simulate-access-dialog.tsx.ejs +170 -0
  396. package/hedhog/frontend/app/users/user-activity-timeline.tsx.ejs +19 -0
  397. package/hedhog/frontend/app/users/user-devices.tsx.ejs +89 -0
  398. package/hedhog/frontend/app/users/user-logs.tsx.ejs +13 -1
  399. package/hedhog/frontend/app/users/user-sheet.tsx.ejs +46 -24
  400. package/hedhog/frontend/messages/en.json +146 -48
  401. package/hedhog/frontend/messages/pt.json +146 -48
  402. package/hedhog/table/access_log.yaml +7 -0
  403. package/hedhog/table/file.yaml +8 -0
  404. package/hedhog/table/mail_delivery_event.yaml +76 -0
  405. package/hedhog/table/mail_sent.yaml +23 -0
  406. package/hedhog/table/user_activity.yaml +9 -0
  407. package/hedhog/table/user_device.yaml +52 -0
  408. package/hedhog/table/user_session.yaml +20 -1
  409. package/package.json +6 -5
  410. package/src/access-log/access-log.controller.ts +1 -0
  411. package/src/access-log/access-log.interceptor.ts +5 -1
  412. package/src/access-log/access-log.service.spec.ts +33 -2
  413. package/src/access-log/access-log.service.ts +38 -0
  414. package/src/access-log/dto/query-access-log.dto.ts +5 -0
  415. package/src/ai/ai.controller.ts +9 -0
  416. package/src/ai/ai.module.ts +3 -2
  417. package/src/ai/ai.service.ts +150 -13
  418. package/src/ai/dto/richtext-edit-html.dto.ts +11 -0
  419. package/src/ai/richtext-ai.prompts.ts +57 -0
  420. package/src/ai/richtext-ai.service.ts +109 -0
  421. package/src/auth/auth.controller.ts +47 -8
  422. package/src/auth/auth.module.ts +2 -0
  423. package/src/auth/auth.service.spec.ts +383 -6
  424. package/src/auth/auth.service.ts +345 -56
  425. package/src/auth/dto/confirm-email.dto.ts +7 -0
  426. package/src/auth/dto/resend-confirmation.dto.ts +20 -0
  427. package/src/authorize/authorize.controller.ts +2 -0
  428. package/src/authorize/authorize.service.spec.ts +23 -0
  429. package/src/authorize/authorize.service.ts +8 -0
  430. package/src/challenge/challenge.service.spec.ts +73 -0
  431. package/src/challenge/challenge.service.ts +62 -3
  432. package/src/core.module.ts +19 -0
  433. package/src/file/file.controller.ts +54 -4
  434. package/src/file/file.service.spec.ts +275 -105
  435. package/src/file/file.service.ts +409 -14
  436. package/src/file/image-optimization.service.spec.ts +92 -0
  437. package/src/file/image-optimization.service.ts +202 -0
  438. package/src/file/provider/abstract.provider.ts +23 -0
  439. package/src/file/provider/gcs.provider.ts +17 -0
  440. package/src/file/provider/local.provider.ts +21 -0
  441. package/src/file/provider/s3.provider.ts +25 -0
  442. package/src/file/provider/spaces.provider.ts +26 -0
  443. package/src/impersonation/dto/redeem-impersonation.dto.ts +8 -0
  444. package/src/impersonation/dto/start-impersonation.dto.ts +13 -0
  445. package/src/impersonation/impersonation-restrictions.ts +84 -0
  446. package/src/impersonation/impersonation.controller.ts +109 -0
  447. package/src/impersonation/impersonation.module.ts +31 -0
  448. package/src/impersonation/impersonation.service.spec.ts +427 -0
  449. package/src/impersonation/impersonation.service.ts +577 -0
  450. package/src/index.ts +21 -0
  451. package/src/integration/services/outbox-polling.coordinator.spec.ts +90 -0
  452. package/src/integration/services/outbox-polling.coordinator.ts +62 -40
  453. package/src/integration/services/outbox.service.spec.ts +8 -0
  454. package/src/integration/services/outbox.service.ts +19 -13
  455. package/src/integration-profile/integration-profile.secrets.ts +3 -0
  456. package/src/integration-profile/integration-profile.utils.ts +38 -0
  457. package/src/integration-profile/testers/email.testers.ts +34 -1
  458. package/src/language/en.json +11 -0
  459. package/src/language/pt.json +11 -0
  460. package/src/mail/dto/send.dto.ts +46 -2
  461. package/src/mail/mail-template.spec.ts +79 -2
  462. package/src/mail/mail.module.ts +2 -0
  463. package/src/mail/mail.service.spec.ts +307 -6
  464. package/src/mail/mail.service.ts +227 -30
  465. package/src/mail-delivery/mail-delivery-provision.service.ts +66 -0
  466. package/src/mail-delivery/mail-delivery.constants.ts +31 -0
  467. package/src/mail-delivery/mail-delivery.controller.ts +38 -0
  468. package/src/mail-delivery/mail-delivery.module.ts +23 -0
  469. package/src/mail-delivery/mail-delivery.service.spec.ts +136 -0
  470. package/src/mail-delivery/mail-delivery.service.ts +152 -0
  471. package/src/mail-delivery/ses-event.parser.spec.ts +140 -0
  472. package/src/mail-delivery/ses-event.parser.ts +191 -0
  473. package/src/mail-delivery/ses-webhook.service.spec.ts +170 -0
  474. package/src/mail-delivery/ses-webhook.service.ts +240 -0
  475. package/src/mail-delivery/sns-message.util.spec.ts +163 -0
  476. package/src/mail-delivery/sns-message.util.ts +125 -0
  477. package/src/mail-sent/dto/query-mail-sent-list.dto.ts +15 -0
  478. package/src/mail-sent/mail-sent.service.ts +46 -2
  479. package/src/mailbox/mailbox-fetcher.registry.ts +132 -0
  480. package/src/mailbox/mailbox.module.ts +14 -0
  481. package/src/meeting/meeting-provider.registry.ts +193 -0
  482. package/src/meeting/meeting.constants.ts +53 -0
  483. package/src/meeting/meeting.module.ts +13 -0
  484. package/src/middlewares/locale-injection.middleware.ts +25 -6
  485. package/src/oauth/providers/google.provider.ts +49 -15
  486. package/src/observability/monitored-cron.spec.ts +102 -0
  487. package/src/observability/monitored-cron.ts +110 -0
  488. package/src/pairing/dto/approve-reverse-pairing.dto.ts +20 -0
  489. package/src/pairing/dto/claim-pairing.dto.ts +19 -0
  490. package/src/pairing/dto/confirm-pairing.dto.ts +14 -0
  491. package/src/pairing/dto/poll-reverse-pairing.dto.ts +9 -0
  492. package/src/pairing/dto/start-pairing.dto.ts +19 -0
  493. package/src/pairing/dto/start-reverse-pairing.dto.ts +45 -0
  494. package/src/pairing/pairing.controller.ts +246 -0
  495. package/src/pairing/pairing.module.ts +27 -0
  496. package/src/pairing/pairing.service.spec.ts +462 -0
  497. package/src/pairing/pairing.service.ts +614 -0
  498. package/src/pdf/pdf.service.ts +6 -24
  499. package/src/profile/profile.service.ts +26 -8
  500. package/src/redis/redis-pubsub.ts +11 -0
  501. package/src/role/guards/role.guard.spec.ts +75 -0
  502. package/src/role/guards/role.guard.ts +64 -46
  503. package/src/session/session.service.spec.ts +81 -0
  504. package/src/session/session.service.ts +93 -6
  505. package/src/setting/brand-asset.service.ts +137 -0
  506. package/src/setting/setting.module.ts +3 -2
  507. package/src/setting/setting.service.spec.ts +79 -1
  508. package/src/setting/setting.service.ts +109 -1
  509. package/src/token/token.service.spec.ts +62 -0
  510. package/src/token/token.service.ts +57 -3
  511. package/src/user/user.service.spec.ts +33 -2
  512. package/src/user/user.service.ts +108 -6
  513. package/src/user-device/user-device.controller.ts +77 -0
  514. package/src/user-device/user-device.module.ts +13 -0
  515. package/src/user-device/user-device.service.spec.ts +234 -0
  516. package/src/user-device/user-device.service.ts +168 -0
  517. package/src/utils/device-key.spec.ts +57 -0
  518. package/src/utils/device-key.ts +32 -0
  519. package/src/utils/geo-ip.spec.ts +134 -0
  520. package/src/utils/geo-ip.ts +93 -0
  521. package/src/utils/locale-context.spec.ts +27 -1
  522. package/src/utils/locale-context.ts +15 -12
  523. package/src/utils/security-event-vars.spec.ts +161 -0
  524. package/src/utils/security-event-vars.ts +153 -0
  525. package/src/utils/user-agent.spec.ts +37 -0
  526. package/src/utils/user-agent.ts +46 -0
  527. package/src/webhook-integration/webhook-integration.service.ts +57 -3
  528. package/src/webhook-integration/webhook-protocol.registry.ts +6 -0
@@ -89,6 +89,45 @@
89
89
  slug: admin-access
90
90
  - where:
91
91
  slug: user
92
+ # Dispositivos conhecidos do proprio usuario. Mesmos papeis das sessoes: e a
93
+ # mesma area de seguranca da conta.
94
+ - url: /user-device
95
+ method: GET
96
+ type: HTTP
97
+ relations:
98
+ role:
99
+ - where:
100
+ slug: admin
101
+ - where:
102
+ slug: admin-access
103
+ - where:
104
+ slug: user
105
+ - url: /user-device/:deviceId
106
+ method: DELETE
107
+ type: HTTP
108
+ relations:
109
+ role:
110
+ - where:
111
+ slug: admin
112
+ - where:
113
+ slug: admin-access
114
+ - where:
115
+ slug: user
116
+ # Dispositivos de OUTRO usuario (sheet do admin): so admin.
117
+ - url: /user-device/user/:userId
118
+ method: GET
119
+ type: HTTP
120
+ relations:
121
+ role:
122
+ - where:
123
+ slug: admin
124
+ - url: /user-device/user/:userId/:deviceId
125
+ method: DELETE
126
+ type: HTTP
127
+ relations:
128
+ role:
129
+ - where:
130
+ slug: admin
92
131
  - url: /sessions/:sessionId/revoke
93
132
  method: DELETE
94
133
  type: HTTP
@@ -427,6 +466,42 @@
427
466
  slug: admin
428
467
  - where:
429
468
  slug: admin-user
469
+ # A acao "simular acesso" vive na tela de usuarios, entao quem so tem o
470
+ # papel de simulacao ainda precisa listar usuarios.
471
+ - where:
472
+ slug: admin-impersonation
473
+ # Simulacao de acesso. /impersonation/redeem e @Public() e /impersonation/stop e
474
+ # /impersonation/session sao @NoRole(), entao nao entram aqui — o RoleGuard
475
+ # retorna true antes de consultar a tabela nos tres casos.
476
+ - url: /impersonation/start
477
+ method: POST
478
+ type: HTTP
479
+ relations:
480
+ role:
481
+ - where:
482
+ slug: admin
483
+ - where:
484
+ slug: admin-impersonation
485
+ - url: /impersonation/history
486
+ method: GET
487
+ type: HTTP
488
+ relations:
489
+ role:
490
+ - where:
491
+ slug: admin
492
+ - where:
493
+ slug: admin-impersonation
494
+ - url: /impersonation/apps
495
+ method: GET
496
+ type: HTTP
497
+ relations:
498
+ role:
499
+ - where:
500
+ slug: admin
501
+ - where:
502
+ slug: admin-impersonation
503
+ # Gestao de papeis de um usuario: exige o papel dedicado admin-user-permission.
504
+ # admin-user administra o cadastro, mas nao concede/revoga papeis (escalonamento de privilegio).
430
505
  - url: /user/:userId/role
431
506
  method: GET
432
507
  type: HTTP
@@ -435,7 +510,7 @@
435
510
  - where:
436
511
  slug: admin
437
512
  - where:
438
- slug: admin-user
513
+ slug: admin-user-permission
439
514
  - url: /user/:userId/role/:roleId
440
515
  method: DELETE
441
516
  type: HTTP
@@ -444,7 +519,7 @@
444
519
  - where:
445
520
  slug: admin
446
521
  - where:
447
- slug: admin-user
522
+ slug: admin-user-permission
448
523
  - url: /user/:userId/role/:roleId
449
524
  method: POST
450
525
  type: HTTP
@@ -453,7 +528,7 @@
453
528
  - where:
454
529
  slug: admin
455
530
  - where:
456
- slug: admin-user
531
+ slug: admin-user-permission
457
532
  - url: /user/:userId
458
533
  method: GET
459
534
  type: HTTP
@@ -490,6 +565,8 @@
490
565
  slug: admin
491
566
  - where:
492
567
  slug: admin-access
568
+ - where:
569
+ slug: admin-user-permission
493
570
  - url: /user/:userId/route
494
571
  method: GET
495
572
  type: HTTP
@@ -499,6 +576,8 @@
499
576
  slug: admin
500
577
  - where:
501
578
  slug: admin-access
579
+ - where:
580
+ slug: admin-user-permission
502
581
  - url: /user
503
582
  method: POST
504
583
  type: HTTP
@@ -662,6 +741,11 @@
662
741
  slug: admin
663
742
  - where:
664
743
  slug: admin-access
744
+ # O editor do CMS sobe capa de post e imagem de Open Graph por aqui.
745
+ - where:
746
+ slug: admin-cms
747
+ - where:
748
+ slug: cms-editor
665
749
  - url: /file
666
750
  method: DELETE
667
751
  type: HTTP
@@ -1201,6 +1285,19 @@
1201
1285
  slug: admin
1202
1286
  - where:
1203
1287
  slug: admin-mail
1288
+ # Provisiona o webhook que recebe bounce/complaint/delivery do SES e devolve a
1289
+ # URL para assinar no topico SNS. O endpoint que recebe os eventos e o
1290
+ # /webhook/:uuid publico do core: ele nao entra aqui porque o RoleGuard
1291
+ # curto-circuita em IS_PUBLIC_KEY antes de ler a tabela `route`.
1292
+ - url: /mail-delivery/provision/:integrationProfileId
1293
+ method: POST
1294
+ type: HTTP
1295
+ relations:
1296
+ role:
1297
+ - where:
1298
+ slug: admin
1299
+ - where:
1300
+ slug: admin-mail
1204
1301
  - url: /mail-sent
1205
1302
  method: GET
1206
1303
  type: HTTP
@@ -1519,6 +1616,47 @@
1519
1616
  slug: admin
1520
1617
  - where:
1521
1618
  slug: admin-access
1619
+ - url: /ai/richtext/edit-html
1620
+ method: POST
1621
+ type: HTTP
1622
+ relations:
1623
+ role:
1624
+ - where:
1625
+ slug: admin
1626
+ - where:
1627
+ slug: admin-access
1628
+ - where:
1629
+ slug: admin-campaign
1630
+ - where:
1631
+ slug: admin-cms
1632
+ - where:
1633
+ slug: cms-editor
1634
+ - where:
1635
+ slug: cms-publisher
1636
+ - where:
1637
+ slug: admin-finance
1638
+ - where:
1639
+ slug: admin-finance-operator
1640
+ - where:
1641
+ slug: finance-statements-editor
1642
+ - where:
1643
+ slug: admin-inbox
1644
+ - where:
1645
+ slug: inbox-owner
1646
+ - where:
1647
+ slug: admin-lms
1648
+ - where:
1649
+ slug: lms-instructor
1650
+ - where:
1651
+ slug: admin-operations-director
1652
+ - where:
1653
+ slug: admin-operations-project-manager
1654
+ - where:
1655
+ slug: operations-collaborator
1656
+ - where:
1657
+ slug: admin-sac
1658
+ - where:
1659
+ slug: sac-agent
1522
1660
  - url: /integration-event-catalog
1523
1661
  method: GET
1524
1662
  type: HTTP
@@ -3357,6 +3495,37 @@
3357
3495
  method: POST
3358
3496
  type: HTTP
3359
3497
  relations: *core_user_roles
3498
+ # Pareamento por QR. Só as rotas que exigem sessão entram aqui: /auth/pairing/claim,
3499
+ # /auth/pairing/redeem, /auth/pairing/reverse e /auth/pairing/reverse/poll são
3500
+ # @Public() — o aparelho que as chama ainda não tem sessão nenhuma.
3501
+ - url: /auth/pairing
3502
+ method: POST
3503
+ type: HTTP
3504
+ relations: *core_user_roles
3505
+ - url: /auth/pairing/:id
3506
+ method: GET
3507
+ type: HTTP
3508
+ relations: *core_user_roles
3509
+ - url: /auth/pairing/:id/confirm
3510
+ method: POST
3511
+ type: HTTP
3512
+ relations: *core_user_roles
3513
+ - url: /auth/pairing/:id
3514
+ method: DELETE
3515
+ type: HTTP
3516
+ relations: *core_user_roles
3517
+ - url: /auth/pairing/reverse/:id
3518
+ method: GET
3519
+ type: HTTP
3520
+ relations: *core_user_roles
3521
+ - url: /auth/pairing/reverse/:id/approve
3522
+ method: POST
3523
+ type: HTTP
3524
+ relations: *core_user_roles
3525
+ - url: /auth/pairing/reverse/:id/reject
3526
+ method: POST
3527
+ type: HTTP
3528
+ relations: *core_user_roles
3360
3529
  - url: /auth/roles
3361
3530
  method: GET
3362
3531
  type: HTTP
@@ -76,6 +76,20 @@
76
76
  subgroup_id:
77
77
  where:
78
78
  slug: general-system
79
+ - slug: cors-allowed-origins
80
+ type: array
81
+ component: input-tags
82
+ name:
83
+ en: Extra CORS Origins
84
+ pt: Origens CORS Adicionais
85
+ description:
86
+ en: 'Extra origins allowed to call the API from a browser, added to CORS_ALLOWED_ORIGINS/CORS_ALLOWED_DOMAINS and applied without a restart. Already includes the published browser extension; add your own only if you build the extension yourself.'
87
+ pt: 'Origens adicionais autorizadas a chamar a API pelo navegador, somadas a CORS_ALLOWED_ORIGINS/CORS_ALLOWED_DOMAINS e aplicadas sem reiniciar. Já inclui a extensão de navegador publicada; acrescente as suas apenas se você mesmo compilar a extensão.'
88
+ value: '["chrome-extension://ojimnolpmeegaaindaaceiodhmlbaljn"]'
89
+ user_override: false
90
+ subgroup_id:
91
+ where:
92
+ slug: general-system
79
93
  - slug: app-names
80
94
  type: array
81
95
  component: input-tags
@@ -83,8 +97,8 @@
83
97
  en: App Names
84
98
  pt: Nomes dos Aplicativos
85
99
  description:
86
- en: 'Display name for specific apps, formatted as "app=Name" (one per tag). Used as the brand name shown in transactional emails when the request comes from that app, falling back to System Name otherwise.'
87
- pt: 'Nome de exibição de apps específicos, no formato "app=Nome" (uma por tag). Usado como o nome de marca exibido em e-mails transacionais quando a solicitação vem desse app, usando o Nome do Sistema como alternativa.'
100
+ en: 'Deprecated: no longer used. Transactional emails always show the System Name. Kept for backward compatibility.'
101
+ pt: 'Descontinuada: não é mais usada. E-mails transacionais sempre exibem o Nome do Sistema. Mantida por compatibilidade.'
88
102
  value: '["training=Training","class=Class","partners=Partners","admin=Admin"]'
89
103
  user_override: false
90
104
  subgroup_id:
@@ -376,6 +390,34 @@
376
390
  subgroup_id:
377
391
  where:
378
392
  slug: mcp-configuration
393
+ - slug: richtext-ai-enabled
394
+ type: boolean
395
+ component: switch
396
+ name:
397
+ en: Enable AI in Rich Text Editor
398
+ pt: Habilitar IA no Editor de Texto
399
+ description:
400
+ en: Shows an AI button in the rich text editor toolbar (used across the admin), letting users rewrite the current content from a prompt.
401
+ pt: Exibe um botão de IA na barra de ferramentas do editor de texto rico (usado em todo o admin), permitindo reescrever o conteúdo atual a partir de um prompt.
402
+ value: false
403
+ user_override: false
404
+ subgroup_id:
405
+ where:
406
+ slug: richtext-ai-configuration
407
+ - slug: richtext-ai-profile-id
408
+ type: string
409
+ component: entity-picker
410
+ name:
411
+ en: AI Profile
412
+ pt: Perfil de IA
413
+ description:
414
+ en: Integration profile (type AI) used to rewrite rich text editor content from a prompt.
415
+ pt: Perfil de integração (tipo IA) usado para reescrever o conteúdo do editor de texto rico a partir de um prompt.
416
+ value: ''
417
+ user_override: false
418
+ subgroup_id:
419
+ where:
420
+ slug: richtext-ai-configuration
379
421
  - slug: authentication
380
422
  icon: lock-password
381
423
  name:
@@ -665,6 +707,20 @@
665
707
  subgroup_id:
666
708
  where:
667
709
  slug: session-management
710
+ - slug: impersonation-session-minutes
711
+ type: number
712
+ component: input-number
713
+ name:
714
+ en: Simulated Session Lifetime
715
+ pt: Duração da Sessão Simulada
716
+ description:
717
+ en: Minutes an access simulation session stays valid. It is never refreshed, so this is the hard limit.
718
+ pt: Minutos que uma sessão de simulação de acesso continua válida. Ela nunca é renovada, então este é o limite absoluto.
719
+ value: 30
720
+ user_override: false
721
+ subgroup_id:
722
+ where:
723
+ slug: session-management
668
724
  - slug: localization
669
725
  icon: world
670
726
  name:
@@ -1102,6 +1158,12 @@
1102
1158
  order: 10
1103
1159
  - value: User.ReadBasic.All
1104
1160
  order: 11
1161
+ - value: Calendars.ReadWrite
1162
+ order: 12
1163
+ - value: OnlineMeetings.ReadWrite
1164
+ order: 13
1165
+ - value: OnlineMeetingRecording.Read.All
1166
+ order: 14
1105
1167
  subgroup_id:
1106
1168
  where:
1107
1169
  slug: microsoft-entra-id
@@ -1133,6 +1195,106 @@
1133
1195
  subgroup_id:
1134
1196
  where:
1135
1197
  slug: microsoft-entra-id
1198
+ - slug: microsoft-meeting-organizer-mode
1199
+ type: string
1200
+ component: radio
1201
+ name:
1202
+ en: Teams meeting organizer
1203
+ pt: Organizador das reuniões Teams
1204
+ description:
1205
+ en: 'Who organizes the meetings this system schedules: "app" uses a fixed service account via application permissions (the instructor does not need a connected account); "delegated" uses the connected Microsoft account of whoever requested the meeting.'
1206
+ pt: 'Quem organiza as reuniões agendadas pelo sistema: "app" usa uma conta de serviço fixa com permissões de aplicativo (o instrutor não precisa ter conta conectada); "delegated" usa a conta Microsoft conectada de quem pediu a reunião.'
1207
+ value: app
1208
+ user_override: false
1209
+ relations:
1210
+ setting_list:
1211
+ - value: app
1212
+ order: 0
1213
+ - value: delegated
1214
+ order: 1
1215
+ subgroup_id:
1216
+ where:
1217
+ slug: microsoft-entra-id
1218
+ - slug: microsoft-meeting-service-account
1219
+ type: string
1220
+ component: input-text
1221
+ name:
1222
+ en: Teams meeting service account (UPN)
1223
+ pt: Conta de serviço das reuniões (UPN)
1224
+ description:
1225
+ en: UPN of the mailbox that organizes and records the meetings when the organizer is "app". Needs a Teams license, a policy allowing cloud recording, and an Application Access Policy granting this app access to it.
1226
+ pt: UPN da caixa que organiza e grava as reuniões quando o organizador é "app". Precisa de licença do Teams, política que permita gravação na nuvem e uma Application Access Policy dando acesso a este aplicativo.
1227
+ value: ""
1228
+ user_override: false
1229
+ subgroup_id:
1230
+ where:
1231
+ slug: microsoft-entra-id
1232
+ - slug: microsoft-meeting-recording-poll-hours
1233
+ type: number
1234
+ component: input-number
1235
+ name:
1236
+ en: Recording lookup window (hours)
1237
+ pt: Janela de busca da gravação (horas)
1238
+ description:
1239
+ en: How long after a meeting ends the system keeps looking for its recording before giving up and marking it unavailable.
1240
+ pt: Por quanto tempo, após o fim da reunião, o sistema continua procurando a gravação antes de desistir e marcá-la como indisponível.
1241
+ value: '48'
1242
+ user_override: false
1243
+ subgroup_id:
1244
+ where:
1245
+ slug: microsoft-entra-id
1246
+ - slug: microsoft-meeting-recording-purge-mode
1247
+ type: string
1248
+ component: radio
1249
+ name:
1250
+ en: OneDrive recording cleanup
1251
+ pt: Limpeza da gravação no OneDrive
1252
+ description:
1253
+ en: 'What to do with the recording in the organizer''s OneDrive once it is safely imported: nothing, log only, recycle bin, or permanent delete. The recycle bin still uses the account quota for up to 93 days.'
1254
+ pt: 'O que fazer com a gravação no OneDrive do organizador depois de importada com segurança: nada, só registrar no log, mandar para a lixeira ou excluir em definitivo. A lixeira ainda consome a cota por até 93 dias.'
1255
+ value: disabled
1256
+ user_override: false
1257
+ relations:
1258
+ setting_list:
1259
+ - value: disabled
1260
+ order: 0
1261
+ - value: dry_run
1262
+ order: 1
1263
+ - value: recycle_bin
1264
+ order: 2
1265
+ - value: permanent
1266
+ order: 3
1267
+ subgroup_id:
1268
+ where:
1269
+ slug: microsoft-entra-id
1270
+ - slug: microsoft-meeting-recording-purge-grace-days
1271
+ type: number
1272
+ component: input-number
1273
+ name:
1274
+ en: Cleanup grace period (days)
1275
+ pt: Carência antes da limpeza (dias)
1276
+ description:
1277
+ en: How long to wait after a successful import before deleting the recording from OneDrive. The window exists so a failed transcoding or a wrong import can still be redone from the original.
1278
+ pt: Quanto tempo esperar após uma importação bem-sucedida antes de apagar a gravação do OneDrive. A janela existe para que uma transcodificação falha ou um import errado ainda possam ser refeitos a partir do original.
1279
+ value: '7'
1280
+ user_override: false
1281
+ subgroup_id:
1282
+ where:
1283
+ slug: microsoft-entra-id
1284
+ - slug: microsoft-meeting-recording-folder
1285
+ type: string
1286
+ component: input-text
1287
+ name:
1288
+ en: OneDrive recordings folder
1289
+ pt: Pasta das gravações no OneDrive
1290
+ description:
1291
+ en: Name of the folder where Teams drops recordings in the organizer's OneDrive. The name follows the tenant language, and nothing outside this folder is ever deleted.
1292
+ pt: Nome da pasta onde o Teams deposita as gravações no OneDrive do organizador. O nome acompanha o idioma da organização, e nada fora dessa pasta é apagado.
1293
+ value: Recordings
1294
+ user_override: false
1295
+ subgroup_id:
1296
+ where:
1297
+ slug: microsoft-entra-id
1136
1298
  - slug: oauth-apple-profile-id
1137
1299
  type: string
1138
1300
  component: entity-picker
@@ -2095,6 +2257,20 @@
2095
2257
  subgroup_id:
2096
2258
  where:
2097
2259
  slug: image-optimization
2260
+ - slug: image-resize-allowed-widths
2261
+ type: string
2262
+ component: input-text
2263
+ name:
2264
+ en: Allowed Resize Widths (px)
2265
+ pt: Larguras Permitidas de Redimensionamento (px)
2266
+ description:
2267
+ en: 'JSON list of widths the public image endpoint may render via ?w=. Any other width serves the original file. An allowlist is required because the endpoint is public: an arbitrary width means arbitrary CPU per request.'
2268
+ pt: 'Lista JSON de larguras que o endpoint público de imagens pode gerar via ?w=. Qualquer outra largura serve o arquivo original. A lista é obrigatória porque o endpoint é público: uma largura arbitrária significa CPU arbitrária por requisição.'
2269
+ value: '[64,128,320,400,480,640,896,1200]'
2270
+ user_override: false
2271
+ subgroup_id:
2272
+ where:
2273
+ slug: image-optimization
2098
2274
  - slug: image-cache-ttl-seconds
2099
2275
  type: number
2100
2276
  component: input-number
@@ -373,3 +373,11 @@
373
373
  description:
374
374
  en: Model Context Protocol configuration
375
375
  pt: Configuração do servidor MCP
376
+
377
+ - slug: richtext-ai-configuration
378
+ name:
379
+ en: Rich Text AI
380
+ pt: IA no Editor de Texto
381
+ description:
382
+ en: AI-assisted rewriting for the shared rich text editor used across the admin
383
+ pt: Reescrita assistida por IA para o editor de texto rico compartilhado usado no admin
@@ -0,0 +1,125 @@
1
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
2
+ import { renderHook, waitFor } from '@testing-library/react';
3
+ import { type ReactNode } from 'react';
4
+
5
+ // useCoreAccess combina useApp().request/accessToken com useQuery real, igual ao
6
+ // padrão de use-finance-access.test.tsx. A lógica determinística real está na
7
+ // derivação de roleSlugs/canManageUserPermissions a partir da resposta.
8
+ const { mockRequest, appState } = vi.hoisted(() => ({
9
+ mockRequest: vi.fn(),
10
+ appState: { accessToken: undefined as string | undefined },
11
+ }));
12
+ vi.mock('@hed-hog/next-app-provider', async () => {
13
+ const rq = await vi.importActual<typeof import('@tanstack/react-query')>(
14
+ '@tanstack/react-query',
15
+ );
16
+ return {
17
+ useApp: () => ({ request: mockRequest, accessToken: appState.accessToken }),
18
+ useQuery: rq.useQuery,
19
+ };
20
+ });
21
+
22
+ import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
23
+ import { useCoreAccess } from './use-core-access';
24
+
25
+ function makeWrapper() {
26
+ const client = new QueryClient({
27
+ defaultOptions: { queries: { retry: false } },
28
+ });
29
+ return function Wrapper({ children }: { children: ReactNode }) {
30
+ return <QueryClientProvider client={client}>{children}</QueryClientProvider>;
31
+ };
32
+ }
33
+
34
+ describe('useCoreAccess', () => {
35
+ beforeEach(() => {
36
+ mockRequest.mockReset();
37
+ appState.accessToken = 'tok';
38
+ });
39
+
40
+ it('não dispara a query sem accessToken (enabled=false)', () => {
41
+ appState.accessToken = undefined;
42
+ const { result } = renderHook(() => useCoreAccess(), {
43
+ wrapper: makeWrapper(),
44
+ });
45
+
46
+ expect(mockRequest).not.toHaveBeenCalled();
47
+ expect(result.current.isLoading).toBe(false);
48
+ expect(result.current.roleSlugs).toEqual([]);
49
+ expect(result.current.canManageUserPermissions).toBe(false);
50
+ });
51
+
52
+ it('canManageUserPermissions é true para admin', async () => {
53
+ mockRequest.mockResolvedValue({ data: { roles: [{ slug: 'admin' }] } });
54
+ const { result } = renderHook(() => useCoreAccess(), {
55
+ wrapper: makeWrapper(),
56
+ });
57
+
58
+ await waitFor(() => expect(result.current.roleSlugs).toEqual(['admin']));
59
+ expect(result.current.canManageUserPermissions).toBe(true);
60
+ });
61
+
62
+ it('canManageUserPermissions é true para admin-user-permission', async () => {
63
+ mockRequest.mockResolvedValue({
64
+ data: { roles: [{ slug: 'admin-user-permission' }] },
65
+ });
66
+ const { result } = renderHook(() => useCoreAccess(), {
67
+ wrapper: makeWrapper(),
68
+ });
69
+
70
+ await waitFor(() =>
71
+ expect(result.current.roleSlugs).toEqual(['admin-user-permission']),
72
+ );
73
+ expect(result.current.canManageUserPermissions).toBe(true);
74
+ });
75
+
76
+ it('canManageUserPermissions é false para admin-user (deliberadamente excluído)', async () => {
77
+ mockRequest.mockResolvedValue({ data: { roles: [{ slug: 'admin-user' }] } });
78
+ const { result } = renderHook(() => useCoreAccess(), {
79
+ wrapper: makeWrapper(),
80
+ });
81
+
82
+ await waitFor(() =>
83
+ expect(result.current.roleSlugs).toEqual(['admin-user']),
84
+ );
85
+ expect(result.current.canManageUserPermissions).toBe(false);
86
+ });
87
+
88
+ it('canManageUserPermissions é false para outros papéis admin-*', async () => {
89
+ mockRequest.mockResolvedValue({
90
+ data: { roles: [{ slug: 'admin-mail' }, { slug: 'admin-access' }] },
91
+ });
92
+ const { result } = renderHook(() => useCoreAccess(), {
93
+ wrapper: makeWrapper(),
94
+ });
95
+
96
+ await waitFor(() =>
97
+ expect(result.current.roleSlugs).toEqual(['admin-mail', 'admin-access']),
98
+ );
99
+ expect(result.current.canManageUserPermissions).toBe(false);
100
+ });
101
+
102
+ it('filtra roles sem slug (vazio/undefined) da lista final', async () => {
103
+ mockRequest.mockResolvedValue({
104
+ data: { roles: [{ slug: '' }, { slug: undefined }, { slug: 'user' }] },
105
+ });
106
+ const { result } = renderHook(() => useCoreAccess(), {
107
+ wrapper: makeWrapper(),
108
+ });
109
+
110
+ await waitFor(() => expect(result.current.roleSlugs).toEqual(['user']));
111
+ expect(result.current.canManageUserPermissions).toBe(false);
112
+ });
113
+
114
+ it('sem roles na resposta devolve lista vazia', async () => {
115
+ mockRequest.mockResolvedValue({ data: { roles: [] } });
116
+ const { result } = renderHook(() => useCoreAccess(), {
117
+ wrapper: makeWrapper(),
118
+ });
119
+
120
+ await waitFor(() => expect(mockRequest).toHaveBeenCalled());
121
+ await waitFor(() => expect(result.current.isLoading).toBe(false));
122
+ expect(result.current.roleSlugs).toEqual([]);
123
+ expect(result.current.canManageUserPermissions).toBe(false);
124
+ });
125
+ });
@@ -0,0 +1,29 @@
1
+ import { useApp, useQuery } from '@hed-hog/next-app-provider';
2
+
3
+ type Role = { slug?: string };
4
+
5
+ export function useCoreAccess() {
6
+ const { request, accessToken } = useApp();
7
+
8
+ const { data, isLoading } = useQuery<{ roles: Role[] }>({
9
+ queryKey: ['core-roles', accessToken],
10
+ enabled: !!accessToken,
11
+ queryFn: async () => {
12
+ const response = await request<{ roles: Role[] }>({ url: '/auth/roles' });
13
+ return response.data;
14
+ },
15
+ });
16
+
17
+ const roleSlugs = (data?.roles ?? []).map((r) => r.slug || '').filter(Boolean);
18
+
19
+ return {
20
+ isLoading,
21
+ roleSlugs,
22
+ // Conceder/revogar papeis de outra conta e escalonamento de privilegio, entao
23
+ // exige o papel dedicado admin-user-permission. admin-user administra apenas
24
+ // o cadastro do usuario e é deliberadamente excluido daqui.
25
+ canManageUserPermissions:
26
+ roleSlugs.includes('admin') ||
27
+ roleSlugs.includes('admin-user-permission'),
28
+ };
29
+ }