@hed-hog/core 0.0.399 → 0.0.401

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 (815) hide show
  1. package/dist/ai/ai-agent.sort.d.ts +6 -0
  2. package/dist/ai/ai-agent.sort.d.ts.map +1 -0
  3. package/dist/ai/ai-agent.sort.js +21 -0
  4. package/dist/ai/ai-agent.sort.js.map +1 -0
  5. package/dist/ai/ai.controller.d.ts +6 -4
  6. package/dist/ai/ai.controller.d.ts.map +1 -1
  7. package/dist/ai/ai.service.d.ts +121 -6
  8. package/dist/ai/ai.service.d.ts.map +1 -1
  9. package/dist/ai/ai.service.js +355 -160
  10. package/dist/ai/ai.service.js.map +1 -1
  11. package/dist/ai-instruction/ai-instruction.service.d.ts.map +1 -1
  12. package/dist/ai-instruction/ai-instruction.service.js +26 -23
  13. package/dist/ai-instruction/ai-instruction.service.js.map +1 -1
  14. package/dist/ai-instruction/ai-instruction.sort.d.ts +16 -0
  15. package/dist/ai-instruction/ai-instruction.sort.d.ts.map +1 -0
  16. package/dist/ai-instruction/ai-instruction.sort.js +32 -0
  17. package/dist/ai-instruction/ai-instruction.sort.js.map +1 -0
  18. package/dist/ai-instruction/ai-prompt-resolver.service.d.ts +12 -0
  19. package/dist/ai-instruction/ai-prompt-resolver.service.d.ts.map +1 -1
  20. package/dist/ai-instruction/ai-prompt-resolver.service.js +26 -0
  21. package/dist/ai-instruction/ai-prompt-resolver.service.js.map +1 -1
  22. package/dist/auth/auth.controller.d.ts +24 -8
  23. package/dist/auth/auth.controller.d.ts.map +1 -1
  24. package/dist/auth/auth.module.d.ts.map +1 -1
  25. package/dist/auth/auth.module.js +8 -1
  26. package/dist/auth/auth.module.js.map +1 -1
  27. package/dist/auth/auth.service.d.ts +72 -25
  28. package/dist/auth/auth.service.d.ts.map +1 -1
  29. package/dist/auth/auth.service.js +41 -4
  30. package/dist/auth/auth.service.js.map +1 -1
  31. package/dist/auth/guards/auth.guard.d.ts +3 -1
  32. package/dist/auth/guards/auth.guard.d.ts.map +1 -1
  33. package/dist/auth/guards/auth.guard.js +12 -3
  34. package/dist/auth/guards/auth.guard.js.map +1 -1
  35. package/dist/authorize/authorize.controller.d.ts +29 -5
  36. package/dist/authorize/authorize.controller.d.ts.map +1 -1
  37. package/dist/authorize/authorize.controller.js +120 -13
  38. package/dist/authorize/authorize.controller.js.map +1 -1
  39. package/dist/authorize/authorize.errors.d.ts +34 -0
  40. package/dist/authorize/authorize.errors.d.ts.map +1 -0
  41. package/dist/authorize/authorize.errors.js +37 -0
  42. package/dist/authorize/authorize.errors.js.map +1 -0
  43. package/dist/authorize/authorize.module.d.ts.map +1 -1
  44. package/dist/authorize/authorize.module.js +6 -1
  45. package/dist/authorize/authorize.module.js.map +1 -1
  46. package/dist/authorize/authorize.service.d.ts +77 -3
  47. package/dist/authorize/authorize.service.d.ts.map +1 -1
  48. package/dist/authorize/authorize.service.js +212 -21
  49. package/dist/authorize/authorize.service.js.map +1 -1
  50. package/dist/authorize/dto/authorize-info.dto.d.ts +10 -1
  51. package/dist/authorize/dto/authorize-info.dto.d.ts.map +1 -1
  52. package/dist/authorize/dto/authorize-info.dto.js +16 -1
  53. package/dist/authorize/dto/authorize-info.dto.js.map +1 -1
  54. package/dist/authorize/dto/consent.dto.d.ts +10 -1
  55. package/dist/authorize/dto/consent.dto.d.ts.map +1 -1
  56. package/dist/authorize/dto/consent.dto.js +16 -1
  57. package/dist/authorize/dto/consent.dto.js.map +1 -1
  58. package/dist/authorize/dto/token.dto.d.ts +12 -0
  59. package/dist/authorize/dto/token.dto.d.ts.map +1 -1
  60. package/dist/authorize/dto/token.dto.js +21 -1
  61. package/dist/authorize/dto/token.dto.js.map +1 -1
  62. package/dist/authorize/oauth-exception.filter.d.ts +17 -0
  63. package/dist/authorize/oauth-exception.filter.d.ts.map +1 -0
  64. package/dist/authorize/oauth-exception.filter.js +54 -0
  65. package/dist/authorize/oauth-exception.filter.js.map +1 -0
  66. package/dist/authorize/oauth-metadata.service.d.ts +39 -0
  67. package/dist/authorize/oauth-metadata.service.d.ts.map +1 -0
  68. package/dist/authorize/oauth-metadata.service.js +81 -0
  69. package/dist/authorize/oauth-metadata.service.js.map +1 -0
  70. package/dist/authorize/well-known.controller.d.ts +67 -0
  71. package/dist/authorize/well-known.controller.d.ts.map +1 -0
  72. package/dist/authorize/well-known.controller.js +126 -0
  73. package/dist/authorize/well-known.controller.js.map +1 -0
  74. package/dist/captcha/captcha.service.d.ts +32 -2
  75. package/dist/captcha/captcha.service.d.ts.map +1 -1
  76. package/dist/captcha/captcha.service.js +85 -12
  77. package/dist/captcha/captcha.service.js.map +1 -1
  78. package/dist/challenge/challenge.service.d.ts +2 -2
  79. package/dist/core.module.d.ts.map +1 -1
  80. package/dist/core.module.js +9 -0
  81. package/dist/core.module.js.map +1 -1
  82. package/dist/dashboard/dashboard/dashboard.controller.d.ts +9 -9
  83. package/dist/dashboard/dashboard/dashboard.service.d.ts +9 -9
  84. package/dist/dashboard/dashboard-component/dashboard-component.controller.d.ts +3 -3
  85. package/dist/dashboard/dashboard-component/dashboard-component.service.d.ts +3 -3
  86. package/dist/dashboard/dashboard-component-role/dashboard-component-role.controller.d.ts +3 -3
  87. package/dist/dashboard/dashboard-component-role/dashboard-component-role.service.d.ts +3 -3
  88. package/dist/dashboard/dashboard-component-role/dashboard-component-role.service.d.ts.map +1 -1
  89. package/dist/dashboard/dashboard-component-role/dashboard-component-role.service.js +2 -4
  90. package/dist/dashboard/dashboard-component-role/dashboard-component-role.service.js.map +1 -1
  91. package/dist/dashboard/dashboard-component-role/dashboard-component-role.sort.d.ts +8 -0
  92. package/dist/dashboard/dashboard-component-role/dashboard-component-role.sort.d.ts.map +1 -0
  93. package/dist/dashboard/dashboard-component-role/dashboard-component-role.sort.js +18 -0
  94. package/dist/dashboard/dashboard-component-role/dashboard-component-role.sort.js.map +1 -0
  95. package/dist/dashboard/dashboard-item/dashboard-item.service.d.ts.map +1 -1
  96. package/dist/dashboard/dashboard-item/dashboard-item.service.js +2 -4
  97. package/dist/dashboard/dashboard-item/dashboard-item.service.js.map +1 -1
  98. package/dist/dashboard/dashboard-item/dashboard-item.sort.d.ts +9 -0
  99. package/dist/dashboard/dashboard-item/dashboard-item.sort.d.ts.map +1 -0
  100. package/dist/dashboard/dashboard-item/dashboard-item.sort.js +19 -0
  101. package/dist/dashboard/dashboard-item/dashboard-item.sort.js.map +1 -0
  102. package/dist/dashboard/dashboard-role/dashboard-role.controller.d.ts +3 -3
  103. package/dist/dashboard/dashboard-role/dashboard-role.service.d.ts +3 -3
  104. package/dist/dashboard/dashboard-role/dashboard-role.service.d.ts.map +1 -1
  105. package/dist/dashboard/dashboard-role/dashboard-role.service.js +2 -4
  106. package/dist/dashboard/dashboard-role/dashboard-role.service.js.map +1 -1
  107. package/dist/dashboard/dashboard-role/dashboard-role.sort.d.ts +8 -0
  108. package/dist/dashboard/dashboard-role/dashboard-role.sort.d.ts.map +1 -0
  109. package/dist/dashboard/dashboard-role/dashboard-role.sort.js +16 -0
  110. package/dist/dashboard/dashboard-role/dashboard-role.sort.js.map +1 -0
  111. package/dist/document-kit/document-kit.module.d.ts +3 -0
  112. package/dist/document-kit/document-kit.module.d.ts.map +1 -0
  113. package/dist/document-kit/document-kit.module.js +24 -0
  114. package/dist/document-kit/document-kit.module.js.map +1 -0
  115. package/dist/document-kit/document-kit.registry.d.ts +55 -0
  116. package/dist/document-kit/document-kit.registry.d.ts.map +1 -0
  117. package/dist/document-kit/document-kit.registry.js +91 -0
  118. package/dist/document-kit/document-kit.registry.js.map +1 -0
  119. package/dist/document-kit/document-kit.service.d.ts +49 -0
  120. package/dist/document-kit/document-kit.service.d.ts.map +1 -0
  121. package/dist/document-kit/document-kit.service.js +135 -0
  122. package/dist/document-kit/document-kit.service.js.map +1 -0
  123. package/dist/file/file-upload-ticket.service.d.ts +160 -0
  124. package/dist/file/file-upload-ticket.service.d.ts.map +1 -0
  125. package/dist/file/file-upload-ticket.service.js +382 -0
  126. package/dist/file/file-upload-ticket.service.js.map +1 -0
  127. package/dist/file/file.controller.d.ts +24 -1
  128. package/dist/file/file.controller.d.ts.map +1 -1
  129. package/dist/file/file.controller.js +63 -2
  130. package/dist/file/file.controller.js.map +1 -1
  131. package/dist/file/file.module.d.ts.map +1 -1
  132. package/dist/file/file.module.js +14 -2
  133. package/dist/file/file.module.js.map +1 -1
  134. package/dist/file/file.service.d.ts +197 -7
  135. package/dist/file/file.service.d.ts.map +1 -1
  136. package/dist/file/file.service.js +438 -78
  137. package/dist/file/file.service.js.map +1 -1
  138. package/dist/file/filename-encoding.util.d.ts +24 -0
  139. package/dist/file/filename-encoding.util.d.ts.map +1 -0
  140. package/dist/file/filename-encoding.util.js +63 -0
  141. package/dist/file/filename-encoding.util.js.map +1 -0
  142. package/dist/file/image-optimization.service.d.ts +27 -0
  143. package/dist/file/image-optimization.service.d.ts.map +1 -1
  144. package/dist/file/image-optimization.service.js +63 -14
  145. package/dist/file/image-optimization.service.js.map +1 -1
  146. package/dist/file/mcp-file-source.schema.d.ts +33 -0
  147. package/dist/file/mcp-file-source.schema.d.ts.map +1 -0
  148. package/dist/file/mcp-file-source.schema.js +78 -0
  149. package/dist/file/mcp-file-source.schema.js.map +1 -0
  150. package/dist/file/mcp-file-source.service.d.ts +124 -0
  151. package/dist/file/mcp-file-source.service.d.ts.map +1 -0
  152. package/dist/file/mcp-file-source.service.js +262 -0
  153. package/dist/file/mcp-file-source.service.js.map +1 -0
  154. package/dist/file/mimetype-sniff.util.d.ts +62 -0
  155. package/dist/file/mimetype-sniff.util.d.ts.map +1 -0
  156. package/dist/file/mimetype-sniff.util.js +226 -0
  157. package/dist/file/mimetype-sniff.util.js.map +1 -0
  158. package/dist/file/remote-fetch.util.d.ts +35 -0
  159. package/dist/file/remote-fetch.util.d.ts.map +1 -0
  160. package/dist/file/remote-fetch.util.js +236 -0
  161. package/dist/file/remote-fetch.util.js.map +1 -0
  162. package/dist/impersonation/dto/start-impersonation.dto.d.ts +4 -1
  163. package/dist/impersonation/dto/start-impersonation.dto.d.ts.map +1 -1
  164. package/dist/impersonation/dto/start-impersonation.dto.js +1 -1
  165. package/dist/impersonation/dto/start-impersonation.dto.js.map +1 -1
  166. package/dist/impersonation/impersonation.service.d.ts +8 -3
  167. package/dist/impersonation/impersonation.service.d.ts.map +1 -1
  168. package/dist/impersonation/impersonation.service.js +14 -4
  169. package/dist/impersonation/impersonation.service.js.map +1 -1
  170. package/dist/incident/incident.controller.d.ts +2 -1
  171. package/dist/incident/incident.controller.d.ts.map +1 -1
  172. package/dist/incident/incident.controller.js +10 -6
  173. package/dist/incident/incident.controller.js.map +1 -1
  174. package/dist/incident/incident.service.d.ts +2 -0
  175. package/dist/incident/incident.service.d.ts.map +1 -1
  176. package/dist/incident/incident.service.js +4 -0
  177. package/dist/incident/incident.service.js.map +1 -1
  178. package/dist/index.d.ts +22 -0
  179. package/dist/index.d.ts.map +1 -1
  180. package/dist/index.js +22 -0
  181. package/dist/index.js.map +1 -1
  182. package/dist/integration-profile/integration-profile.secrets.d.ts.map +1 -1
  183. package/dist/integration-profile/integration-profile.secrets.js +28 -0
  184. package/dist/integration-profile/integration-profile.secrets.js.map +1 -1
  185. package/dist/integration-profile/integration-profile.service.d.ts +0 -13
  186. package/dist/integration-profile/integration-profile.service.d.ts.map +1 -1
  187. package/dist/integration-profile/integration-profile.service.js +5 -40
  188. package/dist/integration-profile/integration-profile.service.js.map +1 -1
  189. package/dist/integration-profile/integration-profile.utils.js +5 -5
  190. package/dist/integration-profile/integration-profile.utils.js.map +1 -1
  191. package/dist/integration-profile/testers/ai.testers.d.ts.map +1 -1
  192. package/dist/integration-profile/testers/ai.testers.js +46 -8
  193. package/dist/integration-profile/testers/ai.testers.js.map +1 -1
  194. package/dist/integration-profile/testers/index.d.ts.map +1 -1
  195. package/dist/integration-profile/testers/index.js +2 -0
  196. package/dist/integration-profile/testers/index.js.map +1 -1
  197. package/dist/integration-profile/testers/shipping.testers.d.ts +3 -0
  198. package/dist/integration-profile/testers/shipping.testers.d.ts.map +1 -0
  199. package/dist/integration-profile/testers/shipping.testers.js +71 -0
  200. package/dist/integration-profile/testers/shipping.testers.js.map +1 -0
  201. package/dist/locale/locale.controller.d.ts +1 -1
  202. package/dist/locale/locale.service.d.ts +1 -1
  203. package/dist/mail/dto/send.dto.d.ts +6 -1
  204. package/dist/mail/dto/send.dto.d.ts.map +1 -1
  205. package/dist/mail/dto/send.dto.js.map +1 -1
  206. package/dist/mail/mail.service.d.ts +9 -0
  207. package/dist/mail/mail.service.d.ts.map +1 -1
  208. package/dist/mail/mail.service.js +34 -14
  209. package/dist/mail/mail.service.js.map +1 -1
  210. package/dist/mail-sent/mail-sent.controller.d.ts +1 -1
  211. package/dist/mail-sent/mail-sent.service.d.ts +1 -1
  212. package/dist/mail-sent/mail-sent.service.d.ts.map +1 -1
  213. package/dist/mail-sent/mail-sent.service.js +2 -1
  214. package/dist/mail-sent/mail-sent.service.js.map +1 -1
  215. package/dist/mail-sent/mail-sent.sort.d.ts +9 -0
  216. package/dist/mail-sent/mail-sent.sort.d.ts.map +1 -0
  217. package/dist/mail-sent/mail-sent.sort.js +19 -0
  218. package/dist/mail-sent/mail-sent.sort.js.map +1 -0
  219. package/dist/mcp/filters/mcp-challenge.filter.d.ts +20 -0
  220. package/dist/mcp/filters/mcp-challenge.filter.d.ts.map +1 -0
  221. package/dist/mcp/filters/mcp-challenge.filter.js +69 -0
  222. package/dist/mcp/filters/mcp-challenge.filter.js.map +1 -0
  223. package/dist/mcp/guards/mcp-auth.guard.d.ts +4 -1
  224. package/dist/mcp/guards/mcp-auth.guard.d.ts.map +1 -1
  225. package/dist/mcp/guards/mcp-auth.guard.js +19 -5
  226. package/dist/mcp/guards/mcp-auth.guard.js.map +1 -1
  227. package/dist/mcp/guards/mcp-permission.guard.d.ts +25 -3
  228. package/dist/mcp/guards/mcp-permission.guard.d.ts.map +1 -1
  229. package/dist/mcp/guards/mcp-permission.guard.js +46 -26
  230. package/dist/mcp/guards/mcp-permission.guard.js.map +1 -1
  231. package/dist/mcp/mcp-audit.service.d.ts +17 -0
  232. package/dist/mcp/mcp-audit.service.d.ts.map +1 -1
  233. package/dist/mcp/mcp-audit.service.js +32 -3
  234. package/dist/mcp/mcp-audit.service.js.map +1 -1
  235. package/dist/mcp/mcp-permission.service.d.ts +64 -0
  236. package/dist/mcp/mcp-permission.service.d.ts.map +1 -0
  237. package/dist/mcp/mcp-permission.service.js +178 -0
  238. package/dist/mcp/mcp-permission.service.js.map +1 -0
  239. package/dist/mcp/mcp-server.service.d.ts +3 -1
  240. package/dist/mcp/mcp-server.service.d.ts.map +1 -1
  241. package/dist/mcp/mcp-server.service.js +36 -15
  242. package/dist/mcp/mcp-server.service.js.map +1 -1
  243. package/dist/mcp/mcp.controller.d.ts.map +1 -1
  244. package/dist/mcp/mcp.controller.js +10 -2
  245. package/dist/mcp/mcp.controller.js.map +1 -1
  246. package/dist/mcp/mcp.module.d.ts.map +1 -1
  247. package/dist/mcp/mcp.module.js +7 -1
  248. package/dist/mcp/mcp.module.js.map +1 -1
  249. package/dist/mcp/tools/core-access-log.mcp-tools.d.ts +17 -0
  250. package/dist/mcp/tools/core-access-log.mcp-tools.d.ts.map +1 -0
  251. package/dist/mcp/tools/core-access-log.mcp-tools.js +74 -0
  252. package/dist/mcp/tools/core-access-log.mcp-tools.js.map +1 -0
  253. package/dist/mcp/tools/core-ai.mcp-tools.js +2 -9
  254. package/dist/mcp/tools/core-ai.mcp-tools.js.map +1 -1
  255. package/dist/mcp/tools/core-dashboard-items.mcp-tools.js +1 -1
  256. package/dist/mcp/tools/core-dashboard-items.mcp-tools.js.map +1 -1
  257. package/dist/mcp/tools/core-dashboard.mcp-tools.js +2 -9
  258. package/dist/mcp/tools/core-dashboard.mcp-tools.js.map +1 -1
  259. package/dist/mcp/tools/core-event-webhooks.mcp-tools.d.ts.map +1 -1
  260. package/dist/mcp/tools/core-event-webhooks.mcp-tools.js +2 -10
  261. package/dist/mcp/tools/core-event-webhooks.mcp-tools.js.map +1 -1
  262. package/dist/mcp/tools/core-files.mcp-tools.d.ts +17 -5
  263. package/dist/mcp/tools/core-files.mcp-tools.d.ts.map +1 -1
  264. package/dist/mcp/tools/core-files.mcp-tools.js +186 -24
  265. package/dist/mcp/tools/core-files.mcp-tools.js.map +1 -1
  266. package/dist/mcp/tools/core-integration-events.mcp-tools.js +2 -9
  267. package/dist/mcp/tools/core-integration-events.mcp-tools.js.map +1 -1
  268. package/dist/mcp/tools/core-mail-sent.mcp-tools.js +2 -14
  269. package/dist/mcp/tools/core-mail-sent.mcp-tools.js.map +1 -1
  270. package/dist/mcp/tools/core-mail.mcp-tools.js +2 -9
  271. package/dist/mcp/tools/core-mail.mcp-tools.js.map +1 -1
  272. package/dist/mcp/tools/core-menus.mcp-tools.d.ts.map +1 -1
  273. package/dist/mcp/tools/core-menus.mcp-tools.js +2 -10
  274. package/dist/mcp/tools/core-menus.mcp-tools.js.map +1 -1
  275. package/dist/mcp/tools/core-notifications.mcp-tools.d.ts.map +1 -1
  276. package/dist/mcp/tools/core-notifications.mcp-tools.js +0 -1
  277. package/dist/mcp/tools/core-notifications.mcp-tools.js.map +1 -1
  278. package/dist/mcp/tools/core-roles.mcp-tools.d.ts.map +1 -1
  279. package/dist/mcp/tools/core-roles.mcp-tools.js +2 -13
  280. package/dist/mcp/tools/core-roles.mcp-tools.js.map +1 -1
  281. package/dist/mcp/tools/core-routes.mcp-tools.d.ts.map +1 -1
  282. package/dist/mcp/tools/core-routes.mcp-tools.js +2 -11
  283. package/dist/mcp/tools/core-routes.mcp-tools.js.map +1 -1
  284. package/dist/mcp/tools/core-screens.mcp-tools.d.ts.map +1 -1
  285. package/dist/mcp/tools/core-screens.mcp-tools.js +2 -11
  286. package/dist/mcp/tools/core-screens.mcp-tools.js.map +1 -1
  287. package/dist/mcp/tools/core-sessions.mcp-tools.d.ts.map +1 -1
  288. package/dist/mcp/tools/core-sessions.mcp-tools.js +0 -2
  289. package/dist/mcp/tools/core-sessions.mcp-tools.js.map +1 -1
  290. package/dist/mcp/tools/core-settings.mcp-tools.d.ts.map +1 -1
  291. package/dist/mcp/tools/core-settings.mcp-tools.js +2 -10
  292. package/dist/mcp/tools/core-settings.mcp-tools.js.map +1 -1
  293. package/dist/mcp/tools/core-users.mcp-tools.js +2 -9
  294. package/dist/mcp/tools/core-users.mcp-tools.js.map +1 -1
  295. package/dist/mcp/tools/core-webhooks.mcp-tools.d.ts.map +1 -1
  296. package/dist/mcp/tools/core-webhooks.mcp-tools.js +2 -10
  297. package/dist/mcp/tools/core-webhooks.mcp-tools.js.map +1 -1
  298. package/dist/mcp/types/mcp-context.type.d.ts +9 -0
  299. package/dist/mcp/types/mcp-context.type.d.ts.map +1 -1
  300. package/dist/mcp-chat/mcp-chat.service.d.ts.map +1 -1
  301. package/dist/mcp-chat/mcp-chat.service.js +8 -0
  302. package/dist/mcp-chat/mcp-chat.service.js.map +1 -1
  303. package/dist/meeting/meeting-provider.registry.d.ts +187 -0
  304. package/dist/meeting/meeting-provider.registry.d.ts.map +1 -1
  305. package/dist/meeting/meeting-provider.registry.js.map +1 -1
  306. package/dist/meeting/meeting.constants.d.ts +70 -0
  307. package/dist/meeting/meeting.constants.d.ts.map +1 -1
  308. package/dist/meeting/meeting.constants.js +9 -1
  309. package/dist/meeting/meeting.constants.js.map +1 -1
  310. package/dist/menu/menu.service.d.ts.map +1 -1
  311. package/dist/menu/menu.service.js +29 -9
  312. package/dist/menu/menu.service.js.map +1 -1
  313. package/dist/message-template/dto/update-message-template.dto.d.ts +18 -0
  314. package/dist/message-template/dto/update-message-template.dto.d.ts.map +1 -0
  315. package/dist/message-template/dto/update-message-template.dto.js +38 -0
  316. package/dist/message-template/dto/update-message-template.dto.js.map +1 -0
  317. package/dist/message-template/message-template-admin.service.d.ts +70 -0
  318. package/dist/message-template/message-template-admin.service.d.ts.map +1 -0
  319. package/dist/message-template/message-template-admin.service.js +226 -0
  320. package/dist/message-template/message-template-admin.service.js.map +1 -0
  321. package/dist/message-template/message-template.controller.d.ts +29 -0
  322. package/dist/message-template/message-template.controller.d.ts.map +1 -0
  323. package/dist/message-template/message-template.controller.js +101 -0
  324. package/dist/message-template/message-template.controller.js.map +1 -0
  325. package/dist/message-template/message-template.module.d.ts +10 -0
  326. package/dist/message-template/message-template.module.d.ts.map +1 -0
  327. package/dist/message-template/message-template.module.js +33 -0
  328. package/dist/message-template/message-template.module.js.map +1 -0
  329. package/dist/message-template/message-template.registry.d.ts +55 -0
  330. package/dist/message-template/message-template.registry.d.ts.map +1 -0
  331. package/dist/message-template/message-template.registry.js +64 -0
  332. package/dist/message-template/message-template.registry.js.map +1 -0
  333. package/dist/message-template/message-template.service.d.ts +59 -0
  334. package/dist/message-template/message-template.service.d.ts.map +1 -0
  335. package/dist/message-template/message-template.service.js +166 -0
  336. package/dist/message-template/message-template.service.js.map +1 -0
  337. package/dist/notification/notification.constants.d.ts +11 -0
  338. package/dist/notification/notification.constants.d.ts.map +1 -0
  339. package/dist/notification/notification.constants.js +14 -0
  340. package/dist/notification/notification.constants.js.map +1 -0
  341. package/dist/notification/notification.controller.d.ts +20 -20
  342. package/dist/notification/notification.module.d.ts.map +1 -1
  343. package/dist/notification/notification.module.js +3 -0
  344. package/dist/notification/notification.module.js.map +1 -1
  345. package/dist/notification/notification.service.d.ts +33 -21
  346. package/dist/notification/notification.service.d.ts.map +1 -1
  347. package/dist/notification/notification.service.js +36 -2
  348. package/dist/notification/notification.service.js.map +1 -1
  349. package/dist/oauth/oauth-token-broker.service.d.ts +50 -1
  350. package/dist/oauth/oauth-token-broker.service.d.ts.map +1 -1
  351. package/dist/oauth/oauth-token-broker.service.js +105 -3
  352. package/dist/oauth/oauth-token-broker.service.js.map +1 -1
  353. package/dist/oauth/oauth.controller.d.ts +4 -6
  354. package/dist/oauth/oauth.controller.d.ts.map +1 -1
  355. package/dist/oauth/oauth.controller.js +0 -1
  356. package/dist/oauth/oauth.controller.js.map +1 -1
  357. package/dist/oauth/oauth.errors.d.ts +15 -1
  358. package/dist/oauth/oauth.errors.d.ts.map +1 -1
  359. package/dist/oauth/oauth.errors.js +9 -1
  360. package/dist/oauth/oauth.errors.js.map +1 -1
  361. package/dist/oauth/oauth.module.d.ts.map +1 -1
  362. package/dist/oauth/oauth.module.js +6 -1
  363. package/dist/oauth/oauth.module.js.map +1 -1
  364. package/dist/oauth/oauth.service.d.ts +25 -5
  365. package/dist/oauth/oauth.service.d.ts.map +1 -1
  366. package/dist/oauth/oauth.service.js +63 -27
  367. package/dist/oauth/oauth.service.js.map +1 -1
  368. package/dist/oauth/providers/abstract.provider.d.ts +10 -0
  369. package/dist/oauth/providers/abstract.provider.d.ts.map +1 -1
  370. package/dist/oauth/providers/abstract.provider.js +39 -12
  371. package/dist/oauth/providers/abstract.provider.js.map +1 -1
  372. package/dist/oauth/providers/github.provider.d.ts +1 -1
  373. package/dist/oauth/providers/github.provider.d.ts.map +1 -1
  374. package/dist/oauth/providers/github.provider.js +48 -22
  375. package/dist/oauth/providers/github.provider.js.map +1 -1
  376. package/dist/oauth/providers/microsoft-entra-id.provider.d.ts +6 -0
  377. package/dist/oauth/providers/microsoft-entra-id.provider.d.ts.map +1 -1
  378. package/dist/oauth/providers/microsoft-entra-id.provider.js +36 -4
  379. package/dist/oauth/providers/microsoft-entra-id.provider.js.map +1 -1
  380. package/dist/observability/monitored-cron.d.ts +29 -12
  381. package/dist/observability/monitored-cron.d.ts.map +1 -1
  382. package/dist/observability/monitored-cron.js +131 -46
  383. package/dist/observability/monitored-cron.js.map +1 -1
  384. package/dist/pairing/pairing.service.d.ts +6 -2
  385. package/dist/pairing/pairing.service.d.ts.map +1 -1
  386. package/dist/pdf/document/charts/chart-bar.d.ts +24 -0
  387. package/dist/pdf/document/charts/chart-bar.d.ts.map +1 -0
  388. package/dist/pdf/document/charts/chart-bar.js +117 -0
  389. package/dist/pdf/document/charts/chart-bar.js.map +1 -0
  390. package/dist/pdf/document/charts/chart-donut.d.ts +16 -0
  391. package/dist/pdf/document/charts/chart-donut.d.ts.map +1 -0
  392. package/dist/pdf/document/charts/chart-donut.js +89 -0
  393. package/dist/pdf/document/charts/chart-donut.js.map +1 -0
  394. package/dist/pdf/document/charts/chart-gauge.d.ts +15 -0
  395. package/dist/pdf/document/charts/chart-gauge.d.ts.map +1 -0
  396. package/dist/pdf/document/charts/chart-gauge.js +60 -0
  397. package/dist/pdf/document/charts/chart-gauge.js.map +1 -0
  398. package/dist/pdf/document/charts/chart-line.d.ts +29 -0
  399. package/dist/pdf/document/charts/chart-line.d.ts.map +1 -0
  400. package/dist/pdf/document/charts/chart-line.js +89 -0
  401. package/dist/pdf/document/charts/chart-line.js.map +1 -0
  402. package/dist/pdf/document/charts/chart-primitives.d.ts +64 -0
  403. package/dist/pdf/document/charts/chart-primitives.d.ts.map +1 -0
  404. package/dist/pdf/document/charts/chart-primitives.js +110 -0
  405. package/dist/pdf/document/charts/chart-primitives.js.map +1 -0
  406. package/dist/pdf/document/charts/chart-radar.d.ts +13 -0
  407. package/dist/pdf/document/charts/chart-radar.d.ts.map +1 -0
  408. package/dist/pdf/document/charts/chart-radar.js +83 -0
  409. package/dist/pdf/document/charts/chart-radar.js.map +1 -0
  410. package/dist/pdf/document/charts/chart-scale.d.ts +39 -0
  411. package/dist/pdf/document/charts/chart-scale.d.ts.map +1 -0
  412. package/dist/pdf/document/charts/chart-scale.js +118 -0
  413. package/dist/pdf/document/charts/chart-scale.js.map +1 -0
  414. package/dist/pdf/document/charts/index.d.ts +8 -0
  415. package/dist/pdf/document/charts/index.d.ts.map +1 -0
  416. package/dist/pdf/document/charts/index.js +24 -0
  417. package/dist/pdf/document/charts/index.js.map +1 -0
  418. package/dist/pdf/document/index.d.ts +8 -0
  419. package/dist/pdf/document/index.d.ts.map +1 -0
  420. package/dist/pdf/document/index.js +24 -0
  421. package/dist/pdf/document/index.js.map +1 -0
  422. package/dist/pdf/document/pdf-document.chrome.d.ts +20 -0
  423. package/dist/pdf/document/pdf-document.chrome.d.ts.map +1 -0
  424. package/dist/pdf/document/pdf-document.chrome.js +36 -0
  425. package/dist/pdf/document/pdf-document.chrome.js.map +1 -0
  426. package/dist/pdf/document/pdf-document.css.d.ts +20 -0
  427. package/dist/pdf/document/pdf-document.css.d.ts.map +1 -0
  428. package/dist/pdf/document/pdf-document.css.js +239 -0
  429. package/dist/pdf/document/pdf-document.css.js.map +1 -0
  430. package/dist/pdf/document/pdf-document.renderer.d.ts +10 -0
  431. package/dist/pdf/document/pdf-document.renderer.d.ts.map +1 -0
  432. package/dist/pdf/document/pdf-document.renderer.js +153 -0
  433. package/dist/pdf/document/pdf-document.renderer.js.map +1 -0
  434. package/dist/pdf/document/pdf-document.service.d.ts +27 -0
  435. package/dist/pdf/document/pdf-document.service.d.ts.map +1 -0
  436. package/dist/pdf/document/pdf-document.service.js +81 -0
  437. package/dist/pdf/document/pdf-document.service.js.map +1 -0
  438. package/dist/pdf/document/pdf-document.theme.d.ts +41 -0
  439. package/dist/pdf/document/pdf-document.theme.d.ts.map +1 -0
  440. package/dist/pdf/document/pdf-document.theme.js +105 -0
  441. package/dist/pdf/document/pdf-document.theme.js.map +1 -0
  442. package/dist/pdf/document/pdf-document.types.d.ts +108 -0
  443. package/dist/pdf/document/pdf-document.types.d.ts.map +1 -0
  444. package/dist/pdf/document/pdf-document.types.js +18 -0
  445. package/dist/pdf/document/pdf-document.types.js.map +1 -0
  446. package/dist/pdf/pdf.module.d.ts.map +1 -1
  447. package/dist/pdf/pdf.module.js +3 -2
  448. package/dist/pdf/pdf.module.js.map +1 -1
  449. package/dist/pdf/pdf.service.d.ts +69 -1
  450. package/dist/pdf/pdf.service.d.ts.map +1 -1
  451. package/dist/pdf/pdf.service.js +164 -63
  452. package/dist/pdf/pdf.service.js.map +1 -1
  453. package/dist/pdf/templates/commercial-proposal.template.d.ts +96 -0
  454. package/dist/pdf/templates/commercial-proposal.template.d.ts.map +1 -0
  455. package/dist/pdf/templates/commercial-proposal.template.js +276 -0
  456. package/dist/pdf/templates/commercial-proposal.template.js.map +1 -0
  457. package/dist/profile/dto/change-password.dto.d.ts.map +1 -1
  458. package/dist/profile/dto/change-password.dto.js +4 -6
  459. package/dist/profile/dto/change-password.dto.js.map +1 -1
  460. package/dist/profile/profile.controller.d.ts +1 -1
  461. package/dist/profile/profile.service.d.ts +1 -1
  462. package/dist/profile/profile.service.d.ts.map +1 -1
  463. package/dist/profile/profile.service.js +9 -3
  464. package/dist/profile/profile.service.js.map +1 -1
  465. package/dist/realtime/realtime-tick.coalescer.d.ts +34 -0
  466. package/dist/realtime/realtime-tick.coalescer.d.ts.map +1 -0
  467. package/dist/realtime/realtime-tick.coalescer.js +60 -0
  468. package/dist/realtime/realtime-tick.coalescer.js.map +1 -0
  469. package/dist/realtime/realtime.service.d.ts +2 -0
  470. package/dist/realtime/realtime.service.d.ts.map +1 -1
  471. package/dist/realtime/realtime.service.js +22 -2
  472. package/dist/realtime/realtime.service.js.map +1 -1
  473. package/dist/redis/redis-kv.service.d.ts +90 -0
  474. package/dist/redis/redis-kv.service.d.ts.map +1 -0
  475. package/dist/redis/redis-kv.service.js +247 -0
  476. package/dist/redis/redis-kv.service.js.map +1 -0
  477. package/dist/redis/redis-master.d.ts +29 -0
  478. package/dist/redis/redis-master.d.ts.map +1 -0
  479. package/dist/redis/redis-master.js +81 -0
  480. package/dist/redis/redis-master.js.map +1 -0
  481. package/dist/redis/redis-pubsub.d.ts +12 -0
  482. package/dist/redis/redis-pubsub.d.ts.map +1 -1
  483. package/dist/redis/redis-pubsub.js +25 -2
  484. package/dist/redis/redis-pubsub.js.map +1 -1
  485. package/dist/redis/redis.module.d.ts +11 -0
  486. package/dist/redis/redis.module.d.ts.map +1 -0
  487. package/dist/redis/redis.module.js +30 -0
  488. package/dist/redis/redis.module.js.map +1 -0
  489. package/dist/session/session.controller.d.ts +6 -2
  490. package/dist/session/session.controller.d.ts.map +1 -1
  491. package/dist/session/session.service.d.ts +118 -15
  492. package/dist/session/session.service.d.ts.map +1 -1
  493. package/dist/session/session.service.js +251 -77
  494. package/dist/session/session.service.js.map +1 -1
  495. package/dist/setting/favicon.controller.d.ts +26 -0
  496. package/dist/setting/favicon.controller.d.ts.map +1 -0
  497. package/dist/setting/favicon.controller.js +130 -0
  498. package/dist/setting/favicon.controller.js.map +1 -0
  499. package/dist/setting/setting.controller.d.ts +5 -0
  500. package/dist/setting/setting.controller.d.ts.map +1 -1
  501. package/dist/setting/setting.module.d.ts.map +1 -1
  502. package/dist/setting/setting.module.js +2 -1
  503. package/dist/setting/setting.module.js.map +1 -1
  504. package/dist/setting/setting.service.d.ts +7 -0
  505. package/dist/setting/setting.service.d.ts.map +1 -1
  506. package/dist/setting/setting.service.js +38 -3
  507. package/dist/setting/setting.service.js.map +1 -1
  508. package/dist/task/task.service.d.ts +17 -0
  509. package/dist/task/task.service.d.ts.map +1 -1
  510. package/dist/task/task.service.js +48 -13
  511. package/dist/task/task.service.js.map +1 -1
  512. package/dist/token/token.service.d.ts +19 -1
  513. package/dist/token/token.service.d.ts.map +1 -1
  514. package/dist/token/token.service.js +39 -2
  515. package/dist/token/token.service.js.map +1 -1
  516. package/dist/user/user-credential.util.d.ts +10 -0
  517. package/dist/user/user-credential.util.d.ts.map +1 -1
  518. package/dist/user/user-credential.util.js +14 -1
  519. package/dist/user/user-credential.util.js.map +1 -1
  520. package/dist/user/user.service.d.ts +12 -4
  521. package/dist/user/user.service.d.ts.map +1 -1
  522. package/dist/user/user.service.js +2 -11
  523. package/dist/user/user.service.js.map +1 -1
  524. package/dist/user/user.sort.d.ts +16 -0
  525. package/dist/user/user.sort.d.ts.map +1 -0
  526. package/dist/user/user.sort.js +25 -0
  527. package/dist/user/user.sort.js.map +1 -0
  528. package/dist/utils/abbreviate-name.d.ts +13 -0
  529. package/dist/utils/abbreviate-name.d.ts.map +1 -0
  530. package/dist/utils/abbreviate-name.js +42 -0
  531. package/dist/utils/abbreviate-name.js.map +1 -0
  532. package/dist/utils/date-range-query.dto.d.ts +11 -0
  533. package/dist/utils/date-range-query.dto.d.ts.map +1 -0
  534. package/dist/utils/date-range-query.dto.js +63 -0
  535. package/dist/utils/date-range-query.dto.js.map +1 -0
  536. package/dist/utils/date-range.d.ts +96 -0
  537. package/dist/utils/date-range.d.ts.map +1 -0
  538. package/dist/utils/date-range.js +172 -0
  539. package/dist/utils/date-range.js.map +1 -0
  540. package/dist/webhook-integration/webhook-utils.d.ts.map +1 -1
  541. package/dist/webhook-integration/webhook-utils.js +24 -0
  542. package/dist/webhook-integration/webhook-utils.js.map +1 -1
  543. package/dist/whatsapp-sender/whatsapp-recipients.d.ts +49 -0
  544. package/dist/whatsapp-sender/whatsapp-recipients.d.ts.map +1 -0
  545. package/dist/whatsapp-sender/whatsapp-recipients.js +66 -0
  546. package/dist/whatsapp-sender/whatsapp-recipients.js.map +1 -0
  547. package/dist/whatsapp-sender/whatsapp-sender.service.d.ts +25 -0
  548. package/dist/whatsapp-sender/whatsapp-sender.service.d.ts.map +1 -1
  549. package/dist/whatsapp-sender/whatsapp-sender.service.js +71 -7
  550. package/dist/whatsapp-sender/whatsapp-sender.service.js.map +1 -1
  551. package/hedhog/data/integration_provider.yaml +9 -0
  552. package/hedhog/data/integration_type.yaml +12 -0
  553. package/hedhog/data/locale.yaml +0 -1
  554. package/hedhog/data/mail.yaml +2 -2
  555. package/hedhog/data/mail_layout.yaml +6 -3
  556. package/hedhog/data/menu.yaml +25 -5
  557. package/hedhog/data/route.yaml +148 -0
  558. package/hedhog/data/setting_group.yaml +189 -3
  559. package/hedhog/frontend/app/access-log/page.tsx.ejs +47 -53
  560. package/hedhog/frontend/app/account/components/active-sessions.tsx.ejs +33 -8
  561. package/hedhog/frontend/app/account/components/mcp-tokens.tsx.ejs +54 -13
  562. package/hedhog/frontend/app/account/components/mfa-method-card.tsx.ejs +7 -1
  563. package/hedhog/frontend/app/account/components/recovery-codes-dialog.tsx.ejs +1 -0
  564. package/hedhog/frontend/app/account/components/tokens.tsx.ejs +47 -17
  565. package/hedhog/frontend/app/ai_agent/page.tsx.ejs +46 -5
  566. package/hedhog/frontend/app/ai_instruction/_components/ai-instruction-form.tsx.ejs +101 -30
  567. package/hedhog/frontend/app/ai_instruction/_components/ai-instruction-versions.tsx.ejs +24 -8
  568. package/hedhog/frontend/app/ai_instruction/page.tsx.ejs +80 -15
  569. package/hedhog/frontend/app/configurations/[slug]/components/image-optimization-action.tsx.ejs +166 -0
  570. package/hedhog/frontend/app/configurations/[slug]/components/setting-field.test.tsx.ejs +145 -45
  571. package/hedhog/frontend/app/configurations/[slug]/components/setting-field.tsx.ejs +99 -219
  572. package/hedhog/frontend/app/configurations/[slug]/page.tsx.ejs +19 -1
  573. package/hedhog/frontend/app/configurations/layout.tsx.ejs +19 -5
  574. package/hedhog/frontend/app/dashboard/[slug]/widget-renderer.tsx.ejs +2 -8
  575. package/hedhog/frontend/app/dashboard/components/dynamic-widget.tsx.ejs +3 -0
  576. package/hedhog/frontend/app/dashboard/components/widget-wrapper.tsx.ejs +4 -0
  577. package/hedhog/frontend/app/dashboard/dashboard-home-tabs.tsx.ejs +43 -44
  578. package/hedhog/frontend/app/dashboard/management/tabs/component-roles-tab.tsx.ejs +41 -3
  579. package/hedhog/frontend/app/dashboard/management/tabs/components-tab.tsx.ejs +42 -2
  580. package/hedhog/frontend/app/dashboard/management/tabs/dashboard-roles-tab.tsx.ejs +41 -3
  581. package/hedhog/frontend/app/dashboard/management/tabs/dashboards-tab.tsx.ejs +39 -4
  582. package/hedhog/frontend/app/dashboard/management/tabs/items-tab.tsx.ejs +42 -3
  583. package/hedhog/frontend/app/incidents/page.tsx.ejs +60 -31
  584. package/hedhog/frontend/app/integration/profiles/page.tsx.ejs +45 -5
  585. package/hedhog/frontend/app/integrations-webhooks/page.tsx.ejs +92 -15
  586. package/hedhog/frontend/app/mail/log/page.tsx.ejs +109 -61
  587. package/hedhog/frontend/app/mail/template/page.tsx.ejs +125 -23
  588. package/hedhog/frontend/app/mcp_chat/chat-components.tsx.ejs +13 -15
  589. package/hedhog/frontend/app/mcp_chat/page.tsx.ejs +116 -110
  590. package/hedhog/frontend/app/message-templates/_components/message-template-sheet.tsx.ejs +245 -0
  591. package/hedhog/frontend/app/message-templates/_lib/types.ts.ejs +24 -0
  592. package/hedhog/frontend/app/message-templates/page.tsx.ejs +182 -0
  593. package/hedhog/frontend/app/pages/_components/page-wizard-sheet.tsx.ejs +1 -0
  594. package/hedhog/frontend/app/pages/page.tsx.ejs +94 -9
  595. package/hedhog/frontend/app/roles/menus.tsx.ejs +4 -4
  596. package/hedhog/frontend/app/roles/routes.tsx.ejs +4 -4
  597. package/hedhog/frontend/app/roles/users.tsx.ejs +4 -4
  598. package/hedhog/frontend/app/setting-list/page.tsx.ejs +71 -9
  599. package/hedhog/frontend/app/users/page.tsx.ejs +77 -67
  600. package/hedhog/frontend/messages/en.json +237 -37
  601. package/hedhog/frontend/messages/pt.json +237 -37
  602. package/hedhog/table/cron_lock.yaml +17 -0
  603. package/hedhog/table/file.yaml +13 -1
  604. package/hedhog/table/file_upload_chunk.yaml +23 -0
  605. package/hedhog/table/file_upload_ticket.yaml +67 -0
  606. package/hedhog/table/mcp_tool_call_log.yaml +30 -22
  607. package/hedhog/table/message_template.yaml +33 -0
  608. package/hedhog/table/setting.yaml +8 -0
  609. package/hedhog/table/user_session.yaml +36 -1
  610. package/package.json +5 -3
  611. package/src/ai/ai-agent.sort.ts +21 -0
  612. package/src/ai/ai-attachment.fragments.spec.ts +56 -3
  613. package/src/ai/ai.service.responses.spec.ts +429 -0
  614. package/src/ai/ai.service.spec.ts +173 -1
  615. package/src/ai/ai.service.ts +473 -220
  616. package/src/ai-instruction/ai-instruction.service.ts +32 -28
  617. package/src/ai-instruction/ai-instruction.sort.ts +32 -0
  618. package/src/ai-instruction/ai-prompt-resolver.service.spec.ts +44 -0
  619. package/src/ai-instruction/ai-prompt-resolver.service.ts +29 -0
  620. package/src/auth/auth.module.ts +8 -1
  621. package/src/auth/auth.service.spec.ts +108 -1
  622. package/src/auth/auth.service.ts +59 -5
  623. package/src/auth/guards/auth.guard.ts +9 -1
  624. package/src/authorize/authorize.controller.ts +126 -11
  625. package/src/authorize/authorize.errors.ts +55 -0
  626. package/src/authorize/authorize.module.ts +6 -1
  627. package/src/authorize/authorize.service.spec.ts +379 -7
  628. package/src/authorize/authorize.service.ts +309 -23
  629. package/src/authorize/dto/authorize-info.dto.ts +21 -3
  630. package/src/authorize/dto/consent.dto.ts +21 -3
  631. package/src/authorize/dto/token.dto.ts +24 -2
  632. package/src/authorize/oauth-exception.filter.ts +58 -0
  633. package/src/authorize/oauth-metadata.service.ts +67 -0
  634. package/src/authorize/well-known.controller.spec.ts +84 -0
  635. package/src/authorize/well-known.controller.ts +96 -0
  636. package/src/captcha/captcha.service.spec.ts +211 -4
  637. package/src/captcha/captcha.service.ts +127 -10
  638. package/src/core.module.ts +9 -0
  639. package/src/dashboard/dashboard-component-role/dashboard-component-role.service.ts +2 -3
  640. package/src/dashboard/dashboard-component-role/dashboard-component-role.sort.ts +18 -0
  641. package/src/dashboard/dashboard-item/dashboard-item.service.ts +2 -3
  642. package/src/dashboard/dashboard-item/dashboard-item.sort.ts +19 -0
  643. package/src/dashboard/dashboard-role/dashboard-role.service.ts +2 -3
  644. package/src/dashboard/dashboard-role/dashboard-role.sort.ts +16 -0
  645. package/src/document-kit/document-kit.module.ts +12 -0
  646. package/src/document-kit/document-kit.registry.ts +125 -0
  647. package/src/document-kit/document-kit.service.spec.ts +156 -0
  648. package/src/document-kit/document-kit.service.ts +173 -0
  649. package/src/file/file-upload-ticket.service.spec.ts +422 -0
  650. package/src/file/file-upload-ticket.service.ts +513 -0
  651. package/src/file/file.controller.ts +65 -0
  652. package/src/file/file.module.ts +14 -2
  653. package/src/file/file.service.spec.ts +262 -1
  654. package/src/file/file.service.ts +505 -87
  655. package/src/file/filename-encoding.util.spec.ts +54 -0
  656. package/src/file/filename-encoding.util.ts +67 -0
  657. package/src/file/image-optimization.service.spec.ts +156 -19
  658. package/src/file/image-optimization.service.ts +106 -21
  659. package/src/file/mcp-file-source.schema.ts +86 -0
  660. package/src/file/mcp-file-source.service.spec.ts +473 -0
  661. package/src/file/mcp-file-source.service.ts +445 -0
  662. package/src/file/mimetype-sniff.util.spec.ts +126 -0
  663. package/src/file/mimetype-sniff.util.ts +265 -0
  664. package/src/file/remote-fetch.util.spec.ts +117 -0
  665. package/src/file/remote-fetch.util.ts +330 -0
  666. package/src/impersonation/dto/start-impersonation.dto.ts +5 -2
  667. package/src/impersonation/impersonation.service.spec.ts +24 -1
  668. package/src/impersonation/impersonation.service.ts +14 -4
  669. package/src/incident/incident.controller.ts +9 -1
  670. package/src/incident/incident.service.ts +7 -0
  671. package/src/index.ts +23 -1
  672. package/src/integration-profile/integration-profile.secrets.ts +28 -0
  673. package/src/integration-profile/integration-profile.service.ts +7 -64
  674. package/src/integration-profile/integration-profile.utils.spec.ts +9 -0
  675. package/src/integration-profile/integration-profile.utils.ts +5 -5
  676. package/src/integration-profile/testers/ai.testers.ts +70 -5
  677. package/src/integration-profile/testers/index.ts +2 -0
  678. package/src/integration-profile/testers/remaining.testers.spec.ts +144 -1
  679. package/src/integration-profile/testers/shipping.testers.ts +94 -0
  680. package/src/integration-profile/testers/tester-coverage.spec.ts +10 -0
  681. package/src/mail/dto/send.dto.ts +6 -1
  682. package/src/mail/mail-template.spec.ts +58 -1
  683. package/src/mail/mail.service.spec.ts +112 -0
  684. package/src/mail/mail.service.ts +42 -4
  685. package/src/mail-sent/mail-sent.service.ts +3 -0
  686. package/src/mail-sent/mail-sent.sort.ts +19 -0
  687. package/src/mcp/filters/mcp-challenge.filter.spec.ts +76 -0
  688. package/src/mcp/filters/mcp-challenge.filter.ts +70 -0
  689. package/src/mcp/guards/mcp-auth.guard.spec.ts +51 -2
  690. package/src/mcp/guards/mcp-auth.guard.ts +24 -1
  691. package/src/mcp/guards/mcp-permission.guard.spec.ts +109 -15
  692. package/src/mcp/guards/mcp-permission.guard.ts +76 -51
  693. package/src/mcp/mcp-audit.service.spec.ts +107 -0
  694. package/src/mcp/mcp-audit.service.ts +37 -1
  695. package/src/mcp/mcp-permission.service.spec.ts +197 -0
  696. package/src/mcp/mcp-permission.service.ts +184 -0
  697. package/src/mcp/mcp-server.service.spec.ts +84 -2
  698. package/src/mcp/mcp-server.service.ts +111 -87
  699. package/src/mcp/mcp.controller.ts +8 -1
  700. package/src/mcp/mcp.module.ts +7 -1
  701. package/src/mcp/tools/core-access-log.mcp-tools.ts +66 -0
  702. package/src/mcp/tools/core-ai.mcp-tools.ts +1 -1
  703. package/src/mcp/tools/core-dashboard-items.mcp-tools.ts +1 -1
  704. package/src/mcp/tools/core-dashboard.mcp-tools.ts +1 -1
  705. package/src/mcp/tools/core-event-webhooks.mcp-tools.ts +1 -2
  706. package/src/mcp/tools/core-files.mcp-tools.ts +202 -22
  707. package/src/mcp/tools/core-integration-events.mcp-tools.ts +1 -1
  708. package/src/mcp/tools/core-mail-sent.mcp-tools.ts +1 -1
  709. package/src/mcp/tools/core-mail.mcp-tools.ts +1 -1
  710. package/src/mcp/tools/core-menus.mcp-tools.ts +1 -2
  711. package/src/mcp/tools/core-notifications.mcp-tools.ts +0 -1
  712. package/src/mcp/tools/core-roles.mcp-tools.ts +1 -5
  713. package/src/mcp/tools/core-routes.mcp-tools.ts +1 -3
  714. package/src/mcp/tools/core-screens.mcp-tools.ts +1 -3
  715. package/src/mcp/tools/core-sessions.mcp-tools.ts +0 -2
  716. package/src/mcp/tools/core-settings.mcp-tools.ts +1 -2
  717. package/src/mcp/tools/core-users.mcp-tools.ts +1 -1
  718. package/src/mcp/tools/core-webhooks.mcp-tools.ts +1 -2
  719. package/src/mcp/types/mcp-context.type.ts +15 -6
  720. package/src/mcp-chat/mcp-chat.service.ts +8 -0
  721. package/src/meeting/meeting-provider.registry.ts +201 -0
  722. package/src/meeting/meeting.constants.ts +74 -0
  723. package/src/menu/menu.service.spec.ts +89 -0
  724. package/src/menu/menu.service.ts +29 -11
  725. package/src/message-template/dto/update-message-template.dto.ts +22 -0
  726. package/src/message-template/message-template-admin.service.spec.ts +163 -0
  727. package/src/message-template/message-template-admin.service.ts +239 -0
  728. package/src/message-template/message-template.controller.ts +52 -0
  729. package/src/message-template/message-template.module.ts +21 -0
  730. package/src/message-template/message-template.registry.spec.ts +62 -0
  731. package/src/message-template/message-template.registry.ts +125 -0
  732. package/src/message-template/message-template.service.spec.ts +149 -0
  733. package/src/message-template/message-template.service.ts +149 -0
  734. package/src/notification/notification.constants.ts +10 -0
  735. package/src/notification/notification.module.ts +3 -0
  736. package/src/notification/notification.service.spec.ts +75 -1
  737. package/src/notification/notification.service.ts +39 -1
  738. package/src/oauth/oauth-token-broker.service.spec.ts +108 -0
  739. package/src/oauth/oauth-token-broker.service.ts +129 -2
  740. package/src/oauth/oauth.controller.ts +0 -1
  741. package/src/oauth/oauth.errors.ts +7 -0
  742. package/src/oauth/oauth.module.ts +6 -1
  743. package/src/oauth/oauth.service.spec.ts +58 -7
  744. package/src/oauth/oauth.service.ts +71 -32
  745. package/src/oauth/providers/abstract.provider.spec.ts +192 -0
  746. package/src/oauth/providers/abstract.provider.ts +46 -14
  747. package/src/oauth/providers/github.provider.ts +57 -34
  748. package/src/oauth/providers/microsoft-entra-id.provider.spec.ts +133 -0
  749. package/src/oauth/providers/microsoft-entra-id.provider.ts +37 -3
  750. package/src/observability/monitored-cron.spec.ts +164 -31
  751. package/src/observability/monitored-cron.ts +154 -62
  752. package/src/pdf/document/charts/chart-bar.ts +217 -0
  753. package/src/pdf/document/charts/chart-donut.ts +163 -0
  754. package/src/pdf/document/charts/chart-gauge.ts +94 -0
  755. package/src/pdf/document/charts/chart-line.ts +159 -0
  756. package/src/pdf/document/charts/chart-primitives.ts +188 -0
  757. package/src/pdf/document/charts/chart-radar.ts +136 -0
  758. package/src/pdf/document/charts/chart-scale.spec.ts +93 -0
  759. package/src/pdf/document/charts/chart-scale.ts +141 -0
  760. package/src/pdf/document/charts/charts.spec.ts +157 -0
  761. package/src/pdf/document/charts/index.ts +7 -0
  762. package/src/pdf/document/index.ts +7 -0
  763. package/src/pdf/document/pdf-document.chrome.ts +38 -0
  764. package/src/pdf/document/pdf-document.css.ts +238 -0
  765. package/src/pdf/document/pdf-document.renderer.spec.ts +129 -0
  766. package/src/pdf/document/pdf-document.renderer.ts +215 -0
  767. package/src/pdf/document/pdf-document.service.ts +77 -0
  768. package/src/pdf/document/pdf-document.theme.ts +146 -0
  769. package/src/pdf/document/pdf-document.types.ts +97 -0
  770. package/src/pdf/pdf.module.ts +3 -2
  771. package/src/pdf/pdf.service.spec.ts +131 -0
  772. package/src/pdf/pdf.service.ts +245 -82
  773. package/src/pdf/templates/commercial-proposal.template.spec.ts +177 -0
  774. package/src/pdf/templates/commercial-proposal.template.ts +400 -0
  775. package/src/profile/dto/change-password.dto.ts +25 -7
  776. package/src/profile/profile.service.spec.ts +97 -0
  777. package/src/profile/profile.service.ts +9 -3
  778. package/src/realtime/realtime-tick.coalescer.spec.ts +92 -0
  779. package/src/realtime/realtime-tick.coalescer.ts +60 -0
  780. package/src/realtime/realtime.service.spec.ts +33 -0
  781. package/src/realtime/realtime.service.ts +28 -2
  782. package/src/redis/redis-kv.service.ts +261 -0
  783. package/src/redis/redis-master.spec.ts +111 -0
  784. package/src/redis/redis-master.ts +86 -0
  785. package/src/redis/redis-pubsub.ts +27 -3
  786. package/src/redis/redis.module.ts +17 -0
  787. package/src/session/session.service.spec.ts +121 -42
  788. package/src/session/session.service.ts +279 -82
  789. package/src/setting/favicon.controller.spec.ts +92 -0
  790. package/src/setting/favicon.controller.ts +135 -0
  791. package/src/setting/setting.module.ts +2 -1
  792. package/src/setting/setting.service.ts +44 -3
  793. package/src/task/task.service.spec.ts +41 -0
  794. package/src/task/task.service.ts +53 -13
  795. package/src/token/token.service.spec.ts +90 -0
  796. package/src/token/token.service.ts +48 -2
  797. package/src/user/user-credential.util.ts +14 -5
  798. package/src/user/user.service.ts +2 -12
  799. package/src/user/user.sort.ts +25 -0
  800. package/src/utils/abbreviate-name.spec.ts +50 -0
  801. package/src/utils/abbreviate-name.ts +44 -0
  802. package/src/utils/date-range-query.dto.ts +56 -0
  803. package/src/utils/date-range.spec.ts +175 -0
  804. package/src/utils/date-range.ts +246 -0
  805. package/src/webhook-integration/webhook-utils.spec.ts +67 -0
  806. package/src/webhook-integration/webhook-utils.ts +26 -0
  807. package/src/whatsapp-sender/whatsapp-recipients.spec.ts +89 -0
  808. package/src/whatsapp-sender/whatsapp-recipients.ts +83 -0
  809. package/src/whatsapp-sender/whatsapp-sender.service.spec.ts +185 -0
  810. package/src/whatsapp-sender/whatsapp-sender.service.ts +90 -7
  811. package/hedhog/query/device_pairing_request.sql +0 -46
  812. package/hedhog/query/impersonation_grant.sql +0 -71
  813. package/hedhog/query/oauth_authorize_pkce.sql +0 -58
  814. package/hedhog/query/oauth_mobile_state_token.sql +0 -30
  815. package/hedhog/query/oauth_web_ref_token.sql +0 -25
