@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
@@ -6,11 +6,13 @@ import {
6
6
  PageHeader,
7
7
  PaginationFooter,
8
8
  SearchBar,
9
+ SortableTableHead,
9
10
  type SearchBarControl,
10
11
  } from '@/components/entity-list';
11
12
  import { Badge } from '@/components/ui/badge';
12
13
  import { Button } from '@/components/ui/button';
13
14
  import { Card, CardContent } from '@/components/ui/card';
15
+ import { DateRangePicker } from '@/components/ui/date-range-picker';
14
16
  import { Input } from '@/components/ui/input';
15
17
  import { KpiCardsGrid, type KpiCardItem } from '@/components/ui/kpi-cards-grid';
16
18
  import { ScrollArea } from '@/components/ui/scroll-area';
@@ -31,7 +33,9 @@ import {
31
33
  } from '@/components/ui/table';
32
34
  import { ToggleGroup, ToggleGroupItem } from '@/components/ui/toggle-group';
33
35
  import { useDebounce } from '@/hooks/use-debounce';
36
+ import { useListUrlState } from '@/hooks/use-list-url-state';
34
37
  import { usePersistedPageSize } from '@/hooks/use-persisted-page-size';
38
+ import { useTableSort, type SortableColumn } from '@/hooks/use-table-sort';
35
39
  import { formatDate } from '@/lib/format-date';
36
40
  import { useApp, useQuery } from '@hed-hog/next-app-provider';
