@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
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Partículas ignoradas ao escolher o "último sobrenome" — sem isso, "Maria de
3
+ * Souza" viraria "Maria de" em vez de "Maria Souza".
4
+ */
5
+ const NAME_PARTICLES = new Set(['de', 'da', 'do', 'das', 'dos', 'e']);
6
+
7
+ /**
8
+ * Abrevia um nome completo para "primeiro nome + último sobrenome", o formato
9
+ * usado nos templates de e-mail transacional (ex.: `operations-task-assigned`)
10
+ * pra não estampar o nome completo do colaborador — "João Henrique Cunha
11
+ * Rangel" vira "João Rangel".
12
+ *
13
+ * Partículas (de/da/do/das/dos/e) são ignoradas na escolha do último
14
+ * sobrenome, não removidas do nome inteiro — só afetam qual token conta como
15
+ * "o último". Nome com uma palavra só, vazio ou nulo passa como está (nada a
16
+ * abreviar).
17
+ */
18
+ export function abbreviateName(fullName?: string | null): string {
19
+ const trimmed = (fullName ?? '').trim();
20
+ if (!trimmed) {
21
+ return trimmed;
22
+ }
23
+
24
+ const words = trimmed.split(/\s+/);
25
+ if (words.length === 1) {
26
+ return words[0];
27
+ }
28
+
29
+ const firstName = words[0];
30
+
31
+ // Anda de trás pra frente até achar um token que não seja partícula. Se
32
+ // todos os tokens depois do primeiro forem partícula (dado maltratado),
33
+ // cai no primeiro nome sozinho em vez de repetir "João de" ou "João João".
34
+ let lastIndex = words.length - 1;
35
+ while (lastIndex > 0 && NAME_PARTICLES.has(words[lastIndex].toLowerCase())) {
36
+ lastIndex--;
37
+ }
38
+
39
+ if (lastIndex === 0) {
40
+ return firstName;
41
+ }
42
+
43
+ return `${firstName} ${words[lastIndex]}`;
44
+ }
@@ -0,0 +1,56 @@
1
+ import { Transform } from 'class-transformer';
2
+ import { IsDateString, IsOptional } from 'class-validator';
3
+
4
+ /**
5
+ * `?from=yyyy-MM-dd&to=yyyy-MM-dd` — o par padrão de recorte por período de
6
+ * toda listagem nova. Endpoint que já tem nome próprio (`dateFrom`/`dateTo` da
7
+ * fila, `createdAtFrom`/`createdAtTo` do mail-sent, `date_from`/`date_to` do
8
+ * sac) mantém o nome dele: só o que nasce daqui em diante usa `from`/`to`.
9
+ *
10
+ * Composto, e não herdado de `PaginationDTO`, porque quase todo adotante é o
11
+ * **segundo** argumento `@Query()` do controller, ao lado do `@Pagination()` —
12
+ * que descarta tudo que não é paginação. Carregar `page`/`pageSize` junto
13
+ * duplicaria campo que o DTO de filtro não é dono. Onde o DTO de filtro já
14
+ * estende `PaginationDTO`, o jeito de juntar os dois é o `IntersectionType`:
15
+ *
16
+ * ```ts
17
+ * export class ListContractsDto extends IntersectionType(
18
+ * PaginationDTO,
19
+ * DateRangeQueryDTO,
20
+ * ) {}
21
+ * ```
22
+ *
23
+ * Quem traduz este par para o `where` do banco é o `resolveDateRange` /
24
+ * `dateRangeWhere` (`./date-range`).
25
+ */
26
+
27
+ /**
28
+ * O admin manda `?from=` quando o usuário **limpa** o campo. O `@IsOptional()`
29
+ * só pula `null`/`undefined`, então sem isto o campo limpo viraria 400 — uma
30
+ * regressão de tela causada por um parâmetro que nem deveria existir. O
31
+ * `@Transform` roda no `plainToInstance` do `ValidationPipe`, antes do
32
+ * `validate`, então a string vazia nunca chega ao validador.
33
+ */
34
+ const blankToUndefined = ({ value }: { value: unknown }) => {
35
+ const raw = typeof value === 'string' ? value.trim() : value;
36
+
37
+ return raw === '' || raw === null ? undefined : raw;
38
+ };
39
+
40
+ export class DateRangeQueryDTO {
41
+ /** Primeiro dia do recorte, inclusive. `yyyy-MM-dd`. */
42
+ @IsOptional()
43
+ @Transform(blankToUndefined)
44
+ @IsDateString({}, { message: 'from must be a date in the yyyy-MM-dd format' })
45
+ from?: string;
46
+
47
+ /**
48
+ * Último dia do recorte, **inclusive** — é assim que o usuário lê o
49
+ * calendário. Quem converte para o `< to+1d` que o banco precisa é o
50
+ * `resolveDateRange`.
51
+ */
52
+ @IsOptional()
53
+ @Transform(blankToUndefined)
54
+ @IsDateString({}, { message: 'to must be a date in the yyyy-MM-dd format' })
55
+ to?: string;
56
+ }
@@ -0,0 +1,175 @@
1
+ import { addIsoDays, dateRangeWhere, resolveDateRange } from './date-range';
2
+
3
+ describe('resolveDateRange', () => {
4
+ it('devolve null quando não há período', () => {
5
+ expect(resolveDateRange()).toBeNull();
6
+ expect(resolveDateRange('', '')).toBeNull();
7
+ expect(resolveDateRange(null, null)).toBeNull();
8
+ });
9
+
10
+ it('só com `from`, limita apenas o início', () => {
11
+ const range = resolveDateRange('2026-08-01')!;
12
+
13
+ expect(range.gte).toEqual(new Date('2026-08-01T00:00:00.000Z'));
14
+ expect(range.lt).toBeUndefined();
15
+ });
16
+
17
+ it('só com `to`, limita apenas o fim', () => {
18
+ const range = resolveDateRange(undefined, '2026-08-31')!;
19
+
20
+ expect(range.lt).toEqual(new Date('2026-09-01T00:00:00.000Z'));
21
+ expect(range.gte).toBeUndefined();
22
+ });
23
+
24
+ /**
25
+ * O caso que os três serviços erravam: com `lte` + `new Date(to)` o dia 31
26
+ * inteiro ficava de fora, porque `'2026-08-31'` vira o INSTANTE
27
+ * `2026-08-31T00:00:00Z`.
28
+ */
29
+ it('inclui o dia final inteiro', () => {
30
+ const { lt } = resolveDateRange('2026-08-01', '2026-08-31')!;
31
+
32
+ expect(lt).toEqual(new Date('2026-09-01T00:00:00.000Z'));
33
+ expect(new Date('2026-08-31T23:59:59.999Z') < lt!).toBe(true);
34
+ expect(new Date('2026-09-01T00:00:00.000Z') < lt!).toBe(false);
35
+ });
36
+
37
+ it('atravessa a virada do mês e do ano', () => {
38
+ expect(resolveDateRange('2026-12-31', '2026-12-31')!.lt).toEqual(
39
+ new Date('2027-01-01T00:00:00.000Z'),
40
+ );
41
+ });
42
+
43
+ it('cobre o 29 de fevereiro em ano bissexto', () => {
44
+ expect(resolveDateRange('2028-02-28', '2028-02-29')!.lt).toEqual(
45
+ new Date('2028-03-01T00:00:00.000Z'),
46
+ );
47
+ });
48
+
49
+ it('inverte o período digitado de trás pra frente', () => {
50
+ expect(resolveDateRange('2026-08-31', '2026-08-01')).toEqual(
51
+ resolveDateRange('2026-08-01', '2026-08-31'),
52
+ );
53
+ });
54
+
55
+ it('trata data inválida como ausente, sem estourar', () => {
56
+ expect(resolveDateRange('31/08/2026', '2026-08-31')!.gte).toBeUndefined();
57
+ expect(resolveDateRange('2026-13-01')).toBeNull();
58
+ expect(resolveDateRange('2026-02-31')).toBeNull();
59
+ expect(resolveDateRange('ontem')).toBeNull();
60
+ });
61
+
62
+ it('aceita ISO completo e ignora a hora', () => {
63
+ expect(
64
+ resolveDateRange('2026-08-01T13:45:00.000Z', '2026-08-31T09:00:00Z'),
65
+ ).toEqual(resolveDateRange('2026-08-01', '2026-08-31'));
66
+ });
67
+
68
+ it('não limita o fim a agora — período no futuro continua aberto', () => {
69
+ // Contrato vigente, reunião agendada e assinatura a vencer dependem disso.
70
+ const { lt } = resolveDateRange('2099-01-01', '2099-12-31')!;
71
+
72
+ expect(lt).toEqual(new Date('2100-01-01T00:00:00.000Z'));
73
+ expect(lt!.getTime()).toBeGreaterThan(Date.now());
74
+ });
75
+
76
+ it('expõe as strings que o SQL cru precisa', () => {
77
+ const range = resolveDateRange('2026-08-01', '2026-08-31')!;
78
+
79
+ expect(range.fromIso).toBe('2026-08-01');
80
+ expect(range.toExclusiveIso).toBe('2026-09-01');
81
+ });
82
+ });
83
+
84
+ describe('resolveDateRange — fuso', () => {
85
+ it('desloca as bordas para o fuso pedido', () => {
86
+ // Em São Paulo (UTC-3) o dia civil começa às 03:00 UTC.
87
+ const range = resolveDateRange('2026-08-01', '2026-08-31', {
88
+ timezone: 'America/Sao_Paulo',
89
+ })!;
90
+
91
+ expect(range.gte).toEqual(new Date('2026-08-01T03:00:00.000Z'));
92
+ expect(range.lt).toEqual(new Date('2026-09-01T03:00:00.000Z'));
93
+ });
94
+
95
+ /**
96
+ * A armadilha da coluna `@db.Date`: o Prisma manda o parâmetro como `DATE` e
97
+ * o trunca pela leitura UTC. Meia-noite de 01/08 em Tóquio é
98
+ * `2026-07-31T15:00Z`, que truncaria para 31/07 e derrubaria um dia inteiro
99
+ * da consulta, sem erro nenhum. Por isso `dateOnly` ignora o fuso.
100
+ */
101
+ it('mantém `dateOnly` em UTC puro, mesmo com fuso a leste', () => {
102
+ const range = resolveDateRange('2026-08-01', '2026-08-31', {
103
+ timezone: 'Asia/Tokyo',
104
+ })!;
105
+
106
+ expect(range.gte).toEqual(new Date('2026-07-31T15:00:00.000Z'));
107
+ expect(range.dateOnly.gte).toEqual(new Date('2026-08-01T00:00:00.000Z'));
108
+ expect(range.dateOnly.lt).toEqual(new Date('2026-09-01T00:00:00.000Z'));
109
+ });
110
+
111
+ it('acerta a borda na virada do horário de verão', () => {
112
+ // Lisboa entra no horário de verão em 29/03/2026: antes UTC+0, depois +1.
113
+ const range = resolveDateRange('2026-03-28', '2026-03-30', {
114
+ timezone: 'Europe/Lisbon',
115
+ })!;
116
+
117
+ expect(range.gte).toEqual(new Date('2026-03-28T00:00:00.000Z'));
118
+ expect(range.lt).toEqual(new Date('2026-03-30T23:00:00.000Z'));
119
+ });
120
+
121
+ it('cai no UTC quando o fuso é desconhecido', () => {
122
+ expect(
123
+ resolveDateRange('2026-08-01', '2026-08-31', { timezone: 'Nao/Existe' }),
124
+ ).toEqual(resolveDateRange('2026-08-01', '2026-08-31'));
125
+ });
126
+ });
127
+
128
+ describe('addIsoDays', () => {
129
+ it('soma dias de calendário', () => {
130
+ expect(addIsoDays('2026-08-31', 1)).toBe('2026-09-01');
131
+ expect(addIsoDays('2026-12-31', 1)).toBe('2027-01-01');
132
+ expect(addIsoDays('2028-02-28', 1)).toBe('2028-02-29');
133
+ expect(addIsoDays('2026-09-01', -1)).toBe('2026-08-31');
134
+ });
135
+ });
136
+
137
+ describe('dateRangeWhere', () => {
138
+ it('devolve {} sem período, pra espalhar ser sempre seguro', () => {
139
+ expect(dateRangeWhere('created_at')).toEqual({});
140
+ expect(dateRangeWhere('created_at', '', '')).toEqual({});
141
+ expect({ deleted_at: null, ...dateRangeWhere('created_at') }).toEqual({
142
+ deleted_at: null,
143
+ });
144
+ });
145
+
146
+ it('monta o fragmento do Prisma', () => {
147
+ expect(dateRangeWhere('created_at', '2026-08-01', '2026-08-31')).toEqual({
148
+ created_at: {
149
+ gte: new Date('2026-08-01T00:00:00.000Z'),
150
+ lt: new Date('2026-09-01T00:00:00.000Z'),
151
+ },
152
+ });
153
+ });
154
+
155
+ it('usa as bordas UTC puras para coluna de data', () => {
156
+ expect(
157
+ dateRangeWhere('meeting_date', '2026-08-01', '2026-08-31', {
158
+ dateOnly: true,
159
+ timezone: 'America/Sao_Paulo',
160
+ }),
161
+ ).toEqual({
162
+ meeting_date: {
163
+ gte: new Date('2026-08-01T00:00:00.000Z'),
164
+ lt: new Date('2026-09-01T00:00:00.000Z'),
165
+ },
166
+ });
167
+ });
168
+
169
+ it('omite a chave ausente em vez de pô-la como undefined', () => {
170
+ const where = dateRangeWhere('created_at', '2026-08-01');
171
+
172
+ expect(Object.keys(where.created_at)).toEqual(['gte']);
173
+ expect('lt' in where.created_at).toBe(false);
174
+ });
175
+ });
@@ -0,0 +1,246 @@
1
+ /**
2
+ * Tradução única de `?from=yyyy-MM-dd&to=yyyy-MM-dd` para limites comparáveis
3
+ * no banco.
4
+ *
5
+ * A janela é **meio-aberta** — `[from 00:00, to+1d 00:00)` — e nunca inclusiva.
6
+ * `lte new Date('2026-08-31')` compara contra o *instante* `T00:00:00Z` e
7
+ * derruba o dia 31 inteiro; `lte 23:59:59.999` perde o último milissegundo e
8
+ * mente sobre o modelo de dados. A forma meio-aberta é a única que vale igual
9
+ * para coluna `@db.Date` e para coluna `@db.Timestamptz(6)`, sem flag nenhum.
10
+ *
11
+ * Diferenças de propósito para o `resolveRangeWindow` do operations
12
+ * (`libraries/operations/src/services/shared/operations-activity-window.helper.ts`),
13
+ * que serve relatório e não listagem:
14
+ *
15
+ * - sem `from` e sem `to` devolve `null` (= sem recorte), e não o dia de hoje:
16
+ * listagem sem filtro tem de devolver tudo;
17
+ * - **não limita o fim em agora**: reunião de amanhã, contrato que vence em
18
+ * 2027 e assinatura com período à frente são justamente o que essas telas
19
+ * procuram;
20
+ * - aceita janela aberta de um lado só.
21
+ *
22
+ * Os dois hão de convergir, mas depois: aquele alimenta o e-mail do relatório
23
+ * diário e depende do clamp.
24
+ */
25
+
26
+ export interface DateRangeBounds {
27
+ gte?: Date;
28
+ lt?: Date;
29
+ }
30
+
31
+ export interface DateRange {
32
+ /** Início inclusivo, no fuso pedido. Ausente quando só veio `to`. */
33
+ gte?: Date;
34
+ /** Fim EXCLUSIVO (`to` + 1 dia), no fuso pedido. Ausente quando só veio `from`. */
35
+ lt?: Date;
36
+ /**
37
+ * As mesmas bordas em UTC puro — o que uma coluna `@db.Date` entende.
38
+ *
39
+ * O Prisma manda o parâmetro como `DATE` e o trunca pela leitura **UTC** do
40
+ * `Date`. Uma borda deslocada para fuso a leste derruba um dia inteiro sem
41
+ * erro nenhum: meia-noite de 01/09 em `Asia/Tokyo` é `2026-08-31T15:00Z`,
42
+ * que trunca para `2026-08-31`. Coluna de data pura não tem fuso, então
43
+ * converter fuso nela é sempre errado.
44
+ */
45
+ dateOnly: DateRangeBounds;
46
+ /** `yyyy-MM-dd` normalizado, já desinvertido. */
47
+ fromIso?: string;
48
+ /** `to + 1 dia`, para o `< $n::date` do SQL cru. */
49
+ toExclusiveIso?: string;
50
+ }
51
+
52
+ export interface DateRangeOptions {
53
+ /**
54
+ * Fuso IANA das bordas civis; o padrão é UTC, que é o fuso dos pods da API.
55
+ * Só afeta coluna com hora — veja `dateOnly`.
56
+ */
57
+ timezone?: string;
58
+ }
59
+
60
+ /** Tolera ISO completo: só o prefixo `yyyy-MM-dd` interessa. */
61
+ const ISO_DATE_PREFIX = /^(\d{4})-(\d{2})-(\d{2})/;
62
+
63
+ function normalizeTimezone(timezone?: string): string {
64
+ const candidate = String(timezone ?? '').trim();
65
+ if (!candidate) return 'UTC';
66
+
67
+ try {
68
+ new Intl.DateTimeFormat('en-US', { timeZone: candidate });
69
+ return candidate;
70
+ } catch {
71
+ // Fuso inventado não pode derrubar uma listagem: cai no fuso dos pods.
72
+ return 'UTC';
73
+ }
74
+ }
75
+
76
+ function toIsoDate(value?: string | null): string | null {
77
+ const match = ISO_DATE_PREFIX.exec(String(value ?? '').trim());
78
+ if (!match) return null;
79
+
80
+ const [, yearText, monthText, dayText] = match;
81
+ const year = Number(yearText);
82
+ const month = Number(monthText);
83
+ const day = Number(dayText);
84
+
85
+ // `2026-02-31` casa com o regex e o `Date.UTC` o aceita virando 03/03.
86
+ // Só a volta denuncia.
87
+ const probe = new Date(Date.UTC(year, month - 1, day));
88
+ if (
89
+ probe.getUTCFullYear() !== year ||
90
+ probe.getUTCMonth() !== month - 1 ||
91
+ probe.getUTCDate() !== day
92
+ ) {
93
+ return null;
94
+ }
95
+
96
+ return `${yearText}-${monthText}-${dayText}`;
97
+ }
98
+
99
+ /**
100
+ * Soma dias de **calendário**. Somar 86400000 ms a um instante zonado erra o
101
+ * dia em toda virada de horário de verão.
102
+ */
103
+ export function addIsoDays(isoDate: string, days: number): string {
104
+ const [year, month, day] = isoDate.split('-').map(Number);
105
+
106
+ return new Date(Date.UTC(year, month - 1, day + days))
107
+ .toISOString()
108
+ .slice(0, 10);
109
+ }
110
+
111
+ function utcMidnight(isoDate: string): Date {
112
+ return new Date(`${isoDate}T00:00:00.000Z`);
113
+ }
114
+
115
+ /**
116
+ * Deslocamento do fuso, em ms, no instante informado. Formatar a data no fuso
117
+ * e reinterpretar as partes como UTC devolve o offset vigente — inclusive em
118
+ * fuso com horário de verão.
119
+ */
120
+ function timezoneOffsetMs(at: Date, timezone: string): number {
121
+ const parts = new Intl.DateTimeFormat('en-US', {
122
+ timeZone: timezone,
123
+ hour12: false,
124
+ year: 'numeric',
125
+ month: '2-digit',
126
+ day: '2-digit',
127
+ hour: '2-digit',
128
+ minute: '2-digit',
129
+ second: '2-digit',
130
+ }).formatToParts(at);
131
+
132
+ const part = (type: string) =>
133
+ Number(parts.find((item) => item.type === type)?.value ?? 0);
134
+
135
+ const asUtc = Date.UTC(
136
+ part('year'),
137
+ part('month') - 1,
138
+ part('day'),
139
+ // Algumas engines devolvem "24" para a meia-noite em hour12:false.
140
+ part('hour') % 24,
141
+ part('minute'),
142
+ part('second'),
143
+ );
144
+
145
+ return asUtc - at.getTime();
146
+ }
147
+
148
+ /** Meia-noite civil de `isoDate` naquele fuso, como instante UTC. */
149
+ function zonedMidnight(isoDate: string, timezone: string): Date {
150
+ if (timezone === 'UTC') return utcMidnight(isoDate);
151
+
152
+ const naive = Date.parse(`${isoDate}T00:00:00.000Z`);
153
+
154
+ // Duas passadas: a primeira usa o offset do palpite, a segunda o do instante
155
+ // já corrigido — é o que resolve a virada de horário de verão.
156
+ let utc = naive;
157
+ for (let pass = 0; pass < 2; pass += 1) {
158
+ utc = naive - timezoneOffsetMs(new Date(utc), timezone);
159
+ }
160
+
161
+ return new Date(utc);
162
+ }
163
+
164
+ /**
165
+ * Resolve o par `from`/`to` da query.
166
+ *
167
+ * Devolve `null` quando nenhuma das pontas é data utilizável — o que cobre de
168
+ * uma vez "o cliente não filtrou", "o cliente limpou o campo e mandou
169
+ * `?from=`" e "o cliente mandou `31/08/2026`". Filtro ilegível vira "sem
170
+ * filtro", não 500: o `ValidationPipe` barra o que dá para barrar na borda, e
171
+ * aqui dentro a listagem não pode cair.
172
+ *
173
+ * Intervalo invertido é desinvertido: arrastar o calendário de trás para
174
+ * frente não deve devolver lista vazia.
175
+ */
176
+ export function resolveDateRange(
177
+ from?: string | null,
178
+ to?: string | null,
179
+ options: DateRangeOptions = {},
180
+ ): DateRange | null {
181
+ const timezone = normalizeTimezone(options.timezone);
182
+
183
+ let fromIso = toIsoDate(from);
184
+ let toIso = toIsoDate(to);
185
+
186
+ if (!fromIso && !toIso) return null;
187
+
188
+ if (fromIso && toIso && toIso < fromIso) {
189
+ [fromIso, toIso] = [toIso, fromIso];
190
+ }
191
+
192
+ const toExclusiveIso = toIso ? addIsoDays(toIso, 1) : undefined;
193
+
194
+ return {
195
+ gte: fromIso ? zonedMidnight(fromIso, timezone) : undefined,
196
+ lt: toExclusiveIso ? zonedMidnight(toExclusiveIso, timezone) : undefined,
197
+ dateOnly: {
198
+ gte: fromIso ? utcMidnight(fromIso) : undefined,
199
+ lt: toExclusiveIso ? utcMidnight(toExclusiveIso) : undefined,
200
+ },
201
+ fromIso: fromIso ?? undefined,
202
+ toExclusiveIso,
203
+ };
204
+ }
205
+
206
+ export interface DateRangeWhereOptions extends DateRangeOptions {
207
+ /**
208
+ * `true` para coluna `@db.Date`. Usa as bordas UTC puras, que são as únicas
209
+ * que o `DATE` do Postgres trunca para o dia certo.
210
+ */
211
+ dateOnly?: boolean;
212
+ }
213
+
214
+ /**
215
+ * Fragmento pronto para espalhar dentro de um `where` do Prisma:
216
+ *
217
+ * ```ts
218
+ * const where = {
219
+ * deleted_at: null,
220
+ * ...dateRangeWhere('created_at', filters?.from, filters?.to),
221
+ * };
222
+ * ```
223
+ *
224
+ * Devolve `{}` quando não há recorte, então espalhar é sempre seguro e não
225
+ * existe o caminho "montei um `created_at: {}` vazio". As chaves ausentes são
226
+ * omitidas de verdade, não postas como `undefined`.
227
+ */
228
+ export function dateRangeWhere(
229
+ field: string,
230
+ from?: string | null,
231
+ to?: string | null,
232
+ options: DateRangeWhereOptions = {},
233
+ ): Record<string, DateRangeBounds> {
234
+ const range = resolveDateRange(from, to, options);
235
+ if (!range) return {};
236
+
237
+ const source = options.dateOnly
238
+ ? range.dateOnly
239
+ : { gte: range.gte, lt: range.lt };
240
+
241
+ const bounds: DateRangeBounds = {};
242
+ if (source.gte) bounds.gte = source.gte;
243
+ if (source.lt) bounds.lt = source.lt;
244
+
245
+ return Object.keys(bounds).length > 0 ? { [field]: bounds } : {};
246
+ }
@@ -0,0 +1,67 @@
1
+ import { describe, it, expect } from '@jest/globals';
2
+ import { renderTemplate } from './webhook-utils';
3
+
4
+ describe('renderTemplate', () => {
5
+ it('interpola valores simples e aninhados', () => {
6
+ expect(renderTemplate('olá {{name}}', { name: 'João' })).toBe('olá João');
7
+ expect(
8
+ renderTemplate('{{alerts.0.labels.severity}}', {
9
+ alerts: [{ labels: { severity: 'warning' } }],
10
+ }),
11
+ ).toBe('warning');
12
+ });
13
+
14
+ it('percorre listas com each', () => {
15
+ const out = renderTemplate('{{#each alerts}}[{{name}}]{{/each}}', {
16
+ alerts: [{ name: 'a' }, { name: 'b' }],
17
+ });
18
+ expect(out).toBe('[a][b]');
19
+ });
20
+
21
+ // O motivo dos helpers: o payload do Alertmanager traz status "firing" ou
22
+ // "resolved" e a mensagem tem de ser diferente em cada caso.
23
+ it('escolhe o ramo pelo status com o helper eq', () => {
24
+ const tpl = '{{#if (eq status "firing")}}ALERTA{{else}}NORMALIZOU{{/if}}';
25
+ expect(renderTemplate(tpl, { status: 'firing' })).toBe('ALERTA');
26
+ expect(renderTemplate(tpl, { status: 'resolved' })).toBe('NORMALIZOU');
27
+ });
28
+
29
+ it('compara número e string como equivalentes', () => {
30
+ // O payload vem de JSON externo: quem escreve o template não deve precisar
31
+ // saber se o produtor mandou 200 ou "200".
32
+ expect(renderTemplate('{{#if (eq code 200)}}ok{{/if}}', { code: '200' })).toBe('ok');
33
+ expect(renderTemplate('{{#if (eq code "200")}}ok{{/if}}', { code: 200 })).toBe('ok');
34
+ });
35
+
36
+ it('oferece ne, gt e lt', () => {
37
+ expect(renderTemplate('{{#if (ne a "x")}}dif{{/if}}', { a: 'y' })).toBe('dif');
38
+ expect(renderTemplate('{{#if (gt n 5)}}maior{{/if}}', { n: 6 })).toBe('maior');
39
+ expect(renderTemplate('{{#if (lt n 5)}}menor{{/if}}', { n: 4 })).toBe('menor');
40
+ });
41
+
42
+ it('normaliza caixa com upper e lower', () => {
43
+ expect(renderTemplate('{{upper s}}', { s: 'firing' })).toBe('FIRING');
44
+ expect(renderTemplate('{{lower s}}', { s: 'FIRING' })).toBe('firing');
45
+ // Ausente não pode virar "undefined" no meio da mensagem.
46
+ expect(renderTemplate('{{upper ausente}}', {})).toBe('');
47
+ });
48
+
49
+ it('mantém acentos e símbolos quando usa triple stash', () => {
50
+ // O destino é WhatsApp, não HTML: escapar viraria &#x27; na tela do usuário.
51
+ const ctx = { texto: "capacidade 78% — 'atenção'" };
52
+ expect(renderTemplate('{{{texto}}}', ctx)).toBe("capacidade 78% — 'atenção'");
53
+ });
54
+
55
+ it('atravessa objetos e listas preservando os tipos que não são string', () => {
56
+ const out = renderTemplate(
57
+ { titulo: '{{name}}', ativo: true, tentativas: 3, tags: ['{{name}}'] },
58
+ { name: 'x' },
59
+ );
60
+ expect(out).toEqual({ titulo: 'x', ativo: true, tentativas: 3, tags: ['x'] });
61
+ });
62
+
63
+ it('devolve null e undefined sem tentar compilar', () => {
64
+ expect(renderTemplate(null, {})).toBeNull();
65
+ expect(renderTemplate(undefined, {})).toBeUndefined();
66
+ });
67
+ });
@@ -13,6 +13,32 @@ export function hashToken(token: string) {
13
13
  return createHash('sha256').update(token).digest('hex');
14
14
  }