@@ -1,4 +1,5 @@
1
1
  import { Injectable, Logger } from '@nestjs/common';
2
+ import { MeetingChatMessage } from './meeting.constants';
2
3
 
3
4
  /**
4
5
  * Pedido de criação de uma reunião online para uma entidade de negócio qualquer.
@@ -25,6 +26,12 @@ export interface CreateMeetingInput {
25
26
  * participante comum.
26
27
  */
27
28
  coOrganizerUserIds?: number[];
29
+ /**
30
+ * E-mails/UPNs adicionais do Entra ID a coorganizar, além dos resolvidos por
31
+ * {@link coOrganizerUserIds}. Resolvidos pelo provedor — quem não existir no
32
+ * diretório é apenas ignorado, nunca falha a criação da reunião.
33
+ */
34
+ coOrganizerEmails?: string[];
28
35
  /** Convidados do evento de calendário. */
29
36
  attendeeEmails?: string[];
30
37
  /** Local do evento (aula presencial/híbrida com reunião gerenciada). */
@@ -77,6 +84,40 @@ export interface UpdateMeetingDetailsInput {
77
84
  description?: string | null;
78
85
  }
79
86
 
87
+ /**
88
+ * Pedido de troca dos coorganizadores extras de uma reunião já existente.
89
+ *
90
+ * Separado de `createMeeting` pelo mesmo motivo de `updateAttendees`: corrigir
91
+ * a reunião de uma aula que já foi criada não pode gerar link novo. Só cobre
92
+ * os coorganizadores extras (por e-mail) — o coorganizador derivado do
93
+ * instrutor não é tocado por este caminho.
94
+ */
95
+ export interface UpdateMeetingCoOrganizersInput {
96
+ sourceModule: string;
97
+ sourceEntity: string;
98
+ sourceEntityId: string;
99
+ coOrganizerEmails: string[];
100
+ }
101
+
102
+ /**
103
+ * Estado da tarefa que traz a gravação do provedor para o storage local.
104
+ *
105
+ * Descrito em termos genéricos de propósito: a origem precisa saber se a
106
+ * importação está andando, travou ou vai retentar, mas não pode depender de
107
+ * como o provedor a executa. Hoje é um job da fila do módulo Microsoft; num
108
+ * provedor com webhook não haveria job nenhum, e o contrato continua valendo.
109
+ */
110
+ export interface MeetingRecordingImport {
111
+ status: 'pending' | 'running' | 'done' | 'failed';
112
+ attempts: number;
113
+ maxAttempts: number;
114
+ lastError: string | null;
115
+ startedAt: Date | null;
116
+ finishedAt: Date | null;
117
+ /** Quando a próxima tentativa acontece, se houver uma agendada. */
118
+ nextRetryAt: Date | null;
119
+ }
120
+
80
121
  /**
81
122
  * Estado de uma reunião, na forma em que o módulo de origem precisa ver.
82
123
  *
@@ -107,6 +148,12 @@ export interface MeetingSummary {
107
148
  * acompanha a turma.
108
149
  */