37
41
  import {
@@ -48,7 +52,7 @@ import {
48
52
  User,
49
53
  } from 'lucide-react';
50
54
  import { useTranslations } from 'next-intl';
51
- import { useMemo, useState } from 'react';
55
+ import { useEffect, useMemo, useState } from 'react';
52
56
 
53
57
  type PaginationResult<T> = {
54
58
  data: T[];
@@ -129,20 +133,57 @@ type ViewMode = 'cards' | 'table';
129
133
 
130
134
  const DEFAULT_PAGE_SIZES = [6, 12, 24, 48, 96] as const;
131
135
 
136
+ /**
137
+ * "Delivery" fica de fora: é um badge composto, agregado a partir da relação
138
+ * `mail_sent_user` no service — não é coluna que o backend saiba ordenar. Ver
139
+ * `MAIL_SENT_SORT` em `libraries/core/src/mail-sent/mail-sent.sort.ts`.
140
+ */
141
+ type MailSentSortField = 'id' | 'subject' | 'from' | 'to' | 'created_at';
142
+
143
+ const SORT_COLUMNS = [
144
+ 'id',
145
+ 'subject',
146
+ 'from',
147
+ 'to',
148
+ { field: 'created_at', initialOrder: 'desc' },
149
+ ] as const satisfies readonly SortableColumn<MailSentSortField>[];
150
+
132
151
  export default function MailLogPage() {
133
152
  const t = useTranslations('core.MailLog');
134
153
  const [selectedLog, setSelectedLog] = useState<MailSent | null>(null);
135
154
  const [isDetailSheetOpen, setIsDetailSheetOpen] = useState(false);
136
- const [searchTerm, setSearchTerm] = useState('');
137
- const [recipientEmail, setRecipientEmail] = useState('');
138
- const [statusFilter, setStatusFilter] = useState<DeliveryStatusFilter>('all');
139
- const [hasErrorFilter, setHasErrorFilter] = useState<HasErrorFilter>('all');
140
- const [deliveryFilter, setDeliveryFilter] =
141
- useState<DeliveryOutcomeFilter>('all');
142
- const [createdAtFrom, setCreatedAtFrom] = useState('');
143
- const [createdAtTo, setCreatedAtTo] = useState('');
155
+ // Busca, filtros e página vivem na URL: voltar do detalhe de um envio
156
+ // recupera a mesma consulta, e o link pode ser passado adiante.
157
+ const urlState = useListUrlState({
158
+ filters: {
159
+ recipient: { param: 'recipient', defaultValue: '' },
160
+ status: { param: 'status', defaultValue: 'all' },
161
+ hasError: { param: 'hasError', defaultValue: 'all' },
162
+ delivery: { param: 'delivery', defaultValue: 'all' },
163
+ createdAtFrom: { param: 'createdAtFrom', defaultValue: '' },
164
+ createdAtTo: { param: 'createdAtTo', defaultValue: '' },
165
+ },
166
+ });
167
+ const {
168
+ search: searchTerm,
169
+ setSearch: setSearchTerm,
170
+ debouncedSearch,
171
+ page,
172
+ setPage,
173
+ } = urlState;
174
+ const statusFilter = urlState.filters.status as DeliveryStatusFilter;
175
+ const hasErrorFilter = urlState.filters.hasError as HasErrorFilter;
176
+ const deliveryFilter = urlState.filters.delivery as DeliveryOutcomeFilter;
177
+ const createdAtFrom = urlState.filters.createdAtFrom;
178
+ const createdAtTo = urlState.filters.createdAtTo;
144
179
  const [viewMode, setViewMode] = useState<ViewMode>('cards');
145
- const debouncedSearch = useDebounce(searchTerm);
180
+
181
+ // O e-mail do destinatário é campo de texto: o input responde na hora e só
182
+ // o valor estabilizado vai para a URL, pra não gravar uma entrada de
183
+ // histórico por tecla digitada.
184
+ const [recipientEmail, setRecipientEmail] = useState(
185
+ () => urlState.filters.recipient
186
+ );
146
187
  const debouncedRecipientEmail = useDebounce(recipientEmail);
147
188
  const { request, getSettingValue } = useApp();
148
189
 
@@ -176,13 +217,25 @@ export default function MailLogPage() {
176
217
  }
177
218
  }, [generalSettings]);
178
219
 
179
- const [page, setPage] = useState(1);
180
220
  const [pageSize, setPageSize] = usePersistedPageSize({
181
221
  storageKey: 'pagination:global:pageSize',
182
222
  defaultValue: 12,
183
223
  allowedValues: pageSizeOptions,
184
224
  });
185
225
 
226
+ useEffect(() => {
227
+ if (debouncedRecipientEmail !== urlState.filters.recipient) {
228
+ urlState.setFilter('recipient', debouncedRecipientEmail);
229
+ }
230
+ // eslint-disable-next-line react-hooks/exhaustive-deps
231
+ }, [debouncedRecipientEmail]);
232
+
233
+ const sort = useTableSort<MailSentSortField>({
234
+ columns: SORT_COLUMNS,
235
+ defaultSort: { field: 'created_at', order: 'desc' },
236
+ onSortChange: () => setPage(1),
237
+ });
238
+
186
239
  const {
187
240
  data: logsResult,
188
241
  refetch: refetchLogs,
@@ -199,6 +252,8 @@ export default function MailLogPage() {
199
252
  createdAtTo,
200
253
  page,
201
254
  pageSize,
255
+ sort.sortField,
256
+ sort.sortOrder,
202
257
  ],
203
258
  queryFn: async () => {
204
259
  const response = await request({
@@ -213,6 +268,8 @@ export default function MailLogPage() {
213
268
  createdAtTo: createdAtTo || undefined,
214
269
  page,
215
270
  pageSize,
271
+ sortField: sort.sortField,
272
+ sortOrder: sort.sortOrder,
216
273
  },
217
274
  });
218
275
  return response.data as PaginationResult<MailSent>;
@@ -225,14 +282,8 @@ export default function MailLogPage() {
225
282
  setIsDetailSheetOpen(true);
226
283
  };
227
284
 
228
- const handleSearchChange = (value: string): void => {
229
- setSearchTerm(value);
230
- setPage(1);
231
- };
232
-
233
285
  const handleRecipientEmailChange = (value: string): void => {
234
286
  setRecipientEmail(value);
235
- setPage(1);
236
287
  };
237
288
 
238
289
  const hasActiveFilters =
@@ -246,11 +297,12 @@ export default function MailLogPage() {
246
297
  const clearFilters = (): void => {
247
298
  setSearchTerm('');
248
299
  setRecipientEmail('');
249
- setStatusFilter('all');
250
- setHasErrorFilter('all');
251
- setCreatedAtFrom('');
252
- setCreatedAtTo('');
253
- setPage(1);
300
+ urlState.setFilter('recipient', '');
301
+ urlState.setFilter('status', 'all');
302
+ urlState.setFilter('hasError', 'all');
303
+ urlState.setFilter('delivery', 'all');
304
+ urlState.setFilter('createdAtFrom', '');
305
+ urlState.setFilter('createdAtTo', '');
254
306
  };
255
307
 
256
308
  const searchControls = useMemo<SearchBarControl[]>(
@@ -259,10 +311,7 @@ export default function MailLogPage() {
259
311
  id: 'status',
260
312
  type: 'select',
261
313
  value: statusFilter,
262
- onChange: (value) => {
263
- setStatusFilter(value as DeliveryStatusFilter);
264
- setPage(1);
265
- },
314
+ onChange: (value) => urlState.setFilter('status', value),
266
315
  placeholder: t('filterByStatus'),
267
316
  options: [
268
317
  { value: 'all', label: t('statusAll') },
@@ -275,10 +324,7 @@ export default function MailLogPage() {
275
324
  id: 'has-error',
276
325
  type: 'select',
277
326
  value: hasErrorFilter,
278
- onChange: (value) => {
279
- setHasErrorFilter(value as HasErrorFilter);
280
- setPage(1);
281
- },
327
+ onChange: (value) => urlState.setFilter('hasError', value),
282
328
  placeholder: t('filterByError'),
283
329
  options: [
284
330
  { value: 'all', label: t('errorAll') },
@@ -290,10 +336,7 @@ export default function MailLogPage() {
290
336
  id: 'delivery-status',
291
337
  type: 'select',
292
338
  value: deliveryFilter,
293
- onChange: (value) => {
294
- setDeliveryFilter(value as DeliveryOutcomeFilter);
295
- setPage(1);
296
- },
339
+ onChange: (value) => urlState.setFilter('delivery', value),
297
340
  placeholder: t('filterByDelivery'),
298
341
  options: [
299
342
  { value: 'all', label: t('deliveryAll') },
@@ -304,28 +347,9 @@ export default function MailLogPage() {
304
347
  { value: 'rejected', label: t('deliveryRejected') },
305
348
  ],
306
349
  },
307
- {
308
- id: 'created-at-from',
309
- type: 'date',
310
- value: createdAtFrom,
311
- onChange: (value) => {
312
- setCreatedAtFrom(value);
313
- setPage(1);
314
- },
315
- max: createdAtTo || undefined,
316
- },
317
- {
318
- id: 'created-at-to',
319
- type: 'date',
320
- value: createdAtTo,
321
- onChange: (value) => {
322
- setCreatedAtTo(value);
323
- setPage(1);
324
- },
325
- min: createdAtFrom || undefined,
326
- },
327
350
  ],
328
- [createdAtFrom, createdAtTo, deliveryFilter, hasErrorFilter, statusFilter, t]
351
+ // eslint-disable-next-line react-hooks/exhaustive-deps
352
+ [deliveryFilter, hasErrorFilter, statusFilter, t]
329
353
  );
330
354
 
331
355
  const summary = useMemo(() => {
@@ -506,7 +530,7 @@ export default function MailLogPage() {
506
530
  <div className="flex-1">
507
531
  <SearchBar
508
532
  searchQuery={searchTerm}
509
- onSearchChange={handleSearchChange}
533
+ onSearchChange={setSearchTerm}
510
534
  onSearch={() => setPage(1)}
511
535
  placeholder={t('searchPlaceholder')}
512
536
  controls={searchControls}
@@ -514,6 +538,15 @@ export default function MailLogPage() {
514
538
  </div>
515
539
 
516
540
  <div className="flex flex-col gap-2 sm:flex-row sm:flex-wrap xl:justify-end">
541
+ <DateRangePicker
542
+ fromDate={createdAtFrom}
543
+ toDate={createdAtTo}
544
+ onFromDateChange={(value) =>
545
+ urlState.setFilter('createdAtFrom', value)
546
+ }
547
+ onToDateChange={(value) => urlState.setFilter('createdAtTo', value)}
548
+ />
549
+
517
550
  <Input
518
551
  value={recipientEmail}
519
552
  onChange={(event) => handleRecipientEmailChange(event.target.value)}
@@ -597,12 +630,27 @@ export default function MailLogPage() {
597
630
  <Table>
598
631
  <TableHeader>
599
632
  <TableRow>
600
- <TableHead>#{t('id')}</TableHead>
601
- <TableHead>{t('subject')}</TableHead>
602
- <TableHead>{t('from')}</TableHead>
603
- <TableHead>{t('to')}</TableHead>
633
+ <SortableTableHead
634
+ label={`#${t('id')}`}
635
+ {...sort.getSortProps('id')}
636
+ />
637
+ <SortableTableHead
638
+ label={t('subject')}
639
+ {...sort.getSortProps('subject')}
640
+ />
641
+ <SortableTableHead
642
+ label={t('from')}
643
+ {...sort.getSortProps('from')}
644
+ />
645
+ <SortableTableHead
646
+ label={t('to')}
647
+ {...sort.getSortProps('to')}
648
+ />
604
649
  <TableHead>{t('delivery')}</TableHead>
605
- <TableHead>{t('createdAt')}</TableHead>
650
+ <SortableTableHead
651
+ label={t('createdAt')}
652
+ {...sort.getSortProps('created_at')}
653
+ />
606
654
  <TableHead className="w-24 text-right">
607
655
  {t('actions')}
608
656
  </TableHead>
@@ -8,7 +8,9 @@ import {
8
8
  PageHeader,
9
9
  PaginationFooter,
10
10
  SearchBar,
11
+ SortableTableHead,
11
12
  } from '@/components/entity-list';
13
+ import type { SortableColumn } from '@/hooks/use-table-sort';
12
14
  import {
13
15
  HtmlContentEditor,
14
16
  isFullHtmlDocument,
@@ -23,7 +25,7 @@ import {
23
25
  AlertDialogHeader,
24
26
  AlertDialogTitle,
25
27
  } from '@/components/ui/alert-dialog';
26
- import { Badge } from '@/components/ui/badge';
28
+ import { Badge, badgeVariants } from '@/components/ui/badge';
27
29
  import { Button } from '@/components/ui/button';
28
30
  import { Checkbox } from '@/components/ui/checkbox';
29
31
  import {
@@ -41,6 +43,11 @@ import {
41
43
  } from '@/components/ui/dropdown-menu';
42
44
  import { Input } from '@/components/ui/input';
43
45
  import { Label } from '@/components/ui/label';
46
+ import {
47
+ Popover,
48
+ PopoverContent,
49
+ PopoverTrigger,
50
+ } from '@/components/ui/popover';
44
51
  import {
45
52
  Select,
46
53
  SelectContent,
@@ -67,6 +74,7 @@ import {
67
74
  import { TagsInput } from '@/components/ui/tags-input';
68
75
  import { usePagination } from '@/hooks/use-pagination';
69
76
  import { formatDate } from '@/lib/format-date';
77
+ import { cn } from '@/lib/utils';
70
78
  import { useApp } from '@hed-hog/next-app-provider';
71
79
  import {
72
80
  AlertCircle,
@@ -104,6 +112,91 @@ interface ImportResponse {
104
112
  templates?: number[];
105
113
  }
106
114
 
115
+ /**
116
+ * Coluna Variáveis da listagem: no máximo 3 badges, sempre numa linha só (sem
117
+ * `flex-wrap`), para a altura da linha da tabela não variar de template para
118
+ * template. O restante fica atrás de um indicador "+X" que abre um popover
119
+ * com a lista completa — `PopoverTrigger` num `<button>` real dá foco e
120
+ * ativação por teclado (Enter/Espaço) de graça, e o `Popover` do Radix já
121
+ * fecha sozinho no Esc e no clique fora.
122
+ */
123
+
124
+ /**
125
+ * A allowlist de `mail` no backend tem so `id`, `slug`, `created_at` e
126
+ * `updated_at`. "Variaveis" e derivado do corpo do template — nao e coluna
127
+ * que o backend saiba ordenar, entao segue como cabecalho comum.
128
+ *
129
+ * "Assunto" mora em `mail_locale.subject` (traduzido). `mail.service.ts` chama
130
+ * `LocaleService.listModelWithLocale`, que nao passa `options.sort` ao
131
+ * `paginate()` — isso mantem ativo o fallback automatico de raw query por
132
+ * campo de locale (`paginateWithLocaleOrdering`), que cobre `subject`.
133
+ */
134
+ type MailSortField = 'slug' | 'subject' | 'updated_at';
135
+
136
+ const SORT_COLUMNS = [
137
+ 'slug',
138
+ 'subject',
139
+ { field: 'updated_at', initialOrder: 'desc' },
140
+ ] as const satisfies readonly SortableColumn<MailSortField>[];
141
+
142
+ function MailVariablesCell({
143
+ variables,
144
+ }: {
145
+ variables: { id?: number | string; name: string }[];
146
+ }) {
147
+ const t = useTranslations('core.MailPage');
148
+ const visible = variables.slice(0, 3);
149
+ const remaining = variables.length - visible.length;
150
+
151
+ return (
152
+ <div
153
+ className="flex flex-nowrap items-center gap-1"
154
+ onClick={(e) => e.stopPropagation()}
155
+ >
156
+ {visible.map((v, index) => (
157
+ <Badge
158
+ key={v.id ?? index}
159
+ variant="secondary"
160
+ className="shrink-0 text-xs"
161
+ >
162
+ {v.name}
163
+ </Badge>
164
+ ))}
165
+ {remaining > 0 && (
166
+ <Popover>
167
+ <PopoverTrigger asChild>
168
+ <button
169
+ type="button"
170
+ className={cn(
171
+ badgeVariants({ variant: 'outline' }),
172
+ 'shrink-0 cursor-pointer'
173
+ )}
174
+ >
175
+ {t('moreVariables', { count: remaining })}
176
+ </button>
177
+ </PopoverTrigger>
178
+ <PopoverContent align="start" className="w-64 p-3">
179
+ <p className="mb-2 text-xs font-medium text-muted-foreground">
180
+ {t('allVariablesTitle')}
181
+ </p>
182
+ <div className="flex flex-wrap gap-1.5">
183
+ {variables.map((v, index) => (
184
+ <Badge
185
+ key={v.id ?? index}
186
+ variant="secondary"
187
+ className="text-xs"
188
+ >
189
+ {v.name}
190
+ </Badge>
191
+ ))}
192
+ </div>
193
+ </PopoverContent>
194
+ </Popover>
195
+ )}
196
+ </div>
197
+ );
198
+ }
199
+
107
200
  /**
108
201
  * Renderiza o preview no servidor, pelo mesmo caminho do envio real
109
202
  * (interpolação Handlebars + layout base), com debounce para não disparar uma
@@ -181,7 +274,13 @@ export default function EmailTemplatesPage() {
181
274
  totalItems,
182
275
  search,
183
276
  setSearch,
184
- } = usePagination({ url: '/mail' });
277
+ sort,
278
+ } = usePagination<MailSortField>({
279
+ url: '/mail',
280
+ orderField: 'slug',
281
+ orderDirection: 'asc',
282
+ sortColumns: SORT_COLUMNS,
283
+ });
185
284
  const [templates, setTemplates] = useState<Mail[]>([]);
186
285
  const [isDialogOpen, setIsDialogOpen] = useState(false);
187
286
  const [isDeleteDialogOpen, setIsDeleteDialogOpen] = useState(false);
@@ -836,10 +935,19 @@ export default function EmailTemplatesPage() {
836
935
  onCheckedChange={handleToggleAll}
837
936
  />
838
937
  </TableHead>
839
- <TableHead>{t('tableSlug')}</TableHead>
840
- <TableHead>{t('tableSubject')}</TableHead>
938
+ <SortableTableHead
939
+ label={t('tableSlug')}
940
+ {...sort.getSortProps('slug')}
941
+ />
942
+ <SortableTableHead
943
+ label={t('tableSubject')}
944
+ {...sort.getSortProps('subject')}
945
+ />
841
946
  <TableHead>{t('tableVariables')}</TableHead>
842
- <TableHead>{t('tableUpdated')}</TableHead>
947
+ <SortableTableHead
948
+ label={t('tableUpdated')}
949
+ {...sort.getSortProps('updated_at')}
950
+ />
843
951
  <TableHead className="text-right">
844
952
  {t('tableActions')}
845
953
  </TableHead>
@@ -867,17 +975,7 @@ export default function EmailTemplatesPage() {
867
975
  </TableCell>
868
976
  <TableCell>{template.subject}</TableCell>
869
977
  <TableCell>
870
- <div className="flex flex-wrap gap-1">
871
- {template.mail_var.map((v, index) => (
872
- <Badge
873
- key={`${template.id}-${v.id}-${index}`}
874
- variant="secondary"
875
- className="text-xs"
876
- >
877
- {v.name}
878
- </Badge>
879
- ))}
880
- </div>
978
+ <MailVariablesCell variables={template.mail_var} />
881
979
  </TableCell>
882
980
  <TableCell className="text-muted-foreground">
883
981
  {formatDate(
@@ -895,7 +993,7 @@ export default function EmailTemplatesPage() {
895
993
  e.stopPropagation();
896
994
  handleDownloadHTML(template);
897
995
  }}
898
- title={t('downloadHTML')}
996
+ tooltip={t('downloadHTML')}
899
997
  >
900
998
  <FileDown className="h-4 w-4" />
901
999
  </Button>
@@ -906,6 +1004,7 @@ export default function EmailTemplatesPage() {
906
1004
  e.stopPropagation();
907
1005
  handleEdit(template);
908
1006
  }}
1007
+ tooltip={t('editTemplate')}
909
1008
  >
910
1009
  <Pencil className="h-4 w-4" />
911
1010
  </Button>
@@ -916,6 +1015,7 @@ export default function EmailTemplatesPage() {
916
1015
  e.stopPropagation();
917
1016
  handleDelete(Number(template.mail_id || template.id));
918
1017
  }}
1018
+ tooltip={t('delete')}
919
1019
  >
920
1020
  <Trash2 className="h-4 w-4 text-destructive" />
921
1021
  </Button>
@@ -966,7 +1066,10 @@ export default function EmailTemplatesPage() {
966
1066
  </div>
967
1067
  </SheetHeader>
968
1068
 
969
- <form onSubmit={handleSubmit} className="flex min-h-0 flex-1 flex-col">
1069
+ <form
1070
+ onSubmit={handleSubmit}
1071
+ className="flex min-h-0 flex-1 flex-col"
1072
+ >
970
1073
  <div className="grid min-h-0 flex-1 grid-cols-1 overflow-y-auto lg:grid-cols-[minmax(260px,320px)_1fr] lg:overflow-hidden">
971
1074
  <div className="space-y-5 border-b px-4 py-4 sm:px-6 lg:min-h-0 lg:overflow-y-auto lg:border-b-0 lg:border-r">
972
1075
  <section className="space-y-3">
@@ -1086,7 +1189,9 @@ export default function EmailTemplatesPage() {
1086
1189
  <HtmlContentEditor
1087
1190
  key={selectedLocaleCode}
1088
1191
  value={formData.body}
1089
- onChange={(value) => setFormData({ ...formData, body: value })}
1192
+ onChange={(value) =>
1193
+ setFormData({ ...formData, body: value })
1194
+ }
1090
1195
  variables={editorVariables}
1091
1196
  previewHtml={previewHtml}
1092
1197
  previewLoading={previewLoading}
@@ -1205,10 +1310,7 @@ export default function EmailTemplatesPage() {
1205
1310
  <div className="space-y-2">
1206
1311
  {formData.variables.map((v, idx) => (
1207
1312
  <div key={idx} className="flex items-center gap-2">
1208
- <Badge
1209
- variant="outline"
1210
- className="font-mono min-w-30"
1211
- >
1313
+ <Badge variant="outline" className="font-mono min-w-30">
1212
1314
  {'{{' + v + '}}'}
1213
1315
  </Badge>
1214
1316
  <Input
@@ -2,7 +2,6 @@
2
2
 
3
3
  import { Button } from '@/components/ui/button';
4
4
  import { ScrollArea } from '@/components/ui/scroll-area';
5
- import { Spinner } from '@/components/ui/spinner';
6
5
  import { Textarea } from '@/components/ui/textarea';
7
6
  import { AnimatePresence, motion } from 'framer-motion';
8
7
  import {
@@ -10,7 +9,6 @@ import {
10
9
  Bot,
11
10
  ChevronDown,
12
11
  ChevronRight,
13
- Loader2,
14
12
  MessageSquare,
15
13
  Paperclip,
16
14
  Plus,
@@ -18,6 +16,7 @@ import {
18
16
  Wrench,
19
17
  X,
20
18
  } from 'lucide-react';
19
+ import { useTranslations } from 'next-intl';
21
20
  import { RefObject, useEffect, useRef, useState } from 'react';
22
21
  import ReactMarkdown from 'react-markdown';
23
22
  import remarkGfm from 'remark-gfm';
@@ -252,6 +251,8 @@ export function ConversationList({
252
251
  onSelect,
253
252
  onDelete,
254
253
  }: ConversationListProps) {
254
+ const t = useTranslations('core.McpChatPage');
255
+
255
256
  if (isLoading) {
256
257
  return (
257
258
  <div className="space-y-2 pt-2 px-2">
@@ -306,6 +307,7 @@ export function ConversationList({
306
307
  e.stopPropagation();
307
308
  onDelete(conv);
308
309
  }}
310
+ tooltip={t('deleteConversation')}
309
311
  >
310
312
  <Trash2 className="h-3 w-3" />
311
313
  </Button>
@@ -456,15 +458,12 @@ export function ChatInput({
456
458
  size="icon"
457
459
  variant="ghost"
458
460
  className="shrink-0 h-10 w-10 rounded-full cursor-pointer border border-border/60 bg-background/85 hover:bg-background"
459
- aria-label={attachLabel}
461
+ tooltip={attachLabel}
460
462
  onClick={handleOpenFilePicker}
461
463
  disabled={disabled || isSending || isUploadingFile}
464
+ loading={isUploadingFile}
462
465
  >
463
- {isUploadingFile ? (
464
- <Loader2 className="h-4 w-4 animate-spin" />
465
- ) : (
466
- <Plus className="h-4 w-4" />
467
- )}
466
+ <Plus className="h-4 w-4" />
468
467
  </Button>
469
468
 
470
469
  <Textarea
@@ -486,15 +485,14 @@ export function ChatInput({
486
485
  <Button
487
486
  size="icon"
488
487
  className="shrink-0 h-10 w-10 rounded-full cursor-pointer"
489
- aria-label={isSending ? sendingLabel : sendLabel}
490
- disabled={disabled || isSending || (!input.trim() && attachments.length === 0)}
488
+ tooltip={isSending ? sendingLabel : sendLabel}
489
+ disabled={
490
+ disabled || isSending || (!input.trim() && attachments.length === 0)
491
+ }
491
492
  onClick={onSend}
493
+ loading={isSending}
492
494
  >
493
- {isSending ? (
494
- <Spinner className="h-4 w-4" aria-label={sendingLabel} />
495
- ) : (
496
- <ArrowUp className="h-4 w-4" />
497
- )}
495
+ <ArrowUp className="h-4 w-4" />
498
496
  </Button>
499
497
  </div>
500
498