15
15
 
16
+ /**
17
+ * Handlebars puro não compara valores: `{{#if}}` só testa se algo é vazio. Sem
18
+ * isto um template não consegue reagir ao conteúdo do payload — o caso que
19
+ * motivou os helpers foi o webhook do Alertmanager, onde `status` chega como
20
+ * "firing" ou "resolved" e a mensagem precisa ser diferente em cada caso (mandar
21
+ * o texto de alerta quando o problema acabou é pior do que não mandar nada).
22
+ *
23
+ * Registrados uma vez, no import do módulo: `Handlebars.registerHelper` é global
24
+ * e chamá-lo a cada render só repetiria trabalho.
25
+ */
26
+ const HELPERS: Record<string, (...args: any[]) => any> = {
27
+ // `{{#if (eq status "firing")}}`. A comparação é frouxa de propósito: o payload
28
+ // vem de JSON externo, onde 200 e "200" são a mesma coisa para quem escreve o
29
+ // template.
30
+ eq: (a: unknown, b: unknown) => String(a) === String(b),
31
+ ne: (a: unknown, b: unknown) => String(a) !== String(b),
32
+ gt: (a: unknown, b: unknown) => Number(a) > Number(b),
33
+ lt: (a: unknown, b: unknown) => Number(a) < Number(b),
34
+ upper: (value: unknown) => String(value ?? '').toUpperCase(),
35
+ lower: (value: unknown) => String(value ?? '').toLowerCase(),
36
+ };
37
+
38
+ for (const [name, fn] of Object.entries(HELPERS)) {
39
+ Handlebars.registerHelper(name, fn);
40
+ }
41
+
16
42
  export function renderTemplate(source: unknown, context: Record<string, any>) {
17
43
  if (source === undefined || source === null) {
18
44
  return source;