109
150
  attendeeEmails: string[];
151
+ /**
152
+ * Coorganizadores extras (por e-mail) atualmente aplicados na reunião, para
153
+ * o módulo de origem comparar antes de mandar atualizar — mesmo motivo de
154
+ * `attendeeEmails`. Não inclui o coorganizador derivado do instrutor.
155
+ */
156
+ coOrganizerEmails: string[];
110
157
  /** Estado da importação da gravação, quando `autoRecord` está ligado. */
111
158
  recordingStatus:
112
159
  | 'not_requested'
@@ -116,6 +163,115 @@ export interface MeetingSummary {
116
163
  | 'failed';
117
164
  recordingFileId: number | null;
118
165
  lastError: string | null;
166
+ /**
167
+ * Quando o provedor procurou a gravação pela última vez, e quantas vezes já
168
+ * procurou.
169
+ *
170
+ * Existe para a origem distinguir "ainda não deu tempo" de "está procurando e
171
+ * não acha": os dois são `recordingStatus: 'pending'`, e sem isto a tela do
172
+ * módulo de origem só pode dizer "aguardando", que é a mesma frase por horas.
173
+ */
174
+ recordingCheckedAt: Date | null;
175
+ recordingAttempts: number;
176
+ recordingImportedAt: Date | null;
177
+ /**
178
+ * Janela em que o provedor procura a gravação, já resolvida em instantes.
179
+ *
180
+ * Derivada aqui, e não na origem, porque a carência antes da primeira busca e
181
+ * a largura da janela são conhecimento do provedor — o LMS não deve saber que
182
+ * o Teams leva 15 minutos para publicar nem que a busca desiste em 48 h.
183
+ * `null` quando não há gravação pedida ou o provedor não expõe a janela.
184
+ */
185
+ recordingSearchStartsAt: Date | null;
186
+ recordingSearchExpiresAt: Date | null;
187
+ /**
188
+ * Andamento do download da gravação, quando o provedor já o iniciou.
189
+ *
190
+ * Vem do provedor e não da origem porque só ele sabe como importa — a
191
+ * alternativa seria o módulo de origem vasculhar a fila de outro módulo por
192
+ * `source_entity`, que é exatamente o acoplamento que este contrato evita.
193
+ */
194
+ recordingImport: MeetingRecordingImport | null;
195
+ }
196
+
197
+ /**
198
+ * Pedido do conteúdo de um anexo do chat de uma reunião.
199
+ *
200
+ * A origem repassa os identificadores que recebeu no evento do chat; traduzi-los
201
+ * em chamadas ao provedor é problema de quem implementa.
202
+ */
203
+ export interface FetchMeetingChatAttachmentInput {
204
+ sourceModule: string;
205
+ sourceEntity: string;
206
+ sourceEntityId: string;
207
+ providerMessageId: string;
208
+ providerAttachmentId: string;
209
+ /** O que veio no evento; alguns provedores só sabem baixar por ele. */
210
+ contentUrl?: string | null;
211
+ /** Acima disso o provedor desiste antes de transferir. */
212
+ maxBytes?: number;
213
+ }
214
+
215
+ export interface MeetingChatAttachmentContent {
216
+ buffer: Buffer;
217
+ filename: string;
218
+ mimetype: string;
219
+ size: number;
220
+ }
221
+
222
+ /**
223
+ * Pedido de publicação de uma mensagem no chat da reunião de uma origem.
224
+ *
225
+ * O corpo é HTML simples — `<p>`, `<br>`, `<strong>`, `<a href>` — e não texto
226
+ * puro porque o que motiva este contrato é mandar um link clicável para dentro
227
+ * da reunião. Provedor que não renderize HTML degrada tirando as tags; o texto
228
+ * continua legível.
229
+ */
230
+ export interface PostMeetingChatMessageInput {
231
+ sourceModule: string;
232
+ sourceEntity: string;
233
+ sourceEntityId: string;
234
+ html: string;
235
+ }
236
+
237
+ /**
238
+ * Desfecho da publicação, sem exceção.
239
+ *
240
+ * Postar no chat é conveniência, não o caminho crítico: quem chama tem sempre o
241
+ * plano B de mostrar o texto para alguém colar à mão. Transformar "o tenant
242
+ * desligou o chat da reunião" em exceção obrigaria toda tela a tratar erro para
243
+ * uma situação que é normal.
244
+ */
245
+ export type PostMeetingChatFailure =
246
+ /** Não há identidade/configuração para escrever. */
247
+ | 'unavailable'
248
+ /** A reunião não tem chat (ninguém entrou, ou o tenant o desligou). */
249
+ | 'no_chat'
250
+ /** Falta consentimento do escopo de envio na conta que escreve. */
251
+ | 'missing_scope'
252
+ /** O provedor recusou por outro motivo. */
253
+ | 'failed';
254
+
255
+ /**
256
+ * Um objeto com campos opcionais, e não uma união discriminada, porque o
257
+ * monorepo compila com `strictNullChecks: false` — e sem essa flag o
258
+ * TypeScript não estreita a união pelo `ok`, obrigando todo consumidor a um
259
+ * cast. Melhor um contrato que funciona do que um mais elegante que ninguém
260
+ * consegue usar sem contorno.
261
+ *
262
+ * `ok: true` traz `providerMessageId`; `ok: false` traz `reason` e `message`.
263
+ */
264
+ export interface PostMeetingChatMessageResult {
265
+ ok: boolean;
266
+ providerMessageId?: string | null;
267
+ reason?: PostMeetingChatFailure;
268
+ message?: string;
269
+ }
270
+
271
+ export interface ListMeetingChatMessagesInput {
272
+ sourceModule: string;
273
+ sourceEntity: string;
274
+ sourceEntityId: string;
119
275
  }
120
276
 
121
277
  /**
@@ -146,8 +302,53 @@ export interface IMeetingProvider {
146
302
  * link novo. Tolerante a reunião inexistente (mesmo padrão de updateAttendees).
147
303
  */
148
304
  updateDetails(input: UpdateMeetingDetailsInput): Promise<void>;
305
+ /**
306
+ * Troca os coorganizadores extras de uma reunião já criada, sem gerar link
307
+ * novo. Tolerante a reunião inexistente (mesmo padrão de updateAttendees).
308
+ */
309
+ updateCoOrganizers(input: UpdateMeetingCoOrganizersInput): Promise<void>;
149
310
  /** Estado das reuniões das origens informadas, para a UI do módulo de origem. */
150
311
  findBySource(ref: MeetingSourceRef): Promise<MeetingSummary[]>;
312
+ /**
313
+ * Baixa o conteúdo de um anexo do chat da reunião.
314
+ *
315
+ * Opcional de propósito: o chat é o terceiro artefato pós-reunião e nem todo
316
+ * provedor o expõe. Quem chama testa a existência do método antes — assim um
317
+ * provedor mais antigo continua válido sem alteração.
318
+ *
319
+ * Devolve `null` quando o anexo não pôde ser lido (permissão do arquivo,
320
+ * item removido, tamanho acima do teto). Não é erro: o arquivo do anexo mora
321
+ * no drive de quem o enviou, não na caixa que organizou a reunião, então
322
+ * negativa é desfecho esperado e a origem precisa de um plano B em vez de uma
323
+ * exceção.
324
+ */
325
+ fetchChatAttachment?(
326
+ input: FetchMeetingChatAttachmentInput,
327
+ ): Promise<MeetingChatAttachmentContent | null>;
328
+ /**
329
+ * Publica uma mensagem no chat da reunião.
330
+ *
331
+ * Opcional pelo mesmo motivo de {@link fetchChatAttachment}, e nunca lança:
332
+ * o desfecho vem no retorno.
333
+ */
334
+ postChatMessage?(
335
+ input: PostMeetingChatMessageInput,
336
+ ): Promise<PostMeetingChatMessageResult>;
337
+ /**
338
+ * As mensagens do chat que o provedor já capturou para esta origem.
339
+ *
340
+ * Existe porque o evento `MEETING_CHAT_AVAILABLE_EVENT` tem teto de mensagens
341
+ * e, quando estoura, entrega as mais RECENTES. Isso serve para achar o
342
+ * material que o instrutor colou no fim da aula, e não serve para uma turma
343
+ * de 250 pessoas em que cada uma escreve: as primeiras somem do payload.
344
+ *
345
+ * Lê o que o provedor já guardou, sem ida nova ao serviço remoto — é a
346
+ * alternativa a fazer o módulo de origem ler a tabela do provedor, que é
347
+ * exatamente o acoplamento que este contrato existe para evitar.
348
+ */
349
+ listChatMessages?(
350
+ input: ListMeetingChatMessagesInput,
351
+ ): Promise<MeetingChatMessage[]>;
151
352
  }
152
353
 
153
354
  /**
@@ -51,3 +51,77 @@ export interface MeetingAttendanceAvailablePayload {
51
51
  providerMeetingId?: string | null;
52
52
  records: MeetingAttendanceRecord[];
53
53
  }
54
+
55
+ /**
56
+ * Evento publicado quando o chat de uma reunião foi capturado.
57
+ *
58
+ * Terceiro do mesmo desenho, depois de gravação e presença, e pela mesma razão:
59
+ * o provedor sabe o que foi escrito no chat, mas não sabe o que é uma aula; o
60
+ * módulo de origem sabe quem é o instrutor, mas não conhece o Graph.
61
+ */
62
+ export const MEETING_CHAT_AVAILABLE_EVENT = 'microsoft.meeting.chat.available';
63
+
64
+ /** Arquivo ou imagem que acompanha uma mensagem do chat. */
65
+ export interface MeetingChatAttachment {
66
+ providerAttachmentId: string;
67
+ /**
68
+ * `attachment` é arquivo compartilhado na conversa; `hosted_content` é imagem
69
+ * colada no corpo da mensagem. A origem costuma querer só o primeiro — print
70
+ * de tela raramente é material de aula.
71
+ */
72
+ kind: 'attachment' | 'hosted_content';
73
+ name: string | null;
74
+ contentType: string | null;
75
+ /**
76
+ * Endereço do arquivo no provedor. Não é baixável sem token: serve de rastro
77
+ * e é o que a origem devolve ao provedor para pedir o conteúdo.
78
+ */
79
+ contentUrl: string | null;
80
+ }
81
+
82
+ /** Uma mensagem do chat, na forma em que a origem precisa ver. */
83
+ export interface MeetingChatMessage {
84
+ providerMessageId: string;
85
+ /** Mensagem à qual esta responde, quando houver. */
86
+ replyToId: string | null;
87
+ /**
88
+ * Nulo quando o provedor não identificou quem escreveu (convidado anônimo,
89
+ * aplicativo, ou evento de sistema). A origem decide o que fazer — e quando a
90
+ * decisão publica conteúdo para terceiros, o certo é descartar: casar por
91
+ * nome confundiria homônimos.
92
+ */
93
+ senderEmail: string | null;
94
+ senderDisplayName: string;
95
+ /** ISO-8601. */
96
+ sentAt: string;
97
+ /** `message`, `systemEventMessage`, … — como o provedor classificou. */
98
+ messageType: string;
99
+ /**
100
+ * Texto puro, nunca HTML.
101
+ *
102
+ * O payload é persistido como jsonb no outbox, e o HTML do Teams é gordo o
103
+ * bastante para que uma aula inteira não caiba. Quem precisar do original lê
104
+ * a tabela do provedor.
105
+ */
106
+ text: string;
107
+ attachments: MeetingChatAttachment[];
108
+ }
109
+
110
+ export interface MeetingChatAvailablePayload {
111
+ sourceModule: string;
112
+ sourceEntity: string;
113
+ sourceEntityId: string;
114
+ providerMeetingId?: string | null;
115
+ providerChatId?: string | null;
116
+ /** Quantas mensagens o chat tem de verdade, mesmo se `messages` foi cortado. */
117
+ messageCount: number;
118
+ firstMessageAt: string | null;
119
+ lastMessageAt: string | null;
120
+ /** Mensagens em ordem cronológica, limitadas ao teto do evento. */
121
+ messages: MeetingChatMessage[];
122
+ /**
123
+ * `messages` não traz tudo: o chat passou do teto do evento ou da paginação
124
+ * do provedor. `messageCount` continua sendo o número real.
125
+ */
126
+ truncated: boolean;
127
+ }
@@ -74,3 +74,92 @@ describe('MenuService.ensureValidParent', () => {
74
74
  await expect(call('en', 5, 10)).rejects.toThrow(BadRequestException);
75
75
  });
76
76
  });
77
+
78
+ describe('MenuService.getMenus', () => {
79
+ let prisma: any;
80
+ let service: MenuService;
81
+
82
+ const row = (id: number, menuId: number | null, name: string) => ({
83
+ id,
84
+ menu_id: menuId,
85
+ order: id,
86
+ menu_locale: [{ name }],
87
+ });
88
+
89
+ beforeEach(() => {
90
+ prisma = {
91
+ user: { count: jest.fn<any>().mockResolvedValue(1) },
92
+ menu: { findMany: jest.fn<any>().mockResolvedValue([]) },
93
+ };
94
+ service = makeService(prisma);
95
+ });
96
+
97
+ afterEach(() => {
98
+ jest.clearAllMocks();
99
+ });
100
+
101
+ it('lança BadRequestException quando o usuário não existe', async () => {
102
+ prisma.user.count.mockResolvedValue(0);
103
+ await expect(service.getMenus('en', 42)).rejects.toThrow(BadRequestException);
104
+ expect(prisma.menu.findMany).not.toHaveBeenCalled();
105
+ });
106
+
107
+ it('monta a árvore inteira com uma única consulta', async () => {
108
+ prisma.menu.findMany.mockResolvedValue([
109
+ row(1, null, 'LMS'),
110
+ row(2, 1, 'Cursos'),
111
+ row(3, 2, 'Estrutura'),
112
+ row(4, null, 'CRM'),
113
+ ]);
114
+
115
+ const tree = await service.getMenus('en', 42);
116
+
117
+ // O ponto da correção: uma query para tudo, não uma por nó.
118
+ expect(prisma.menu.findMany).toHaveBeenCalledTimes(1);
119
+ expect(prisma.user.count).toHaveBeenCalledTimes(1);
120
+
121
+ expect(tree.map((m: any) => m.id)).toEqual([1, 4]);
122
+ expect(tree[0].name).toBe('LMS');
123
+ expect(tree[0].menu.map((m: any) => m.id)).toEqual([2]);
124
+ expect(tree[0].menu[0].menu.map((m: any) => m.id)).toEqual([3]);
125
+ expect(tree[1].menu).toEqual([]);
126
+ });
127
+
128
+ it('não promove a raiz um menu cujo pai o usuário não acessa', async () => {
129
+ // O pai (10) não veio do banco porque o usuário não tem o papel dele; o
130
+ // filho não pode aparecer solto na raiz por causa disso.
131
+ prisma.menu.findMany.mockResolvedValue([
132
+ row(1, null, 'LMS'),
133
+ row(11, 10, 'Filho de menu inacessível'),
134
+ ]);
135
+
136
+ const tree = await service.getMenus('en', 42);
137
+
138
+ expect(tree.map((m: any) => m.id)).toEqual([1]);
139
+ });
140
+
141
+ it('respeita a ordem dos irmãos vinda da consulta', async () => {
142
+ prisma.menu.findMany.mockResolvedValue([
143
+ row(7, 1, 'Segundo'),
144
+ row(1, null, 'Raiz'),
145
+ row(5, 1, 'Primeiro'),
146
+ ]);
147
+
148
+ const tree = await service.getMenus('en', 42);
149
+
150
+ expect(tree[0].menu.map((m: any) => m.id)).toEqual([7, 5]);
151
+ });
152
+
153
+ it('retorna apenas a subárvore quando um menuId é informado', async () => {
154
+ prisma.menu.findMany.mockResolvedValue([
155
+ row(1, null, 'LMS'),
156
+ row(2, 1, 'Cursos'),
157
+ row(3, 2, 'Estrutura'),
158
+ ]);
159
+
160
+ const tree = await service.getMenus('en', 42, 1);
161
+
162
+ expect(tree.map((m: any) => m.id)).toEqual([2]);
163
+ expect(tree[0].menu.map((m: any) => m.id)).toEqual([3]);
164
+ });
165
+ });
@@ -258,7 +258,6 @@ export class MenuService {
258
258
  }
259
259
 
260
260
  async getMenus(locale: string, userId: number, menuId = 0) {
261
-
262
261
  const userExists = await this.prismaService.user.count({
263
262
  where: {
264
263
  id: userId,
@@ -271,13 +270,13 @@ export class MenuService {
271
270
  );
272
271
  }
273
272
 
274
- if (menuId === 0) {
275
- menuId = null;
276
- }
277
-
278
- let menu = (await this.prismaService.menu.findMany({
273
+ // Uma consulta para a árvore inteira, em vez de uma por nó. A versão
274
+ // recursiva anterior repetia esta busca — e o `user.count` acima — a cada
275
+ // nível: com os ~260 itens de menu que as libraries registram, eram
276
+ // centenas de idas ao banco em série e o `/menu/system` levava ~2s a cada
277
+ // navegação do admin, mesmo quando a resposta terminava em 304.
278
+ const rows = (await this.prismaService.menu.findMany({
279
279
  where: {
280
- menu_id: menuId,
281
280
  role_menu: {
282
281
  some: {
283
282
  role: {
@@ -307,13 +306,32 @@ export class MenuService {
307
306
  },
308
307
  })) as unknown[] as any[];
309
308
 
310
- menu = menu.map((m) => itemTranslations('menu_locale', m));
309
+ const childrenByParent = new Map<number | null, any[]>();
310
+
311
+ for (const row of rows) {
312
+ const item = itemTranslations('menu_locale', row) as any;
313
+ const parentId = item.menu_id ?? null;
314
+ const siblings = childrenByParent.get(parentId);
311
315
 
312
- for (let i = 0; i < menu.length; i++) {
313
- menu[i].menu = await this.getMenus(locale, userId, menu[i].id);
316
+ if (siblings) siblings.push(item);
317
+ else childrenByParent.set(parentId, [item]);
314
318
  }
315
319
 
316
- return menu;
320
+ // Descer apenas pelos filhos presentes no resultado preserva a regra
321
+ // anterior: um menu cujo pai o usuário não acessa continua invisível, em
322
+ // vez de subir para a raiz. Os irmãos já vêm ordenados por `order` da
323
+ // consulta, e o agrupamento acima mantém essa ordem.
324
+ const buildTree = (parentId: number | null): any[] => {
325
+ const children = childrenByParent.get(parentId) ?? [];
326
+
327
+ for (const child of children) {
328
+ child.menu = buildTree(child.id);
329
+ }
330
+
331
+ return children;
332
+ };
333
+
334
+ return buildTree(menuId === 0 ? null : menuId);
317
335
  }
318
336
 
319
337
  async getSystemMenu(locale: string, userId: number) {
@@ -0,0 +1,22 @@
1
+ import { IsBoolean, IsObject, IsOptional } from 'class-validator';
2
+
3
+ /**
4
+ * Corpo aceito pela edição de um modelo de mensagem.
5
+ *
6
+ * `slug` fica de fora de propósito: quem procura o modelo é o código, e
7
+ * renomeá-lo pelo painel desligaria o aviso em silêncio. O que se edita aqui é o
8
+ * texto.
9
+ *
10
+ * `name` e `description` também não entram: eles moram no registry, declarados
11
+ * pela library dona do modelo. Deixar editá-los aqui criaria um rótulo que
12
+ * diverge do que o código diz — e a tela não teria como saber qual vale.
13
+ */
14
+ export class UpdateMessageTemplateDTO {
15
+ @IsOptional()
16
+ @IsBoolean()
17
+ is_active?: boolean;
18
+
19
+ @IsOptional()
20
+ @IsObject()
21
+ locale?: Record<string, { body?: string }>;
22
+ }
@@ -0,0 +1,163 @@
1
+ import { BadRequestException, NotFoundException } from '@nestjs/common';
2
+
3
+ import { MessageTemplateAdminService } from './message-template-admin.service';
4
+ import {
5
+ clearMessageTemplateRegistry,
6
+ registerMessageTemplates,
7
+ } from './message-template.registry';
8
+
9
+ /**
10
+ * O CRUD da tela, que no SAC não tinha cobertura nenhuma.
11
+ *
12
+ * O que estes testes protegem é o desenho: a listagem vem do REGISTRY e o banco
13
+ * entra por cima. Um modelo recém-declarado por uma library precisa aparecer
14
+ * antes de existir linha no banco — senão volta a dor dos prompts de IA, em que
15
+ * prompt sem seed simplesmente não aparece.
16
+ */
17
+ describe('MessageTemplateAdminService', () => {
18
+ let prisma: any;
19
+ let service: MessageTemplateAdminService;
20
+
21
+ const SLUG = 'demo.aviso';
22
+
23
+ beforeEach(() => {
24
+ clearMessageTemplateRegistry();
25
+ registerMessageTemplates([
26
+ {
27
+ slug: SLUG,
28
+ moduleSlug: 'demo',
29
+ name: { pt: 'Aviso' },
30
+ description: { pt: 'Sai quando algo acontece.' },
31
+ fallback: { pt: 'Padrão {{protocol}}', en: 'Default {{protocol}}' },
32
+ variables: { protocol: { sample: '202609-000045' } },
33
+ },
34
+ {
35
+ slug: 'outro.aviso',
36
+ moduleSlug: 'outro',
37
+ name: { pt: 'Outro' },
38
+ fallback: { pt: 'Outro padrão' },
39
+ variables: {},
40
+ },
41
+ ]);
42
+
43
+ prisma = {
44
+ message_template: {
45
+ findMany: jest.fn().mockResolvedValue([]),
46
+ findUnique: jest.fn().mockResolvedValue(null),
47
+ upsert: jest.fn().mockResolvedValue({ id: 7, slug: SLUG }),
48
+ delete: jest.fn().mockResolvedValue({}),
49
+ },
50
+ message_template_locale: { upsert: jest.fn().mockResolvedValue({}) },
51
+ locale: { findFirst: jest.fn().mockResolvedValue({ id: 1 }) },
52
+ };
53
+
54
+ service = new MessageTemplateAdminService(prisma);
55
+ });
56
+
57
+ describe('list', () => {
58
+ it('mostra o modelo antes de existir linha no banco', async () => {
59
+ const { data } = await service.list();
60
+
61
+ expect(data).toHaveLength(2);
62
+ const item = data.find((d) => d.slug === SLUG)!;
63
+ expect(item.customized).toBe(false);
64
+ expect(item.is_active).toBe(true);
65
+ expect(item.body.pt).toBe('Padrão {{protocol}}');
66
+ });
67
+
68
+ it('o texto editado vence o padrão, por idioma', async () => {
69
+ prisma.message_template.findMany.mockResolvedValue([
70
+ {
71
+ slug: SLUG,
72
+ is_active: true,
73
+ message_template_locale: [
74
+ { body: 'Editado {{protocol}}', locale: { code: 'pt' } },
75
+ ],
76
+ },
77
+ ]);
78
+
79
+ const { data } = await service.list();
80
+ const item = data.find((d) => d.slug === SLUG)!;
81
+
82
+ expect(item.customized).toBe(true);
83
+ expect(item.body.pt).toBe('Editado {{protocol}}');
84
+ // O inglês não foi editado: segue o padrão do código.
85
+ expect(item.body.en).toBe('Default {{protocol}}');
86
+ // E o padrão continua exposto, para a tela poder restaurar.
87
+ expect(item.fallback.pt).toBe('Padrão {{protocol}}');
88
+ });
89
+
90
+ it('filtra por módulo, para o agrupamento da tela', async () => {
91
+ const { data } = await service.list('outro');
92
+ expect(data.map((d) => d.slug)).toEqual(['outro.aviso']);
93
+ });
94
+ });
95
+
96
+ describe('update', () => {
97
+ it('cria a linha na primeira edição', async () => {
98
+ await service.update(SLUG, { locale: { pt: { body: 'Novo {{protocol}}' } } });
99
+
100
+ expect(prisma.message_template.upsert).toHaveBeenCalledWith(
101
+ expect.objectContaining({ where: { slug: SLUG } }),
102
+ );
103
+ expect(prisma.message_template_locale.upsert).toHaveBeenCalled();
104
+ });
105
+
106
+ it('recusa corpo com sintaxe quebrada antes de gravar', async () => {
107
+ // Aceitar deixaria a tela dizendo "salvo" enquanto o aviso sai com o texto
108
+ // padrão, sem explicação nenhuma.
109
+ await expect(
110
+ service.update(SLUG, { locale: { pt: { body: '{{#if x}}sem fechar' } } }),
111
+ ).rejects.toThrow(BadRequestException);
112
+
113
+ expect(prisma.message_template.upsert).not.toHaveBeenCalled();
114
+ });
115
+
116
+ it('não mexe em is_active quando o corpo não o menciona', async () => {
117
+ await service.update(SLUG, { locale: { pt: { body: 'ok' } } });
118
+
119
+ expect(prisma.message_template.upsert).toHaveBeenCalledWith(
120
+ expect.objectContaining({ update: {} }),
121
+ );
122
+ });
123
+
124
+ it('recusa slug que nenhuma library registrou', async () => {
125
+ await expect(service.update('demo.fantasma', {})).rejects.toThrow(
126
+ NotFoundException,
127
+ );
128
+ });
129
+ });
130
+
131
+ describe('restore', () => {
132
+ it('apaga a linha em vez de copiar o padrão para dentro dela', async () => {
133
+ // Copiar congelaria o texto na versão de hoje, e a próxima melhoria que
134
+ // viesse por deploy não chegaria a quem restaurou.
135
+ await service.restore(SLUG);
136
+
137
+ expect(prisma.message_template.delete).toHaveBeenCalledWith({
138
+ where: { slug: SLUG },
139
+ });
140
+ });
141
+
142
+ it('restaurar um modelo que nunca foi editado não é erro', async () => {
143
+ prisma.message_template.delete.mockRejectedValue(new Error('não existe'));
144
+ await expect(service.restore(SLUG)).resolves.toBeDefined();
145
+ });
146
+ });
147
+
148
+ describe('preview', () => {
149
+ it('renderiza com as amostras declaradas pelo registry', () => {
150
+ expect(service.preview(SLUG, 'Chamado {{protocol}}')).toEqual({
151
+ text: 'Chamado 202609-000045',
152
+ });
153
+ });
154
+
155
+ it('recusa sintaxe quebrada', () => {
156
+ expect(() => service.preview(SLUG, '{{#if x}}')).toThrow(BadRequestException);
157
+ });
158
+ });
159
+
160
+ it('modules lista os módulos que declararam algum modelo', () => {
161
+ expect(service.modules()).toEqual({ data: ['demo', 'outro'] });
162
+ });
163
+ });