@hed-hog/core 0.0.399 → 0.0.401

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (815) hide show
  1. package/dist/ai/ai-agent.sort.d.ts +6 -0
  2. package/dist/ai/ai-agent.sort.d.ts.map +1 -0
  3. package/dist/ai/ai-agent.sort.js +21 -0
  4. package/dist/ai/ai-agent.sort.js.map +1 -0
  5. package/dist/ai/ai.controller.d.ts +6 -4
  6. package/dist/ai/ai.controller.d.ts.map +1 -1
  7. package/dist/ai/ai.service.d.ts +121 -6
  8. package/dist/ai/ai.service.d.ts.map +1 -1
  9. package/dist/ai/ai.service.js +355 -160
  10. package/dist/ai/ai.service.js.map +1 -1
  11. package/dist/ai-instruction/ai-instruction.service.d.ts.map +1 -1
  12. package/dist/ai-instruction/ai-instruction.service.js +26 -23
  13. package/dist/ai-instruction/ai-instruction.service.js.map +1 -1
  14. package/dist/ai-instruction/ai-instruction.sort.d.ts +16 -0
  15. package/dist/ai-instruction/ai-instruction.sort.d.ts.map +1 -0
  16. package/dist/ai-instruction/ai-instruction.sort.js +32 -0
  17. package/dist/ai-instruction/ai-instruction.sort.js.map +1 -0
  18. package/dist/ai-instruction/ai-prompt-resolver.service.d.ts +12 -0
  19. package/dist/ai-instruction/ai-prompt-resolver.service.d.ts.map +1 -1
  20. package/dist/ai-instruction/ai-prompt-resolver.service.js +26 -0
  21. package/dist/ai-instruction/ai-prompt-resolver.service.js.map +1 -1
  22. package/dist/auth/auth.controller.d.ts +24 -8
  23. package/dist/auth/auth.controller.d.ts.map +1 -1
  24. package/dist/auth/auth.module.d.ts.map +1 -1
  25. package/dist/auth/auth.module.js +8 -1
  26. package/dist/auth/auth.module.js.map +1 -1
  27. package/dist/auth/auth.service.d.ts +72 -25
  28. package/dist/auth/auth.service.d.ts.map +1 -1
  29. package/dist/auth/auth.service.js +41 -4
  30. package/dist/auth/auth.service.js.map +1 -1
  31. package/dist/auth/guards/auth.guard.d.ts +3 -1
  32. package/dist/auth/guards/auth.guard.d.ts.map +1 -1
  33. package/dist/auth/guards/auth.guard.js +12 -3
  34. package/dist/auth/guards/auth.guard.js.map +1 -1
  35. package/dist/authorize/authorize.controller.d.ts +29 -5
  36. package/dist/authorize/authorize.controller.d.ts.map +1 -1
  37. package/dist/authorize/authorize.controller.js +120 -13
  38. package/dist/authorize/authorize.controller.js.map +1 -1
  39. package/dist/authorize/authorize.errors.d.ts +34 -0
  40. package/dist/authorize/authorize.errors.d.ts.map +1 -0
  41. package/dist/authorize/authorize.errors.js +37 -0
  42. package/dist/authorize/authorize.errors.js.map +1 -0
  43. package/dist/authorize/authorize.module.d.ts.map +1 -1
  44. package/dist/authorize/authorize.module.js +6 -1
  45. package/dist/authorize/authorize.module.js.map +1 -1
  46. package/dist/authorize/authorize.service.d.ts +77 -3
  47. package/dist/authorize/authorize.service.d.ts.map +1 -1
  48. package/dist/authorize/authorize.service.js +212 -21
  49. package/dist/authorize/authorize.service.js.map +1 -1
  50. package/dist/authorize/dto/authorize-info.dto.d.ts +10 -1
  51. package/dist/authorize/dto/authorize-info.dto.d.ts.map +1 -1
  52. package/dist/authorize/dto/authorize-info.dto.js +16 -1
  53. package/dist/authorize/dto/authorize-info.dto.js.map +1 -1
  54. package/dist/authorize/dto/consent.dto.d.ts +10 -1
  55. package/dist/authorize/dto/consent.dto.d.ts.map +1 -1
  56. package/dist/authorize/dto/consent.dto.js +16 -1
  57. package/dist/authorize/dto/consent.dto.js.map +1 -1
  58. package/dist/authorize/dto/token.dto.d.ts +12 -0
  59. package/dist/authorize/dto/token.dto.d.ts.map +1 -1
  60. package/dist/authorize/dto/token.dto.js +21 -1
  61. package/dist/authorize/dto/token.dto.js.map +1 -1
  62. package/dist/authorize/oauth-exception.filter.d.ts +17 -0
  63. package/dist/authorize/oauth-exception.filter.d.ts.map +1 -0
  64. package/dist/authorize/oauth-exception.filter.js +54 -0
  65. package/dist/authorize/oauth-exception.filter.js.map +1 -0
  66. package/dist/authorize/oauth-metadata.service.d.ts +39 -0
  67. package/dist/authorize/oauth-metadata.service.d.ts.map +1 -0
  68. package/dist/authorize/oauth-metadata.service.js +81 -0
  69. package/dist/authorize/oauth-metadata.service.js.map +1 -0
  70. package/dist/authorize/well-known.controller.d.ts +67 -0
  71. package/dist/authorize/well-known.controller.d.ts.map +1 -0
  72. package/dist/authorize/well-known.controller.js +126 -0
  73. package/dist/authorize/well-known.controller.js.map +1 -0
  74. package/dist/captcha/captcha.service.d.ts +32 -2
  75. package/dist/captcha/captcha.service.d.ts.map +1 -1
  76. package/dist/captcha/captcha.service.js +85 -12
  77. package/dist/captcha/captcha.service.js.map +1 -1
  78. package/dist/challenge/challenge.service.d.ts +2 -2
  79. package/dist/core.module.d.ts.map +1 -1
  80. package/dist/core.module.js +9 -0
  81. package/dist/core.module.js.map +1 -1
  82. package/dist/dashboard/dashboard/dashboard.controller.d.ts +9 -9
  83. package/dist/dashboard/dashboard/dashboard.service.d.ts +9 -9
  84. package/dist/dashboard/dashboard-component/dashboard-component.controller.d.ts +3 -3
  85. package/dist/dashboard/dashboard-component/dashboard-component.service.d.ts +3 -3
  86. package/dist/dashboard/dashboard-component-role/dashboard-component-role.controller.d.ts +3 -3
  87. package/dist/dashboard/dashboard-component-role/dashboard-component-role.service.d.ts +3 -3
  88. package/dist/dashboard/dashboard-component-role/dashboard-component-role.service.d.ts.map +1 -1
  89. package/dist/dashboard/dashboard-component-role/dashboard-component-role.service.js +2 -4
  90. package/dist/dashboard/dashboard-component-role/dashboard-component-role.service.js.map +1 -1
  91. package/dist/dashboard/dashboard-component-role/dashboard-component-role.sort.d.ts +8 -0
  92. package/dist/dashboard/dashboard-component-role/dashboard-component-role.sort.d.ts.map +1 -0
  93. package/dist/dashboard/dashboard-component-role/dashboard-component-role.sort.js +18 -0
  94. package/dist/dashboard/dashboard-component-role/dashboard-component-role.sort.js.map +1 -0
  95. package/dist/dashboard/dashboard-item/dashboard-item.service.d.ts.map +1 -1
  96. package/dist/dashboard/dashboard-item/dashboard-item.service.js +2 -4
  97. package/dist/dashboard/dashboard-item/dashboard-item.service.js.map +1 -1
  98. package/dist/dashboard/dashboard-item/dashboard-item.sort.d.ts +9 -0
  99. package/dist/dashboard/dashboard-item/dashboard-item.sort.d.ts.map +1 -0
  100. package/dist/dashboard/dashboard-item/dashboard-item.sort.js +19 -0
  101. package/dist/dashboard/dashboard-item/dashboard-item.sort.js.map +1 -0
  102. package/dist/dashboard/dashboard-role/dashboard-role.controller.d.ts +3 -3
  103. package/dist/dashboard/dashboard-role/dashboard-role.service.d.ts +3 -3
  104. package/dist/dashboard/dashboard-role/dashboard-role.service.d.ts.map +1 -1
  105. package/dist/dashboard/dashboard-role/dashboard-role.service.js +2 -4
  106. package/dist/dashboard/dashboard-role/dashboard-role.service.js.map +1 -1
  107. package/dist/dashboard/dashboard-role/dashboard-role.sort.d.ts +8 -0
  108. package/dist/dashboard/dashboard-role/dashboard-role.sort.d.ts.map +1 -0
  109. package/dist/dashboard/dashboard-role/dashboard-role.sort.js +16 -0
  110. package/dist/dashboard/dashboard-role/dashboard-role.sort.js.map +1 -0
  111. package/dist/document-kit/document-kit.module.d.ts +3 -0
  112. package/dist/document-kit/document-kit.module.d.ts.map +1 -0
  113. package/dist/document-kit/document-kit.module.js +24 -0
  114. package/dist/document-kit/document-kit.module.js.map +1 -0
  115. package/dist/document-kit/document-kit.registry.d.ts +55 -0
  116. package/dist/document-kit/document-kit.registry.d.ts.map +1 -0
  117. package/dist/document-kit/document-kit.registry.js +91 -0
  118. package/dist/document-kit/document-kit.registry.js.map +1 -0
  119. package/dist/document-kit/document-kit.service.d.ts +49 -0
  120. package/dist/document-kit/document-kit.service.d.ts.map +1 -0
  121. package/dist/document-kit/document-kit.service.js +135 -0
  122. package/dist/document-kit/document-kit.service.js.map +1 -0
  123. package/dist/file/file-upload-ticket.service.d.ts +160 -0
  124. package/dist/file/file-upload-ticket.service.d.ts.map +1 -0
  125. package/dist/file/file-upload-ticket.service.js +382 -0
  126. package/dist/file/file-upload-ticket.service.js.map +1 -0
  127. package/dist/file/file.controller.d.ts +24 -1
  128. package/dist/file/file.controller.d.ts.map +1 -1
  129. package/dist/file/file.controller.js +63 -2
  130. package/dist/file/file.controller.js.map +1 -1
  131. package/dist/file/file.module.d.ts.map +1 -1
  132. package/dist/file/file.module.js +14 -2
  133. package/dist/file/file.module.js.map +1 -1
  134. package/dist/file/file.service.d.ts +197 -7
  135. package/dist/file/file.service.d.ts.map +1 -1
  136. package/dist/file/file.service.js +438 -78
  137. package/dist/file/file.service.js.map +1 -1
  138. package/dist/file/filename-encoding.util.d.ts +24 -0
  139. package/dist/file/filename-encoding.util.d.ts.map +1 -0
  140. package/dist/file/filename-encoding.util.js +63 -0
  141. package/dist/file/filename-encoding.util.js.map +1 -0
  142. package/dist/file/image-optimization.service.d.ts +27 -0
  143. package/dist/file/image-optimization.service.d.ts.map +1 -1
  144. package/dist/file/image-optimization.service.js +63 -14
  145. package/dist/file/image-optimization.service.js.map +1 -1
  146. package/dist/file/mcp-file-source.schema.d.ts +33 -0
  147. package/dist/file/mcp-file-source.schema.d.ts.map +1 -0
  148. package/dist/file/mcp-file-source.schema.js +78 -0
  149. package/dist/file/mcp-file-source.schema.js.map +1 -0
  150. package/dist/file/mcp-file-source.service.d.ts +124 -0
  151. package/dist/file/mcp-file-source.service.d.ts.map +1 -0
  152. package/dist/file/mcp-file-source.service.js +262 -0
  153. package/dist/file/mcp-file-source.service.js.map +1 -0
  154. package/dist/file/mimetype-sniff.util.d.ts +62 -0
  155. package/dist/file/mimetype-sniff.util.d.ts.map +1 -0
  156. package/dist/file/mimetype-sniff.util.js +226 -0
  157. package/dist/file/mimetype-sniff.util.js.map +1 -0
  158. package/dist/file/remote-fetch.util.d.ts +35 -0
  159. package/dist/file/remote-fetch.util.d.ts.map +1 -0
  160. package/dist/file/remote-fetch.util.js +236 -0
  161. package/dist/file/remote-fetch.util.js.map +1 -0
  162. package/dist/impersonation/dto/start-impersonation.dto.d.ts +4 -1
  163. package/dist/impersonation/dto/start-impersonation.dto.d.ts.map +1 -1
  164. package/dist/impersonation/dto/start-impersonation.dto.js +1 -1
  165. package/dist/impersonation/dto/start-impersonation.dto.js.map +1 -1
  166. package/dist/impersonation/impersonation.service.d.ts +8 -3
  167. package/dist/impersonation/impersonation.service.d.ts.map +1 -1
  168. package/dist/impersonation/impersonation.service.js +14 -4
  169. package/dist/impersonation/impersonation.service.js.map +1 -1
  170. package/dist/incident/incident.controller.d.ts +2 -1
  171. package/dist/incident/incident.controller.d.ts.map +1 -1
  172. package/dist/incident/incident.controller.js +10 -6
  173. package/dist/incident/incident.controller.js.map +1 -1
  174. package/dist/incident/incident.service.d.ts +2 -0
  175. package/dist/incident/incident.service.d.ts.map +1 -1
  176. package/dist/incident/incident.service.js +4 -0
  177. package/dist/incident/incident.service.js.map +1 -1
  178. package/dist/index.d.ts +22 -0
  179. package/dist/index.d.ts.map +1 -1
  180. package/dist/index.js +22 -0
  181. package/dist/index.js.map +1 -1
  182. package/dist/integration-profile/integration-profile.secrets.d.ts.map +1 -1
  183. package/dist/integration-profile/integration-profile.secrets.js +28 -0
  184. package/dist/integration-profile/integration-profile.secrets.js.map +1 -1
  185. package/dist/integration-profile/integration-profile.service.d.ts +0 -13
  186. package/dist/integration-profile/integration-profile.service.d.ts.map +1 -1
  187. package/dist/integration-profile/integration-profile.service.js +5 -40
  188. package/dist/integration-profile/integration-profile.service.js.map +1 -1
  189. package/dist/integration-profile/integration-profile.utils.js +5 -5
  190. package/dist/integration-profile/integration-profile.utils.js.map +1 -1
  191. package/dist/integration-profile/testers/ai.testers.d.ts.map +1 -1
  192. package/dist/integration-profile/testers/ai.testers.js +46 -8
  193. package/dist/integration-profile/testers/ai.testers.js.map +1 -1
  194. package/dist/integration-profile/testers/index.d.ts.map +1 -1
  195. package/dist/integration-profile/testers/index.js +2 -0
  196. package/dist/integration-profile/testers/index.js.map +1 -1
  197. package/dist/integration-profile/testers/shipping.testers.d.ts +3 -0
  198. package/dist/integration-profile/testers/shipping.testers.d.ts.map +1 -0
  199. package/dist/integration-profile/testers/shipping.testers.js +71 -0
  200. package/dist/integration-profile/testers/shipping.testers.js.map +1 -0
  201. package/dist/locale/locale.controller.d.ts +1 -1
  202. package/dist/locale/locale.service.d.ts +1 -1
  203. package/dist/mail/dto/send.dto.d.ts +6 -1
  204. package/dist/mail/dto/send.dto.d.ts.map +1 -1
  205. package/dist/mail/dto/send.dto.js.map +1 -1
  206. package/dist/mail/mail.service.d.ts +9 -0
  207. package/dist/mail/mail.service.d.ts.map +1 -1
  208. package/dist/mail/mail.service.js +34 -14
  209. package/dist/mail/mail.service.js.map +1 -1
  210. package/dist/mail-sent/mail-sent.controller.d.ts +1 -1
  211. package/dist/mail-sent/mail-sent.service.d.ts +1 -1
  212. package/dist/mail-sent/mail-sent.service.d.ts.map +1 -1
  213. package/dist/mail-sent/mail-sent.service.js +2 -1
  214. package/dist/mail-sent/mail-sent.service.js.map +1 -1
  215. package/dist/mail-sent/mail-sent.sort.d.ts +9 -0
  216. package/dist/mail-sent/mail-sent.sort.d.ts.map +1 -0
  217. package/dist/mail-sent/mail-sent.sort.js +19 -0
  218. package/dist/mail-sent/mail-sent.sort.js.map +1 -0
  219. package/dist/mcp/filters/mcp-challenge.filter.d.ts +20 -0
  220. package/dist/mcp/filters/mcp-challenge.filter.d.ts.map +1 -0
  221. package/dist/mcp/filters/mcp-challenge.filter.js +69 -0
  222. package/dist/mcp/filters/mcp-challenge.filter.js.map +1 -0
  223. package/dist/mcp/guards/mcp-auth.guard.d.ts +4 -1
  224. package/dist/mcp/guards/mcp-auth.guard.d.ts.map +1 -1
  225. package/dist/mcp/guards/mcp-auth.guard.js +19 -5
  226. package/dist/mcp/guards/mcp-auth.guard.js.map +1 -1
  227. package/dist/mcp/guards/mcp-permission.guard.d.ts +25 -3
  228. package/dist/mcp/guards/mcp-permission.guard.d.ts.map +1 -1
  229. package/dist/mcp/guards/mcp-permission.guard.js +46 -26
  230. package/dist/mcp/guards/mcp-permission.guard.js.map +1 -1
  231. package/dist/mcp/mcp-audit.service.d.ts +17 -0
  232. package/dist/mcp/mcp-audit.service.d.ts.map +1 -1
  233. package/dist/mcp/mcp-audit.service.js +32 -3
  234. package/dist/mcp/mcp-audit.service.js.map +1 -1
  235. package/dist/mcp/mcp-permission.service.d.ts +64 -0
  236. package/dist/mcp/mcp-permission.service.d.ts.map +1 -0
  237. package/dist/mcp/mcp-permission.service.js +178 -0
  238. package/dist/mcp/mcp-permission.service.js.map +1 -0
  239. package/dist/mcp/mcp-server.service.d.ts +3 -1
  240. package/dist/mcp/mcp-server.service.d.ts.map +1 -1
  241. package/dist/mcp/mcp-server.service.js +36 -15
  242. package/dist/mcp/mcp-server.service.js.map +1 -1
  243. package/dist/mcp/mcp.controller.d.ts.map +1 -1
  244. package/dist/mcp/mcp.controller.js +10 -2
  245. package/dist/mcp/mcp.controller.js.map +1 -1
  246. package/dist/mcp/mcp.module.d.ts.map +1 -1
  247. package/dist/mcp/mcp.module.js +7 -1
  248. package/dist/mcp/mcp.module.js.map +1 -1
  249. package/dist/mcp/tools/core-access-log.mcp-tools.d.ts +17 -0
  250. package/dist/mcp/tools/core-access-log.mcp-tools.d.ts.map +1 -0
  251. package/dist/mcp/tools/core-access-log.mcp-tools.js +74 -0
  252. package/dist/mcp/tools/core-access-log.mcp-tools.js.map +1 -0
  253. package/dist/mcp/tools/core-ai.mcp-tools.js +2 -9
  254. package/dist/mcp/tools/core-ai.mcp-tools.js.map +1 -1
  255. package/dist/mcp/tools/core-dashboard-items.mcp-tools.js +1 -1
  256. package/dist/mcp/tools/core-dashboard-items.mcp-tools.js.map +1 -1
  257. package/dist/mcp/tools/core-dashboard.mcp-tools.js +2 -9
  258. package/dist/mcp/tools/core-dashboard.mcp-tools.js.map +1 -1
  259. package/dist/mcp/tools/core-event-webhooks.mcp-tools.d.ts.map +1 -1
  260. package/dist/mcp/tools/core-event-webhooks.mcp-tools.js +2 -10
  261. package/dist/mcp/tools/core-event-webhooks.mcp-tools.js.map +1 -1
  262. package/dist/mcp/tools/core-files.mcp-tools.d.ts +17 -5
  263. package/dist/mcp/tools/core-files.mcp-tools.d.ts.map +1 -1
  264. package/dist/mcp/tools/core-files.mcp-tools.js +186 -24
  265. package/dist/mcp/tools/core-files.mcp-tools.js.map +1 -1
  266. package/dist/mcp/tools/core-integration-events.mcp-tools.js +2 -9
  267. package/dist/mcp/tools/core-integration-events.mcp-tools.js.map +1 -1
  268. package/dist/mcp/tools/core-mail-sent.mcp-tools.js +2 -14
  269. package/dist/mcp/tools/core-mail-sent.mcp-tools.js.map +1 -1
  270. package/dist/mcp/tools/core-mail.mcp-tools.js +2 -9
  271. package/dist/mcp/tools/core-mail.mcp-tools.js.map +1 -1
  272. package/dist/mcp/tools/core-menus.mcp-tools.d.ts.map +1 -1
  273. package/dist/mcp/tools/core-menus.mcp-tools.js +2 -10
  274. package/dist/mcp/tools/core-menus.mcp-tools.js.map +1 -1
  275. package/dist/mcp/tools/core-notifications.mcp-tools.d.ts.map +1 -1
  276. package/dist/mcp/tools/core-notifications.mcp-tools.js +0 -1
  277. package/dist/mcp/tools/core-notifications.mcp-tools.js.map +1 -1
  278. package/dist/mcp/tools/core-roles.mcp-tools.d.ts.map +1 -1
  279. package/dist/mcp/tools/core-roles.mcp-tools.js +2 -13
  280. package/dist/mcp/tools/core-roles.mcp-tools.js.map +1 -1
  281. package/dist/mcp/tools/core-routes.mcp-tools.d.ts.map +1 -1
  282. package/dist/mcp/tools/core-routes.mcp-tools.js +2 -11
  283. package/dist/mcp/tools/core-routes.mcp-tools.js.map +1 -1
  284. package/dist/mcp/tools/core-screens.mcp-tools.d.ts.map +1 -1
  285. package/dist/mcp/tools/core-screens.mcp-tools.js +2 -11
  286. package/dist/mcp/tools/core-screens.mcp-tools.js.map +1 -1
  287. package/dist/mcp/tools/core-sessions.mcp-tools.d.ts.map +1 -1
  288. package/dist/mcp/tools/core-sessions.mcp-tools.js +0 -2
  289. package/dist/mcp/tools/core-sessions.mcp-tools.js.map +1 -1
  290. package/dist/mcp/tools/core-settings.mcp-tools.d.ts.map +1 -1
  291. package/dist/mcp/tools/core-settings.mcp-tools.js +2 -10
  292. package/dist/mcp/tools/core-settings.mcp-tools.js.map +1 -1
  293. package/dist/mcp/tools/core-users.mcp-tools.js +2 -9
  294. package/dist/mcp/tools/core-users.mcp-tools.js.map +1 -1
  295. package/dist/mcp/tools/core-webhooks.mcp-tools.d.ts.map +1 -1
  296. package/dist/mcp/tools/core-webhooks.mcp-tools.js +2 -10
  297. package/dist/mcp/tools/core-webhooks.mcp-tools.js.map +1 -1
  298. package/dist/mcp/types/mcp-context.type.d.ts +9 -0
  299. package/dist/mcp/types/mcp-context.type.d.ts.map +1 -1
  300. package/dist/mcp-chat/mcp-chat.service.d.ts.map +1 -1
  301. package/dist/mcp-chat/mcp-chat.service.js +8 -0
  302. package/dist/mcp-chat/mcp-chat.service.js.map +1 -1
  303. package/dist/meeting/meeting-provider.registry.d.ts +187 -0
  304. package/dist/meeting/meeting-provider.registry.d.ts.map +1 -1
  305. package/dist/meeting/meeting-provider.registry.js.map +1 -1
  306. package/dist/meeting/meeting.constants.d.ts +70 -0
  307. package/dist/meeting/meeting.constants.d.ts.map +1 -1
  308. package/dist/meeting/meeting.constants.js +9 -1
  309. package/dist/meeting/meeting.constants.js.map +1 -1
  310. package/dist/menu/menu.service.d.ts.map +1 -1
  311. package/dist/menu/menu.service.js +29 -9
  312. package/dist/menu/menu.service.js.map +1 -1
  313. package/dist/message-template/dto/update-message-template.dto.d.ts +18 -0
  314. package/dist/message-template/dto/update-message-template.dto.d.ts.map +1 -0
  315. package/dist/message-template/dto/update-message-template.dto.js +38 -0
  316. package/dist/message-template/dto/update-message-template.dto.js.map +1 -0
  317. package/dist/message-template/message-template-admin.service.d.ts +70 -0
  318. package/dist/message-template/message-template-admin.service.d.ts.map +1 -0
  319. package/dist/message-template/message-template-admin.service.js +226 -0
  320. package/dist/message-template/message-template-admin.service.js.map +1 -0
  321. package/dist/message-template/message-template.controller.d.ts +29 -0
  322. package/dist/message-template/message-template.controller.d.ts.map +1 -0
  323. package/dist/message-template/message-template.controller.js +101 -0
  324. package/dist/message-template/message-template.controller.js.map +1 -0
  325. package/dist/message-template/message-template.module.d.ts +10 -0
  326. package/dist/message-template/message-template.module.d.ts.map +1 -0
  327. package/dist/message-template/message-template.module.js +33 -0
  328. package/dist/message-template/message-template.module.js.map +1 -0
  329. package/dist/message-template/message-template.registry.d.ts +55 -0
  330. package/dist/message-template/message-template.registry.d.ts.map +1 -0
  331. package/dist/message-template/message-template.registry.js +64 -0
  332. package/dist/message-template/message-template.registry.js.map +1 -0
  333. package/dist/message-template/message-template.service.d.ts +59 -0
  334. package/dist/message-template/message-template.service.d.ts.map +1 -0
  335. package/dist/message-template/message-template.service.js +166 -0
  336. package/dist/message-template/message-template.service.js.map +1 -0
  337. package/dist/notification/notification.constants.d.ts +11 -0
  338. package/dist/notification/notification.constants.d.ts.map +1 -0
  339. package/dist/notification/notification.constants.js +14 -0
  340. package/dist/notification/notification.constants.js.map +1 -0
  341. package/dist/notification/notification.controller.d.ts +20 -20
  342. package/dist/notification/notification.module.d.ts.map +1 -1
  343. package/dist/notification/notification.module.js +3 -0
  344. package/dist/notification/notification.module.js.map +1 -1
  345. package/dist/notification/notification.service.d.ts +33 -21
  346. package/dist/notification/notification.service.d.ts.map +1 -1
  347. package/dist/notification/notification.service.js +36 -2
  348. package/dist/notification/notification.service.js.map +1 -1
  349. package/dist/oauth/oauth-token-broker.service.d.ts +50 -1
  350. package/dist/oauth/oauth-token-broker.service.d.ts.map +1 -1
  351. package/dist/oauth/oauth-token-broker.service.js +105 -3
  352. package/dist/oauth/oauth-token-broker.service.js.map +1 -1
  353. package/dist/oauth/oauth.controller.d.ts +4 -6
  354. package/dist/oauth/oauth.controller.d.ts.map +1 -1
  355. package/dist/oauth/oauth.controller.js +0 -1
  356. package/dist/oauth/oauth.controller.js.map +1 -1
  357. package/dist/oauth/oauth.errors.d.ts +15 -1
  358. package/dist/oauth/oauth.errors.d.ts.map +1 -1
  359. package/dist/oauth/oauth.errors.js +9 -1
  360. package/dist/oauth/oauth.errors.js.map +1 -1
  361. package/dist/oauth/oauth.module.d.ts.map +1 -1
  362. package/dist/oauth/oauth.module.js +6 -1
  363. package/dist/oauth/oauth.module.js.map +1 -1
  364. package/dist/oauth/oauth.service.d.ts +25 -5
  365. package/dist/oauth/oauth.service.d.ts.map +1 -1
  366. package/dist/oauth/oauth.service.js +63 -27
  367. package/dist/oauth/oauth.service.js.map +1 -1
  368. package/dist/oauth/providers/abstract.provider.d.ts +10 -0
  369. package/dist/oauth/providers/abstract.provider.d.ts.map +1 -1
  370. package/dist/oauth/providers/abstract.provider.js +39 -12
  371. package/dist/oauth/providers/abstract.provider.js.map +1 -1
  372. package/dist/oauth/providers/github.provider.d.ts +1 -1
  373. package/dist/oauth/providers/github.provider.d.ts.map +1 -1
  374. package/dist/oauth/providers/github.provider.js +48 -22
  375. package/dist/oauth/providers/github.provider.js.map +1 -1
  376. package/dist/oauth/providers/microsoft-entra-id.provider.d.ts +6 -0
  377. package/dist/oauth/providers/microsoft-entra-id.provider.d.ts.map +1 -1
  378. package/dist/oauth/providers/microsoft-entra-id.provider.js +36 -4
  379. package/dist/oauth/providers/microsoft-entra-id.provider.js.map +1 -1
  380. package/dist/observability/monitored-cron.d.ts +29 -12
  381. package/dist/observability/monitored-cron.d.ts.map +1 -1
  382. package/dist/observability/monitored-cron.js +131 -46
  383. package/dist/observability/monitored-cron.js.map +1 -1
  384. package/dist/pairing/pairing.service.d.ts +6 -2
  385. package/dist/pairing/pairing.service.d.ts.map +1 -1
  386. package/dist/pdf/document/charts/chart-bar.d.ts +24 -0
  387. package/dist/pdf/document/charts/chart-bar.d.ts.map +1 -0
  388. package/dist/pdf/document/charts/chart-bar.js +117 -0
  389. package/dist/pdf/document/charts/chart-bar.js.map +1 -0
  390. package/dist/pdf/document/charts/chart-donut.d.ts +16 -0
  391. package/dist/pdf/document/charts/chart-donut.d.ts.map +1 -0
  392. package/dist/pdf/document/charts/chart-donut.js +89 -0
  393. package/dist/pdf/document/charts/chart-donut.js.map +1 -0
  394. package/dist/pdf/document/charts/chart-gauge.d.ts +15 -0
  395. package/dist/pdf/document/charts/chart-gauge.d.ts.map +1 -0
  396. package/dist/pdf/document/charts/chart-gauge.js +60 -0
  397. package/dist/pdf/document/charts/chart-gauge.js.map +1 -0
  398. package/dist/pdf/document/charts/chart-line.d.ts +29 -0
  399. package/dist/pdf/document/charts/chart-line.d.ts.map +1 -0
  400. package/dist/pdf/document/charts/chart-line.js +89 -0
  401. package/dist/pdf/document/charts/chart-line.js.map +1 -0
  402. package/dist/pdf/document/charts/chart-primitives.d.ts +64 -0
  403. package/dist/pdf/document/charts/chart-primitives.d.ts.map +1 -0
  404. package/dist/pdf/document/charts/chart-primitives.js +110 -0
  405. package/dist/pdf/document/charts/chart-primitives.js.map +1 -0
  406. package/dist/pdf/document/charts/chart-radar.d.ts +13 -0
  407. package/dist/pdf/document/charts/chart-radar.d.ts.map +1 -0
  408. package/dist/pdf/document/charts/chart-radar.js +83 -0
  409. package/dist/pdf/document/charts/chart-radar.js.map +1 -0
  410. package/dist/pdf/document/charts/chart-scale.d.ts +39 -0
  411. package/dist/pdf/document/charts/chart-scale.d.ts.map +1 -0
  412. package/dist/pdf/document/charts/chart-scale.js +118 -0
  413. package/dist/pdf/document/charts/chart-scale.js.map +1 -0
  414. package/dist/pdf/document/charts/index.d.ts +8 -0
  415. package/dist/pdf/document/charts/index.d.ts.map +1 -0
  416. package/dist/pdf/document/charts/index.js +24 -0
  417. package/dist/pdf/document/charts/index.js.map +1 -0
  418. package/dist/pdf/document/index.d.ts +8 -0
  419. package/dist/pdf/document/index.d.ts.map +1 -0
  420. package/dist/pdf/document/index.js +24 -0
  421. package/dist/pdf/document/index.js.map +1 -0
  422. package/dist/pdf/document/pdf-document.chrome.d.ts +20 -0
  423. package/dist/pdf/document/pdf-document.chrome.d.ts.map +1 -0
  424. package/dist/pdf/document/pdf-document.chrome.js +36 -0
  425. package/dist/pdf/document/pdf-document.chrome.js.map +1 -0
  426. package/dist/pdf/document/pdf-document.css.d.ts +20 -0
  427. package/dist/pdf/document/pdf-document.css.d.ts.map +1 -0
  428. package/dist/pdf/document/pdf-document.css.js +239 -0
  429. package/dist/pdf/document/pdf-document.css.js.map +1 -0
  430. package/dist/pdf/document/pdf-document.renderer.d.ts +10 -0
  431. package/dist/pdf/document/pdf-document.renderer.d.ts.map +1 -0
  432. package/dist/pdf/document/pdf-document.renderer.js +153 -0
  433. package/dist/pdf/document/pdf-document.renderer.js.map +1 -0
  434. package/dist/pdf/document/pdf-document.service.d.ts +27 -0
  435. package/dist/pdf/document/pdf-document.service.d.ts.map +1 -0
  436. package/dist/pdf/document/pdf-document.service.js +81 -0
  437. package/dist/pdf/document/pdf-document.service.js.map +1 -0
  438. package/dist/pdf/document/pdf-document.theme.d.ts +41 -0
  439. package/dist/pdf/document/pdf-document.theme.d.ts.map +1 -0
  440. package/dist/pdf/document/pdf-document.theme.js +105 -0
  441. package/dist/pdf/document/pdf-document.theme.js.map +1 -0
  442. package/dist/pdf/document/pdf-document.types.d.ts +108 -0
  443. package/dist/pdf/document/pdf-document.types.d.ts.map +1 -0
  444. package/dist/pdf/document/pdf-document.types.js +18 -0
  445. package/dist/pdf/document/pdf-document.types.js.map +1 -0
  446. package/dist/pdf/pdf.module.d.ts.map +1 -1
  447. package/dist/pdf/pdf.module.js +3 -2
  448. package/dist/pdf/pdf.module.js.map +1 -1
  449. package/dist/pdf/pdf.service.d.ts +69 -1
  450. package/dist/pdf/pdf.service.d.ts.map +1 -1
  451. package/dist/pdf/pdf.service.js +164 -63
  452. package/dist/pdf/pdf.service.js.map +1 -1
  453. package/dist/pdf/templates/commercial-proposal.template.d.ts +96 -0
  454. package/dist/pdf/templates/commercial-proposal.template.d.ts.map +1 -0
  455. package/dist/pdf/templates/commercial-proposal.template.js +276 -0
  456. package/dist/pdf/templates/commercial-proposal.template.js.map +1 -0
  457. package/dist/profile/dto/change-password.dto.d.ts.map +1 -1
  458. package/dist/profile/dto/change-password.dto.js +4 -6
  459. package/dist/profile/dto/change-password.dto.js.map +1 -1
  460. package/dist/profile/profile.controller.d.ts +1 -1
  461. package/dist/profile/profile.service.d.ts +1 -1
  462. package/dist/profile/profile.service.d.ts.map +1 -1
  463. package/dist/profile/profile.service.js +9 -3
  464. package/dist/profile/profile.service.js.map +1 -1
  465. package/dist/realtime/realtime-tick.coalescer.d.ts +34 -0
  466. package/dist/realtime/realtime-tick.coalescer.d.ts.map +1 -0
  467. package/dist/realtime/realtime-tick.coalescer.js +60 -0
  468. package/dist/realtime/realtime-tick.coalescer.js.map +1 -0
  469. package/dist/realtime/realtime.service.d.ts +2 -0
  470. package/dist/realtime/realtime.service.d.ts.map +1 -1
  471. package/dist/realtime/realtime.service.js +22 -2
  472. package/dist/realtime/realtime.service.js.map +1 -1
  473. package/dist/redis/redis-kv.service.d.ts +90 -0
  474. package/dist/redis/redis-kv.service.d.ts.map +1 -0
  475. package/dist/redis/redis-kv.service.js +247 -0
  476. package/dist/redis/redis-kv.service.js.map +1 -0
  477. package/dist/redis/redis-master.d.ts +29 -0
  478. package/dist/redis/redis-master.d.ts.map +1 -0
  479. package/dist/redis/redis-master.js +81 -0
  480. package/dist/redis/redis-master.js.map +1 -0
  481. package/dist/redis/redis-pubsub.d.ts +12 -0
  482. package/dist/redis/redis-pubsub.d.ts.map +1 -1
  483. package/dist/redis/redis-pubsub.js +25 -2
  484. package/dist/redis/redis-pubsub.js.map +1 -1
  485. package/dist/redis/redis.module.d.ts +11 -0
  486. package/dist/redis/redis.module.d.ts.map +1 -0
  487. package/dist/redis/redis.module.js +30 -0
  488. package/dist/redis/redis.module.js.map +1 -0
  489. package/dist/session/session.controller.d.ts +6 -2
  490. package/dist/session/session.controller.d.ts.map +1 -1
  491. package/dist/session/session.service.d.ts +118 -15
  492. package/dist/session/session.service.d.ts.map +1 -1
  493. package/dist/session/session.service.js +251 -77
  494. package/dist/session/session.service.js.map +1 -1
  495. package/dist/setting/favicon.controller.d.ts +26 -0
  496. package/dist/setting/favicon.controller.d.ts.map +1 -0
  497. package/dist/setting/favicon.controller.js +130 -0
  498. package/dist/setting/favicon.controller.js.map +1 -0
  499. package/dist/setting/setting.controller.d.ts +5 -0
  500. package/dist/setting/setting.controller.d.ts.map +1 -1
  501. package/dist/setting/setting.module.d.ts.map +1 -1
  502. package/dist/setting/setting.module.js +2 -1
  503. package/dist/setting/setting.module.js.map +1 -1
  504. package/dist/setting/setting.service.d.ts +7 -0
  505. package/dist/setting/setting.service.d.ts.map +1 -1
  506. package/dist/setting/setting.service.js +38 -3
  507. package/dist/setting/setting.service.js.map +1 -1
  508. package/dist/task/task.service.d.ts +17 -0
  509. package/dist/task/task.service.d.ts.map +1 -1
  510. package/dist/task/task.service.js +48 -13
  511. package/dist/task/task.service.js.map +1 -1
  512. package/dist/token/token.service.d.ts +19 -1
  513. package/dist/token/token.service.d.ts.map +1 -1
  514. package/dist/token/token.service.js +39 -2
  515. package/dist/token/token.service.js.map +1 -1
  516. package/dist/user/user-credential.util.d.ts +10 -0
  517. package/dist/user/user-credential.util.d.ts.map +1 -1
  518. package/dist/user/user-credential.util.js +14 -1
  519. package/dist/user/user-credential.util.js.map +1 -1
  520. package/dist/user/user.service.d.ts +12 -4
  521. package/dist/user/user.service.d.ts.map +1 -1
  522. package/dist/user/user.service.js +2 -11
  523. package/dist/user/user.service.js.map +1 -1
  524. package/dist/user/user.sort.d.ts +16 -0
  525. package/dist/user/user.sort.d.ts.map +1 -0
  526. package/dist/user/user.sort.js +25 -0
  527. package/dist/user/user.sort.js.map +1 -0
  528. package/dist/utils/abbreviate-name.d.ts +13 -0
  529. package/dist/utils/abbreviate-name.d.ts.map +1 -0
  530. package/dist/utils/abbreviate-name.js +42 -0
  531. package/dist/utils/abbreviate-name.js.map +1 -0
  532. package/dist/utils/date-range-query.dto.d.ts +11 -0
  533. package/dist/utils/date-range-query.dto.d.ts.map +1 -0
  534. package/dist/utils/date-range-query.dto.js +63 -0
  535. package/dist/utils/date-range-query.dto.js.map +1 -0
  536. package/dist/utils/date-range.d.ts +96 -0
  537. package/dist/utils/date-range.d.ts.map +1 -0
  538. package/dist/utils/date-range.js +172 -0
  539. package/dist/utils/date-range.js.map +1 -0
  540. package/dist/webhook-integration/webhook-utils.d.ts.map +1 -1
  541. package/dist/webhook-integration/webhook-utils.js +24 -0
  542. package/dist/webhook-integration/webhook-utils.js.map +1 -1
  543. package/dist/whatsapp-sender/whatsapp-recipients.d.ts +49 -0
  544. package/dist/whatsapp-sender/whatsapp-recipients.d.ts.map +1 -0
  545. package/dist/whatsapp-sender/whatsapp-recipients.js +66 -0
  546. package/dist/whatsapp-sender/whatsapp-recipients.js.map +1 -0
  547. package/dist/whatsapp-sender/whatsapp-sender.service.d.ts +25 -0
  548. package/dist/whatsapp-sender/whatsapp-sender.service.d.ts.map +1 -1
  549. package/dist/whatsapp-sender/whatsapp-sender.service.js +71 -7
  550. package/dist/whatsapp-sender/whatsapp-sender.service.js.map +1 -1
  551. package/hedhog/data/integration_provider.yaml +9 -0
  552. package/hedhog/data/integration_type.yaml +12 -0
  553. package/hedhog/data/locale.yaml +0 -1
  554. package/hedhog/data/mail.yaml +2 -2
  555. package/hedhog/data/mail_layout.yaml +6 -3
  556. package/hedhog/data/menu.yaml +25 -5
  557. package/hedhog/data/route.yaml +148 -0
  558. package/hedhog/data/setting_group.yaml +189 -3
  559. package/hedhog/frontend/app/access-log/page.tsx.ejs +47 -53
  560. package/hedhog/frontend/app/account/components/active-sessions.tsx.ejs +33 -8
  561. package/hedhog/frontend/app/account/components/mcp-tokens.tsx.ejs +54 -13
  562. package/hedhog/frontend/app/account/components/mfa-method-card.tsx.ejs +7 -1
  563. package/hedhog/frontend/app/account/components/recovery-codes-dialog.tsx.ejs +1 -0
  564. package/hedhog/frontend/app/account/components/tokens.tsx.ejs +47 -17
  565. package/hedhog/frontend/app/ai_agent/page.tsx.ejs +46 -5
  566. package/hedhog/frontend/app/ai_instruction/_components/ai-instruction-form.tsx.ejs +101 -30
  567. package/hedhog/frontend/app/ai_instruction/_components/ai-instruction-versions.tsx.ejs +24 -8
  568. package/hedhog/frontend/app/ai_instruction/page.tsx.ejs +80 -15
  569. package/hedhog/frontend/app/configurations/[slug]/components/image-optimization-action.tsx.ejs +166 -0
  570. package/hedhog/frontend/app/configurations/[slug]/components/setting-field.test.tsx.ejs +145 -45
  571. package/hedhog/frontend/app/configurations/[slug]/components/setting-field.tsx.ejs +99 -219
  572. package/hedhog/frontend/app/configurations/[slug]/page.tsx.ejs +19 -1
  573. package/hedhog/frontend/app/configurations/layout.tsx.ejs +19 -5
  574. package/hedhog/frontend/app/dashboard/[slug]/widget-renderer.tsx.ejs +2 -8
  575. package/hedhog/frontend/app/dashboard/components/dynamic-widget.tsx.ejs +3 -0
  576. package/hedhog/frontend/app/dashboard/components/widget-wrapper.tsx.ejs +4 -0
  577. package/hedhog/frontend/app/dashboard/dashboard-home-tabs.tsx.ejs +43 -44
  578. package/hedhog/frontend/app/dashboard/management/tabs/component-roles-tab.tsx.ejs +41 -3
  579. package/hedhog/frontend/app/dashboard/management/tabs/components-tab.tsx.ejs +42 -2
  580. package/hedhog/frontend/app/dashboard/management/tabs/dashboard-roles-tab.tsx.ejs +41 -3
  581. package/hedhog/frontend/app/dashboard/management/tabs/dashboards-tab.tsx.ejs +39 -4
  582. package/hedhog/frontend/app/dashboard/management/tabs/items-tab.tsx.ejs +42 -3
  583. package/hedhog/frontend/app/incidents/page.tsx.ejs +60 -31
  584. package/hedhog/frontend/app/integration/profiles/page.tsx.ejs +45 -5
  585. package/hedhog/frontend/app/integrations-webhooks/page.tsx.ejs +92 -15
  586. package/hedhog/frontend/app/mail/log/page.tsx.ejs +109 -61
  587. package/hedhog/frontend/app/mail/template/page.tsx.ejs +125 -23
  588. package/hedhog/frontend/app/mcp_chat/chat-components.tsx.ejs +13 -15
  589. package/hedhog/frontend/app/mcp_chat/page.tsx.ejs +116 -110
  590. package/hedhog/frontend/app/message-templates/_components/message-template-sheet.tsx.ejs +245 -0
  591. package/hedhog/frontend/app/message-templates/_lib/types.ts.ejs +24 -0
  592. package/hedhog/frontend/app/message-templates/page.tsx.ejs +182 -0
  593. package/hedhog/frontend/app/pages/_components/page-wizard-sheet.tsx.ejs +1 -0
  594. package/hedhog/frontend/app/pages/page.tsx.ejs +94 -9
  595. package/hedhog/frontend/app/roles/menus.tsx.ejs +4 -4
  596. package/hedhog/frontend/app/roles/routes.tsx.ejs +4 -4
  597. package/hedhog/frontend/app/roles/users.tsx.ejs +4 -4
  598. package/hedhog/frontend/app/setting-list/page.tsx.ejs +71 -9
  599. package/hedhog/frontend/app/users/page.tsx.ejs +77 -67
  600. package/hedhog/frontend/messages/en.json +237 -37
  601. package/hedhog/frontend/messages/pt.json +237 -37
  602. package/hedhog/table/cron_lock.yaml +17 -0
  603. package/hedhog/table/file.yaml +13 -1
  604. package/hedhog/table/file_upload_chunk.yaml +23 -0
  605. package/hedhog/table/file_upload_ticket.yaml +67 -0
  606. package/hedhog/table/mcp_tool_call_log.yaml +30 -22
  607. package/hedhog/table/message_template.yaml +33 -0
  608. package/hedhog/table/setting.yaml +8 -0
  609. package/hedhog/table/user_session.yaml +36 -1
  610. package/package.json +5 -3
  611. package/src/ai/ai-agent.sort.ts +21 -0
  612. package/src/ai/ai-attachment.fragments.spec.ts +56 -3
  613. package/src/ai/ai.service.responses.spec.ts +429 -0
  614. package/src/ai/ai.service.spec.ts +173 -1
  615. package/src/ai/ai.service.ts +473 -220
  616. package/src/ai-instruction/ai-instruction.service.ts +32 -28
  617. package/src/ai-instruction/ai-instruction.sort.ts +32 -0
  618. package/src/ai-instruction/ai-prompt-resolver.service.spec.ts +44 -0
  619. package/src/ai-instruction/ai-prompt-resolver.service.ts +29 -0
  620. package/src/auth/auth.module.ts +8 -1
  621. package/src/auth/auth.service.spec.ts +108 -1
  622. package/src/auth/auth.service.ts +59 -5
  623. package/src/auth/guards/auth.guard.ts +9 -1
  624. package/src/authorize/authorize.controller.ts +126 -11
  625. package/src/authorize/authorize.errors.ts +55 -0
  626. package/src/authorize/authorize.module.ts +6 -1
  627. package/src/authorize/authorize.service.spec.ts +379 -7
  628. package/src/authorize/authorize.service.ts +309 -23
  629. package/src/authorize/dto/authorize-info.dto.ts +21 -3
  630. package/src/authorize/dto/consent.dto.ts +21 -3
  631. package/src/authorize/dto/token.dto.ts +24 -2
  632. package/src/authorize/oauth-exception.filter.ts +58 -0
  633. package/src/authorize/oauth-metadata.service.ts +67 -0
  634. package/src/authorize/well-known.controller.spec.ts +84 -0
  635. package/src/authorize/well-known.controller.ts +96 -0
  636. package/src/captcha/captcha.service.spec.ts +211 -4
  637. package/src/captcha/captcha.service.ts +127 -10
  638. package/src/core.module.ts +9 -0
  639. package/src/dashboard/dashboard-component-role/dashboard-component-role.service.ts +2 -3
  640. package/src/dashboard/dashboard-component-role/dashboard-component-role.sort.ts +18 -0
  641. package/src/dashboard/dashboard-item/dashboard-item.service.ts +2 -3
  642. package/src/dashboard/dashboard-item/dashboard-item.sort.ts +19 -0
  643. package/src/dashboard/dashboard-role/dashboard-role.service.ts +2 -3
  644. package/src/dashboard/dashboard-role/dashboard-role.sort.ts +16 -0
  645. package/src/document-kit/document-kit.module.ts +12 -0
  646. package/src/document-kit/document-kit.registry.ts +125 -0
  647. package/src/document-kit/document-kit.service.spec.ts +156 -0
  648. package/src/document-kit/document-kit.service.ts +173 -0
  649. package/src/file/file-upload-ticket.service.spec.ts +422 -0
  650. package/src/file/file-upload-ticket.service.ts +513 -0
  651. package/src/file/file.controller.ts +65 -0
  652. package/src/file/file.module.ts +14 -2
  653. package/src/file/file.service.spec.ts +262 -1
  654. package/src/file/file.service.ts +505 -87
  655. package/src/file/filename-encoding.util.spec.ts +54 -0
  656. package/src/file/filename-encoding.util.ts +67 -0
  657. package/src/file/image-optimization.service.spec.ts +156 -19
  658. package/src/file/image-optimization.service.ts +106 -21
  659. package/src/file/mcp-file-source.schema.ts +86 -0
  660. package/src/file/mcp-file-source.service.spec.ts +473 -0
  661. package/src/file/mcp-file-source.service.ts +445 -0
  662. package/src/file/mimetype-sniff.util.spec.ts +126 -0
  663. package/src/file/mimetype-sniff.util.ts +265 -0
  664. package/src/file/remote-fetch.util.spec.ts +117 -0
  665. package/src/file/remote-fetch.util.ts +330 -0
  666. package/src/impersonation/dto/start-impersonation.dto.ts +5 -2
  667. package/src/impersonation/impersonation.service.spec.ts +24 -1
  668. package/src/impersonation/impersonation.service.ts +14 -4
  669. package/src/incident/incident.controller.ts +9 -1
  670. package/src/incident/incident.service.ts +7 -0
  671. package/src/index.ts +23 -1
  672. package/src/integration-profile/integration-profile.secrets.ts +28 -0
  673. package/src/integration-profile/integration-profile.service.ts +7 -64
  674. package/src/integration-profile/integration-profile.utils.spec.ts +9 -0
  675. package/src/integration-profile/integration-profile.utils.ts +5 -5
  676. package/src/integration-profile/testers/ai.testers.ts +70 -5
  677. package/src/integration-profile/testers/index.ts +2 -0
  678. package/src/integration-profile/testers/remaining.testers.spec.ts +144 -1
  679. package/src/integration-profile/testers/shipping.testers.ts +94 -0
  680. package/src/integration-profile/testers/tester-coverage.spec.ts +10 -0
  681. package/src/mail/dto/send.dto.ts +6 -1
  682. package/src/mail/mail-template.spec.ts +58 -1
  683. package/src/mail/mail.service.spec.ts +112 -0
  684. package/src/mail/mail.service.ts +42 -4
  685. package/src/mail-sent/mail-sent.service.ts +3 -0
  686. package/src/mail-sent/mail-sent.sort.ts +19 -0
  687. package/src/mcp/filters/mcp-challenge.filter.spec.ts +76 -0
  688. package/src/mcp/filters/mcp-challenge.filter.ts +70 -0
  689. package/src/mcp/guards/mcp-auth.guard.spec.ts +51 -2
  690. package/src/mcp/guards/mcp-auth.guard.ts +24 -1
  691. package/src/mcp/guards/mcp-permission.guard.spec.ts +109 -15
  692. package/src/mcp/guards/mcp-permission.guard.ts +76 -51
  693. package/src/mcp/mcp-audit.service.spec.ts +107 -0
  694. package/src/mcp/mcp-audit.service.ts +37 -1
  695. package/src/mcp/mcp-permission.service.spec.ts +197 -0
  696. package/src/mcp/mcp-permission.service.ts +184 -0
  697. package/src/mcp/mcp-server.service.spec.ts +84 -2
  698. package/src/mcp/mcp-server.service.ts +111 -87
  699. package/src/mcp/mcp.controller.ts +8 -1
  700. package/src/mcp/mcp.module.ts +7 -1
  701. package/src/mcp/tools/core-access-log.mcp-tools.ts +66 -0
  702. package/src/mcp/tools/core-ai.mcp-tools.ts +1 -1
  703. package/src/mcp/tools/core-dashboard-items.mcp-tools.ts +1 -1
  704. package/src/mcp/tools/core-dashboard.mcp-tools.ts +1 -1
  705. package/src/mcp/tools/core-event-webhooks.mcp-tools.ts +1 -2
  706. package/src/mcp/tools/core-files.mcp-tools.ts +202 -22
  707. package/src/mcp/tools/core-integration-events.mcp-tools.ts +1 -1
  708. package/src/mcp/tools/core-mail-sent.mcp-tools.ts +1 -1
  709. package/src/mcp/tools/core-mail.mcp-tools.ts +1 -1
  710. package/src/mcp/tools/core-menus.mcp-tools.ts +1 -2
  711. package/src/mcp/tools/core-notifications.mcp-tools.ts +0 -1
  712. package/src/mcp/tools/core-roles.mcp-tools.ts +1 -5
  713. package/src/mcp/tools/core-routes.mcp-tools.ts +1 -3
  714. package/src/mcp/tools/core-screens.mcp-tools.ts +1 -3
  715. package/src/mcp/tools/core-sessions.mcp-tools.ts +0 -2
  716. package/src/mcp/tools/core-settings.mcp-tools.ts +1 -2
  717. package/src/mcp/tools/core-users.mcp-tools.ts +1 -1
  718. package/src/mcp/tools/core-webhooks.mcp-tools.ts +1 -2
  719. package/src/mcp/types/mcp-context.type.ts +15 -6
  720. package/src/mcp-chat/mcp-chat.service.ts +8 -0
  721. package/src/meeting/meeting-provider.registry.ts +201 -0
  722. package/src/meeting/meeting.constants.ts +74 -0
  723. package/src/menu/menu.service.spec.ts +89 -0
  724. package/src/menu/menu.service.ts +29 -11
  725. package/src/message-template/dto/update-message-template.dto.ts +22 -0
  726. package/src/message-template/message-template-admin.service.spec.ts +163 -0
  727. package/src/message-template/message-template-admin.service.ts +239 -0
  728. package/src/message-template/message-template.controller.ts +52 -0
  729. package/src/message-template/message-template.module.ts +21 -0
  730. package/src/message-template/message-template.registry.spec.ts +62 -0
  731. package/src/message-template/message-template.registry.ts +125 -0
  732. package/src/message-template/message-template.service.spec.ts +149 -0
  733. package/src/message-template/message-template.service.ts +149 -0
  734. package/src/notification/notification.constants.ts +10 -0
  735. package/src/notification/notification.module.ts +3 -0
  736. package/src/notification/notification.service.spec.ts +75 -1
  737. package/src/notification/notification.service.ts +39 -1
  738. package/src/oauth/oauth-token-broker.service.spec.ts +108 -0
  739. package/src/oauth/oauth-token-broker.service.ts +129 -2
  740. package/src/oauth/oauth.controller.ts +0 -1
  741. package/src/oauth/oauth.errors.ts +7 -0
  742. package/src/oauth/oauth.module.ts +6 -1
  743. package/src/oauth/oauth.service.spec.ts +58 -7
  744. package/src/oauth/oauth.service.ts +71 -32
  745. package/src/oauth/providers/abstract.provider.spec.ts +192 -0
  746. package/src/oauth/providers/abstract.provider.ts +46 -14
  747. package/src/oauth/providers/github.provider.ts +57 -34
  748. package/src/oauth/providers/microsoft-entra-id.provider.spec.ts +133 -0
  749. package/src/oauth/providers/microsoft-entra-id.provider.ts +37 -3
  750. package/src/observability/monitored-cron.spec.ts +164 -31
  751. package/src/observability/monitored-cron.ts +154 -62
  752. package/src/pdf/document/charts/chart-bar.ts +217 -0
  753. package/src/pdf/document/charts/chart-donut.ts +163 -0
  754. package/src/pdf/document/charts/chart-gauge.ts +94 -0
  755. package/src/pdf/document/charts/chart-line.ts +159 -0
  756. package/src/pdf/document/charts/chart-primitives.ts +188 -0
  757. package/src/pdf/document/charts/chart-radar.ts +136 -0
  758. package/src/pdf/document/charts/chart-scale.spec.ts +93 -0
  759. package/src/pdf/document/charts/chart-scale.ts +141 -0
  760. package/src/pdf/document/charts/charts.spec.ts +157 -0
  761. package/src/pdf/document/charts/index.ts +7 -0
  762. package/src/pdf/document/index.ts +7 -0
  763. package/src/pdf/document/pdf-document.chrome.ts +38 -0
  764. package/src/pdf/document/pdf-document.css.ts +238 -0
  765. package/src/pdf/document/pdf-document.renderer.spec.ts +129 -0
  766. package/src/pdf/document/pdf-document.renderer.ts +215 -0
  767. package/src/pdf/document/pdf-document.service.ts +77 -0
  768. package/src/pdf/document/pdf-document.theme.ts +146 -0
  769. package/src/pdf/document/pdf-document.types.ts +97 -0
  770. package/src/pdf/pdf.module.ts +3 -2
  771. package/src/pdf/pdf.service.spec.ts +131 -0
  772. package/src/pdf/pdf.service.ts +245 -82
  773. package/src/pdf/templates/commercial-proposal.template.spec.ts +177 -0
  774. package/src/pdf/templates/commercial-proposal.template.ts +400 -0
  775. package/src/profile/dto/change-password.dto.ts +25 -7
  776. package/src/profile/profile.service.spec.ts +97 -0
  777. package/src/profile/profile.service.ts +9 -3
  778. package/src/realtime/realtime-tick.coalescer.spec.ts +92 -0
  779. package/src/realtime/realtime-tick.coalescer.ts +60 -0
  780. package/src/realtime/realtime.service.spec.ts +33 -0
  781. package/src/realtime/realtime.service.ts +28 -2
  782. package/src/redis/redis-kv.service.ts +261 -0
  783. package/src/redis/redis-master.spec.ts +111 -0
  784. package/src/redis/redis-master.ts +86 -0
  785. package/src/redis/redis-pubsub.ts +27 -3
  786. package/src/redis/redis.module.ts +17 -0
  787. package/src/session/session.service.spec.ts +121 -42
  788. package/src/session/session.service.ts +279 -82
  789. package/src/setting/favicon.controller.spec.ts +92 -0
  790. package/src/setting/favicon.controller.ts +135 -0
  791. package/src/setting/setting.module.ts +2 -1
  792. package/src/setting/setting.service.ts +44 -3
  793. package/src/task/task.service.spec.ts +41 -0
  794. package/src/task/task.service.ts +53 -13
  795. package/src/token/token.service.spec.ts +90 -0
  796. package/src/token/token.service.ts +48 -2
  797. package/src/user/user-credential.util.ts +14 -5
  798. package/src/user/user.service.ts +2 -12
  799. package/src/user/user.sort.ts +25 -0
  800. package/src/utils/abbreviate-name.spec.ts +50 -0
  801. package/src/utils/abbreviate-name.ts +44 -0
  802. package/src/utils/date-range-query.dto.ts +56 -0
  803. package/src/utils/date-range.spec.ts +175 -0
  804. package/src/utils/date-range.ts +246 -0
  805. package/src/webhook-integration/webhook-utils.spec.ts +67 -0
  806. package/src/webhook-integration/webhook-utils.ts +26 -0
  807. package/src/whatsapp-sender/whatsapp-recipients.spec.ts +89 -0
  808. package/src/whatsapp-sender/whatsapp-recipients.ts +83 -0
  809. package/src/whatsapp-sender/whatsapp-sender.service.spec.ts +185 -0
  810. package/src/whatsapp-sender/whatsapp-sender.service.ts +90 -7
  811. package/hedhog/query/device_pairing_request.sql +0 -46
  812. package/hedhog/query/impersonation_grant.sql +0 -71
  813. package/hedhog/query/oauth_authorize_pkce.sql +0 -58
  814. package/hedhog/query/oauth_mobile_state_token.sql +0 -30
  815. package/hedhog/query/oauth_web_ref_token.sql +0 -25
@@ -1,4 +1,5 @@
1
1
  import * as Sentry from '@sentry/nestjs';
2
+ import { randomUUID } from 'node:crypto';
2
3
 
3
4
  export type MonitoredCronOptions = {
4
5
  /** Slug do monitor no Sentry (Crons). */
@@ -9,34 +10,103 @@ export type MonitoredCronOptions = {
9
10
  checkinMarginMinutes?: number;
10
11
  };
11
12
 
12
- /** Fallback só para dimensionar o timeout da transação (ver abaixo) quando um
13
+ /** Fallback só para dimensionar a validade da lease (ver abaixo) quando um
13
14
  * chamador futuro omitir `maxRuntimeMinutes` — os 5 crons atuais sempre informam. */
14
15
  const DEFAULT_MAX_RUNTIME_MINUTES = 5;
15
16
 
16
- /** Folga sobre `maxRuntimeMinutes` para o `timeout` da transação: cobre a
17
- * diferença entre o que o Sentry tolera (`maxRuntime`/`checkinMargin`, que só
18
- * marcam o check-in como perdido) e o que o Prisma de fato aborta. */
19
- const TRANSACTION_TIMEOUT_SLACK_MS = 30_000;
17
+ /** Folga sobre `maxRuntimeMinutes` na validade da lease: cobre a diferença entre o
18
+ * que o Sentry tolera (`maxRuntime`/`checkinMargin`, que só marcam o check-in como
19
+ * perdido) e o instante a partir do qual outro pod pode assumir o tick. */
20
+ const LEASE_SLACK_SECONDS = 30;
20
21
 
21
- /** Tempo esperando conexão do pool para abrir a transação — alinhado ao
22
- * `pool_timeout=20s` que packages/api-prisma/src/datasource-url.ts já aplica
23
- * quando PRISMA_CONNECTION_LIMIT está setado; o default do Prisma (2s) seria
24
- * mais apertado que esse teto que o projeto já escolheu deliberadamente. */
25
- const TRANSACTION_MAX_WAIT_MS = 20_000;
22
+ /**
23
+ * Slugs cujo check-in de Cron Monitoring é de fato emitido, em CSV. `*` libera
24
+ * todos.
25
+ *
26
+ * O plano do Sentry inclui UM monitor de cron e este projeto tem cinco: os quatro
27
+ * que sobram tinham o check-in descartado na entrada por cota ("Usage Exceeded"),
28
+ * e monitor que não recebe check-in não alarma — só marca "missed" para sempre no
29
+ * painel, que é pior do que não existir.
30
+ *
31
+ * A vaga fica com o cron de maior cadência (1 min), porque é o que detecta mais
32
+ * rápido a falha que SÓ o Cron Monitoring pega: o agendador parado em todos os
33
+ * pods. Falha com exceção dos outros quatro continua chegando pela captura no
34
+ * `catch` abaixo, com a tag `cron`.
35
+ */
36
+ const DEFAULT_CRON_MONITOR_SLUGS = 'sac-mailbox-poller';
37
+
38
+ /** Cache pelo valor bruto: a env não muda em runtime, mas o teste troca. */
39
+ let parsedSlugsRaw: string | undefined;
40
+ let parsedSlugs: Set<string> = new Set();
41
+
42
+ function emitsCheckIn(slug: string): boolean {
43
+ const raw = process.env.SENTRY_CRON_MONITOR_SLUGS ?? DEFAULT_CRON_MONITOR_SLUGS;
44
+
45
+ if (raw !== parsedSlugsRaw) {
46
+ parsedSlugsRaw = raw;
47
+ parsedSlugs = new Set(
48
+ raw
49
+ .split(',')
50
+ .map((entry) => entry.trim())
51
+ .filter(Boolean),
52
+ );
53
+ }
54
+
55
+ return parsedSlugs.has('*') || parsedSlugs.has(slug);
56
+ }
57
+
58
+ /**
59
+ * Identidade DESTA execução, não do pod: dois ticks seguidos no mesmo processo
60
+ * precisam de holders diferentes, senão um release atrasado do tick N apagaria a
61
+ * lease que o tick N+1 acabou de tomar.
62
+ */
63
+ function newHolder(): string {
64
+ return `${process.env.HOSTNAME ?? 'local'}:${randomUUID()}`;
65
+ }
66
+
67
+ /**
68
+ * Tenta ganhar o tick com uma ÚNICA statement: quem consegue gravar
69
+ * `locked_until` no futuro venceu, os demais não recebem linha nenhuma de volta.
70
+ * Concorrentes serializam no índice único de `slug` — o perdedor reavalia o
71
+ * `WHERE` já com a linha do vencedor, então nunca há dois vencedores.
72
+ *
73
+ * O relógio de referência é sempre o `now()` do Postgres, dos dois lados: nenhum
74
+ * instante é calculado em JS, então divergência de relógio entre pods não conta.
75
+ */
76
+ async function claimCronTick(
77
+ prisma: any,
78
+ slug: string,
79
+ holder: string,
80
+ leaseSeconds: number,
81
+ ): Promise<boolean> {
82
+ const rows: unknown[] = await prisma.$queryRaw`
83
+ INSERT INTO "cron_lock" ("slug", "holder", "locked_until")
84
+ VALUES (${slug}, ${holder}, now() + make_interval(secs => ${leaseSeconds}::double precision))
85
+ ON CONFLICT ("slug") DO UPDATE
86
+ SET "holder" = EXCLUDED."holder",
87
+ "locked_until" = EXCLUDED."locked_until"
88
+ WHERE "cron_lock"."locked_until" <= now()
89
+ RETURNING 1 AS won
90
+ `;
91
+
92
+ return rows.length > 0;
93
+ }
26
94
 
27
95
  /**
28
- * Tenta ganhar o tick. Roda DENTRO da transação de `runMonitoredCron` —
29
- * reaproveita o MESMO padrão de `pg_try_advisory_xact_lock` já usado em
30
- * cms-scheduled-publisher.service.ts e class-session-reminder.service.ts, mas
31
- * aqui generalizado: a variante `xact` só é liberada no commit/rollback DESSA
32
- * transação, então segurá-la aberta pelo tempo de `work()` é o que de fato
33
- * garante a exclusão mútua entre pods.
96
+ * Devolve o tick antes do fim da lease. Sem isso o `sac-mailbox-poller` (que roda
97
+ * a cada minuto com lease de 2min30) só voltaria a rodar de 3 em 3 minutos.
98
+ *
99
+ * O `holder` no WHERE é o que impede liberar a lease de outra execução: se esta
100
+ * aqui estourou o prazo e outro pod já assumiu, o UPDATE não casa e não faz nada.
34
101
  */
35
- async function claimCronTick(tx: any, slug: string): Promise<boolean> {
36
- const rows: { locked: boolean }[] = await tx.$queryRaw`
37
- SELECT pg_try_advisory_xact_lock(hashtext(${slug})) AS locked
102
+ async function releaseCronTick(prisma: any, slug: string, holder: string): Promise<void> {
103
+ await prisma.$executeRaw`
104
+ UPDATE "cron_lock"
105
+ SET "locked_until" = now()
106
+ WHERE "slug" = ${slug}
107
+ AND "holder" = ${holder}
108
+ AND "locked_until" > now()
38
109
  `;
39
- return rows[0]?.locked === true;
40
110
  }
41
111
 
42
112
  /**
@@ -46,61 +116,83 @@ async function claimCronTick(tx: any, slug: string): Promise<boolean> {
46
116
  * simultaneamente, o Sentry recebe 2×N check-ins por execução e estoura o
47
117
  * rate limit de 6/min por monitor (ver docs/sentry.md).
48
118
  *
49
- * A eleição e `work()` rodam na MESMA transação interativa — é o que faz o
50
- * `pg_try_advisory_xact_lock` valer como exclusão mútua de verdade. Uma
51
- * versão anterior comitava a eleição sozinha (fora de transação): o Postgres
52
- * liberava o lock no instante em que a query retornava, antes do trabalho
53
- * real começar, e pods suficientemente próximos no tempo (o que é comum,
54
- * já que o @Cron dispara no mesmo segundo em todos) "ganhavam" o mesmo tick
55
- * e mandavam check-ins duplicados — foi o que gerou o incidente do
56
- * sac-sla-sweep. `work()` deliberadamente NÃO recebe `tx` (continua fechando
57
- * sobre `this.prisma`/outros serviços do chamador): a conexão que segura o
58
- * lock fica ociosa (idle in transaction) durante o trabalho real, em vez de
59
- * segurar locks de linha por uma chamada HTTP potencialmente longa (ex.:
60
- * renovação de assinatura do Graph, até 10 min).
119
+ * A exclusão mútua é uma LEASE na tabela `cron_lock`, não um lock de banco.
120
+ * Já passamos por duas versões piores:
121
+ *
122
+ * 1. `pg_try_advisory_xact_lock` numa transação que comitava logo em seguida: o
123
+ * Postgres liberava o lock no instante em que a query retornava, antes do
124
+ * trabalho real começar, e pods próximos no tempo (o que é comum, já que o
125
+ * @Cron dispara no mesmo segundo em todos) "ganhavam" o mesmo tick — foi o
126
+ * que gerou o incidente do sac-sla-sweep.
127
+ * 2. O mesmo lock, mas com a transação segurada durante `work()` inteiro. A
128
+ * exclusão passou a valer, ao custo de manter uma conexão do pool em
129
+ * `idle in transaction` por até 10 minutos. Com PRISMA_CONNECTION_LIMIT=5 por
130
+ * pod e cinco crons disputando (um deles de minuto em minuto), o pool
131
+ * esgotava e o próprio cron morria em "Unable to start a transaction in the
132
+ * given time" — o mecanismo de observabilidade consumindo o pool de que ele
133
+ * precisava (Sentry API-1H).
134
+ *
135
+ * A lease resolve as duas: a eleição é uma statement só (conexão devolvida na
136
+ * hora, `work()` roda sem segurar nada) e a validade gravada em `locked_until`
137
+ * é o que mantém os outros pods fora até o dono terminar ou o prazo vencer.
138
+ *
139
+ * Trade-off assumido: se `work()` passar de `maxRuntimeMinutes` + 30s, a lease
140
+ * vence e outro pod pode iniciar uma execução concorrente. A versão anterior
141
+ * abortava a transação no timeout — nenhum dos dois é bom, mas este não leva o
142
+ * pool junto.
61
143
  *
62
144
  * Quando outro pod já ganhou o tick, resolve para `undefined` sem chamar
63
145
  * `work` — não é uma falha, é a mesma semântica de "outro worker já pegou o
64
146
  * job" que a fila customizada já usa.
147
+ *
148
+ * O check-in só é emitido para os slugs de `SENTRY_CRON_MONITOR_SLUGS` (ver
149
+ * `DEFAULT_CRON_MONITOR_SLUGS`): a cota do plano não cobre os cinco monitores, e
150
+ * check-in sem cota é descartado na entrada. Tudo o mais — lease, eleição, span,
151
+ * captura de exceção — é igual para todos os slugs.
65
152
  */
66
153
  export async function runMonitoredCron<T>(
67
154
  prisma: any,
68
155
  options: MonitoredCronOptions,
69
156
  work: () => Promise<T>,
70
157
  ): Promise<T | undefined> {
71
- const timeoutMs =
72
- (options.maxRuntimeMinutes ?? DEFAULT_MAX_RUNTIME_MINUTES) * 60_000 +
73
- TRANSACTION_TIMEOUT_SLACK_MS;
158
+ const leaseSeconds =
159
+ (options.maxRuntimeMinutes ?? DEFAULT_MAX_RUNTIME_MINUTES) * 60 + LEASE_SLACK_SECONDS;
160
+ const holder = newHolder();
74
161
 
75
162
  try {
76
- return await prisma.$transaction(
77
- async (tx: any) => {
78
- if (!(await claimCronTick(tx, options.slug))) return undefined;
79
-
80
- return Sentry.withMonitor(
81
- options.slug,
82
- () => Sentry.startSpan({ name: options.slug, op: 'cron.hedhog' }, work),
83
- {
84
- schedule: { type: 'crontab', value: options.schedule },
85
- timezone: 'America/Sao_Paulo',
86
- ...(options.maxRuntimeMinutes ? { maxRuntime: options.maxRuntimeMinutes } : {}),
87
- ...(options.checkinMarginMinutes ? { checkinMargin: options.checkinMarginMinutes } : {}),
88
- // Distingue cada execução do cron como um trace próprio, em vez de
89
- // herdar/continuar um trace pendurado do ciclo de poll anterior.
90
- isolateTrace: true,
91
- },
92
- );
93
- },
94
- { timeout: timeoutMs, maxWait: TRANSACTION_MAX_WAIT_MS },
95
- );
163
+ if (!(await claimCronTick(prisma, options.slug, holder, leaseSeconds))) return undefined;
164
+
165
+ try {
166
+ const runTraced = () => Sentry.startSpan({ name: options.slug, op: 'cron.hedhog' }, work);
167
+
168
+ // Sem cota de monitor, o check-in seria descartado na entrada — o trabalho,
169
+ // o span e o relato de erro continuam idênticos. `startNewTrace` faz aqui o
170
+ // que o `isolateTrace` do withMonitor faz no outro ramo.
171
+ if (!emitsCheckIn(options.slug)) {
172
+ return await Sentry.startNewTrace(runTraced);
173
+ }
174
+
175
+ return await Sentry.withMonitor(options.slug, runTraced, {
176
+ schedule: { type: 'crontab', value: options.schedule },
177
+ timezone: 'America/Sao_Paulo',
178
+ ...(options.maxRuntimeMinutes ? { maxRuntime: options.maxRuntimeMinutes } : {}),
179
+ ...(options.checkinMarginMinutes ? { checkinMargin: options.checkinMarginMinutes } : {}),
180
+ // Distingue cada execução do cron como um trace próprio, em vez de
181
+ // herdar/continuar um trace pendurado do ciclo de poll anterior.
182
+ isolateTrace: true,
183
+ });
184
+ } finally {
185
+ // Best-effort: uma falha ao devolver a lease não pode virar o erro do cron
186
+ // (o trabalho já foi feito) e nem mascarar o erro real de `work()`. No pior
187
+ // caso a lease expira sozinha em `leaseSeconds`.
188
+ await releaseCronTick(prisma, options.slug, holder).catch(() => undefined);
189
+ }
96
190
  } catch (error) {
97
- // withMonitor já registrou o check-in como 'error' antes de relançar (e um
98
- // erro de work() também derruba a transação por rollback — inofensivo,
99
- // já que nada é escrito via `tx`, só o lock é liberado). O @Cron do
100
- // chamador NUNCA deve rejeitar a partir daqui: a lib `cron` por baixo do
101
- // @nestjs/schedule não garante tratamento de uma rejeição vinda do
102
- // onTick, e o onUnhandledRejectionIntegration({mode:'strict'}) do
103
- // instrument.ts derrubaria o processo por um erro que já está capturado.
191
+ // withMonitor já registrou o check-in como 'error' antes de relançar. O @Cron
192
+ // do chamador NUNCA deve rejeitar a partir daqui: a lib `cron` por baixo do
193
+ // @nestjs/schedule não garante tratamento de uma rejeição vinda do onTick, e
194
+ // o onUnhandledRejectionIntegration({mode:'strict'}) do instrument.ts
195
+ // derrubaria o processo por um erro que já está capturado.
104
196
  Sentry.withScope((scope) => {
105
197
  scope.setTag('cron', options.slug);
106
198
  Sentry.captureException(error, { mechanism: { handled: true, type: 'hedhog.cron' } });
@@ -0,0 +1,217 @@
1
+ import { SafeSvg } from '../pdf-document.types';
2
+ import {
3
+ CHART_DEFAULT_HEIGHT,
4
+ CHART_FONT,
5
+ CHART_FULL_WIDTH,
6
+ ChartBaseOptions,
7
+ ChartSeries,
8
+ chartColor,
9
+ emptyChart,
10
+ legendRows,
11
+ line,
12
+ svgRoot,
13
+ text,
14
+ xAxisLabels,
15
+ yAxis,
16
+ } from './chart-primitives';
17
+ import {
18
+ axisLabelPlan,
19
+ bandScale,
20
+ estimateTextWidth,
21
+ formatNumber,
22
+ linearScale,
23
+ niceScale,
24
+ truncateToWidth,
25
+ } from './chart-scale';
26
+
27
+ const hasData = (series: ChartSeries[]): boolean =>
28
+ series.some((s) => s.values.some((v) => typeof v === 'number' && Number.isFinite(v)));
29
+
30
+ const maxOf = (series: ChartSeries[], stacked: boolean): number => {
31
+ if (!stacked) {
32
+ return series.reduce(
33
+ (max, s) => Math.max(max, ...s.values.map((v) => (typeof v === 'number' ? v : 0))),
34
+ 0,
35
+ );
36
+ }
37
+
38
+ const length = series.reduce((max, s) => Math.max(max, s.values.length), 0);
39
+ let max = 0;
40
+ for (let i = 0; i < length; i += 1) {
41
+ max = Math.max(
42
+ max,
43
+ series.reduce((sum, s) => sum + (typeof s.values[i] === 'number' ? (s.values[i] as number) : 0), 0),
44
+ );
45
+ }
46
+ return max;
47
+ };
48
+
49
+ /** Barras verticais, uma faixa por categoria. */
50
+ export function barChartSvg(
51
+ options: ChartBaseOptions & {
52
+ categories: string[];
53
+ series: ChartSeries[];
54
+ stacked?: boolean;
55
+ yMax?: number;
56
+ yTicks?: number;
57
+ showValues?: boolean;
58
+ legend?: boolean;
59
+ },
60
+ ): SafeSvg {
61
+ const {
62
+ theme,
63
+ categories,
64
+ series,
65
+ stacked = false,
66
+ width = CHART_FULL_WIDTH,
67
+ height = CHART_DEFAULT_HEIGHT,
68
+ valueFormat = (value: number) => formatNumber(value),
69
+ } = options;
70
+
71
+ if (categories.length === 0 || !hasData(series)) return emptyChart(options);
72
+
73
+ const showLegend = options.legend ?? series.length > 1;
74
+ const legendHeight = showLegend ? 16 : 0;
75
+ const plot = { left: 42, right: width - 8, top: 10, bottom: height - 26 - legendHeight };
76
+
77
+ const scale = niceScale(0, options.yMax ?? maxOf(series, stacked), options.yTicks ?? 4);
78
+ const y = linearScale([scale.min, scale.max], [plot.bottom, plot.top]);
79
+ const band = bandScale(categories.length, [plot.left, plot.right]);
80
+
81
+ const parts: string[] = [
82
+ yAxis(scale.ticks, y, plot, theme, valueFormat),
83
+ line(plot.left, plot.bottom, plot.right, plot.bottom, theme.mutedFg),
84
+ ];
85
+
86
+ const groupWidth = stacked ? band.bandwidth : band.bandwidth / series.length;
87
+
88
+ series.forEach((serie, serieIndex) => {
89
+ const color = chartColor(theme, serieIndex, serie.color);
90
+ const stackTops = new Array(categories.length).fill(plot.bottom);
91
+
92
+ categories.forEach((_, index) => {
93
+ const raw = serie.values[index];
94
+ if (typeof raw !== 'number' || !Number.isFinite(raw)) return;
95
+
96
+ const barX = stacked ? band.band(index) : band.band(index) + groupWidth * serieIndex;
97
+ const top = stacked ? stackTops[index] - (plot.bottom - y(raw)) : y(raw);
98
+ const barHeight = Math.max(plot.bottom - y(raw), raw > 0 ? 1 : 0);
99
+
100
+ if (stacked) stackTops[index] = top;
101
+
102
+ parts.push(
103
+ `<rect x="${barX.toFixed(1)}" y="${top.toFixed(1)}" width="${groupWidth.toFixed(1)}" ` +
104
+ `height="${barHeight.toFixed(1)}" fill="${color}" rx="1.5" />`,
105
+ );
106
+
107
+ // O valor só entra quando cabe dentro da largura da barra; senão vira
108
+ // sopa de números sobrepostos.
109
+ if (
110
+ options.showValues &&
111
+ !stacked &&
112
+ estimateTextWidth(valueFormat(raw), CHART_FONT.value) < groupWidth
113
+ ) {
114
+ parts.push(
115
+ text(valueFormat(raw), barX + groupWidth / 2, top - 3, {
116
+ size: CHART_FONT.value,
117
+ fill: theme.ink,
118
+ anchor: 'middle',
119
+ weight: 600,
120
+ }),
121
+ );
122
+ }
123
+ });
124
+ });
125
+
126
+ const plan = axisLabelPlan(categories, band.bandwidth, CHART_FONT.axis);
127
+ parts.push(xAxisLabels(categories, band.center, plot.bottom + 12, plan, band.bandwidth, theme));
128
+
129
+ if (showLegend) {
130
+ const legend = legendRows(
131
+ series.map((serie, index) => ({
132
+ label: serie.name,
133
+ color: chartColor(theme, index, serie.color),
134
+ })),
135
+ width,
136
+ height - 4,
137
+ theme,
138
+ );
139
+ parts.push(legend.markup);
140
+ }
141
+
142
+ return svgRoot(width, height, parts.join(''), options.ariaLabel);
143
+ }
144
+
145
+ /**
146
+ * Barras horizontais — a forma certa quando o rótulo é um nome (curso, aluno),
147
+ * que deitado vira texto girado e ilegível.
148
+ */
149
+ export function horizontalBarChartSvg(
150
+ options: ChartBaseOptions & {
151
+ categories: string[];
152
+ series: ChartSeries[];
153
+ xMax?: number;
154
+ labelWidth?: number;
155
+ showValues?: boolean;
156
+ },
157
+ ): SafeSvg {
158
+ const {
159
+ theme,
160
+ categories,
161
+ series,
162
+ width = CHART_FULL_WIDTH,
163
+ valueFormat = (value: number) => formatNumber(value),
164
+ showValues = true,
165
+ } = options;
166
+
167
+ if (categories.length === 0 || !hasData(series)) return emptyChart(options);
168
+
169
+ const rowHeight = 22;
170
+ const height = options.height ?? Math.max(categories.length * rowHeight + 24, 90);
171
+ const labelWidth = options.labelWidth ?? Math.min(Math.round(width * 0.34), 180);
172
+ const plot = { left: labelWidth + 8, right: width - 38, top: 8, bottom: height - 16 };
173
+
174
+ const scale = niceScale(0, options.xMax ?? maxOf(series, false), 4);
175
+ const x = linearScale([scale.min, scale.max], [plot.left, plot.right]);
176
+ const band = bandScale(categories.length, [plot.top, plot.bottom], 0.25);
177
+
178
+ const parts: string[] = scale.ticks.map((tick) =>
179
+ line(x(tick), plot.top, x(tick), plot.bottom, theme.line),
180
+ );
181
+
182
+ categories.forEach((category, index) => {
183
+ parts.push(
184
+ text(truncateToWidth(category, CHART_FONT.axis + 1, labelWidth), labelWidth, band.center(index) + 3, {
185
+ size: CHART_FONT.axis + 1,
186
+ fill: theme.ink,
187
+ anchor: 'end',
188
+ }),
189
+ );
190
+
191
+ const barHeight = band.bandwidth / series.length;
192
+
193
+ series.forEach((serie, serieIndex) => {
194
+ const raw = serie.values[index];
195
+ if (typeof raw !== 'number' || !Number.isFinite(raw)) return;
196
+
197
+ const barY = band.band(index) + barHeight * serieIndex;
198
+ const barWidth = Math.max(x(raw) - plot.left, raw > 0 ? 1 : 0);
199
+
200
+ parts.push(
201
+ `<rect x="${plot.left}" y="${barY.toFixed(1)}" width="${barWidth.toFixed(1)}" ` +
202
+ `height="${barHeight.toFixed(1)}" fill="${chartColor(theme, serieIndex, serie.color)}" rx="1.5" />`,
203
+ );
204
+
205
+ if (showValues && series.length === 1) {
206
+ parts.push(
207
+ text(valueFormat(raw), plot.left + barWidth + 4, barY + barHeight / 2 + 3, {
208
+ size: CHART_FONT.value,
209
+ fill: theme.mutedFg,
210
+ }),
211
+ );
212
+ }
213
+ });
214
+ });
215
+
216
+ return svgRoot(width, height, parts.join(''), options.ariaLabel);
217
+ }
@@ -0,0 +1,163 @@
1
+ import { SafeSvg } from '../pdf-document.types';
2
+ import {
3
+ CHART_DEFAULT_HEIGHT,
4
+ CHART_FONT,
5
+ CHART_FULL_WIDTH,
6
+ ChartBaseOptions,
7
+ chartColor,
8
+ emptyChart,
9
+ svgRoot,
10
+ text,
11
+ } from './chart-primitives';
12
+ import { estimateTextWidth, formatNumber, truncateToWidth } from './chart-scale';
13
+
14
+ export interface DonutSlice {
15
+ label: string;
16
+ value: number;
17
+ color?: string;
18
+ }
19
+
20
+ const polar = (cx: number, cy: number, radius: number, angle: number) => ({
21
+ x: cx + radius * Math.cos(angle),
22
+ y: cy + radius * Math.sin(angle),
23
+ });
24
+
25
+ /** Setor em anel, desenhado com dois arcos — o `path` é o único jeito no SVG puro. */
26
+ function ringSegment(
27
+ cx: number,
28
+ cy: number,
29
+ outer: number,
30
+ inner: number,
31
+ start: number,
32
+ end: number,
33
+ ): string {
34
+ const largeArc = end - start > Math.PI ? 1 : 0;
35
+ const p1 = polar(cx, cy, outer, start);
36
+ const p2 = polar(cx, cy, outer, end);
37
+ const p3 = polar(cx, cy, inner, end);
38
+ const p4 = polar(cx, cy, inner, start);
39
+
40
+ if (inner <= 0) {
41
+ return (
42
+ `M${cx.toFixed(1)},${cy.toFixed(1)} L${p1.x.toFixed(1)},${p1.y.toFixed(1)} ` +
43
+ `A${outer},${outer} 0 ${largeArc} 1 ${p2.x.toFixed(1)},${p2.y.toFixed(1)} Z`
44
+ );
45
+ }
46
+
47
+ return (
48
+ `M${p1.x.toFixed(1)},${p1.y.toFixed(1)} A${outer},${outer} 0 ${largeArc} 1 ${p2.x.toFixed(1)},${p2.y.toFixed(1)} ` +
49
+ `L${p3.x.toFixed(1)},${p3.y.toFixed(1)} A${inner},${inner} 0 ${largeArc} 0 ${p4.x.toFixed(1)},${p4.y.toFixed(1)} Z`
50
+ );
51
+ }
52
+
53
+ /** Rosca (ou pizza, com `innerRadiusRatio: 0`) com legenda à direita. */
54
+ export function donutChartSvg(
55
+ options: ChartBaseOptions & {
56
+ slices: DonutSlice[];
57
+ innerRadiusRatio?: number;
58
+ centerLabel?: string;
59
+ centerValue?: string;
60
+ showPercent?: boolean;
61
+ },
62
+ ): SafeSvg {
63
+ const {
64
+ theme,
65
+ slices,
66
+ width = CHART_FULL_WIDTH,
67
+ height = CHART_DEFAULT_HEIGHT,
68
+ innerRadiusRatio = 0.62,
69
+ showPercent = true,
70
+ valueFormat = (value: number) => formatNumber(value, 0),
71
+ } = options;
72
+
73
+ const usable = slices.filter((slice) => Number.isFinite(slice.value) && slice.value > 0);
74
+ const total = usable.reduce((sum, slice) => sum + slice.value, 0);
75
+
76
+ if (total <= 0) return emptyChart(options);
77
+
78
+ // A coluna da direita é dimensionada pelo texto que realmente vai nela: o
79
+ // valor ("318 · 76%") fixa a largura mínima, e o que sobra é do rótulo.
80
+ const valueLabels = usable.map((slice) =>
81
+ showPercent
82
+ ? `${valueFormat(slice.value)} · ${Math.round((slice.value / total) * 100)}%`
83
+ : valueFormat(slice.value),
84
+ );
85
+ const valueWidth = Math.max(
86
+ ...valueLabels.map((label) => estimateTextWidth(label, CHART_FONT.legend)),
87
+ );
88
+ // A largura do rótulo é decidida primeiro e a legenda é montada a partir dela.
89
+ // Derivar na ordem inversa (legenda menos valor menos folga) devolve o mesmo
90
+ // número com um epsilon de ponto flutuante a menos, e um rótulo que cabia
91
+ // certinho sai cortado — "Em risco" virava "Em ris…".
92
+ const maxLabelWidth = Math.min(
93
+ Math.max(...usable.map((s) => estimateTextWidth(s.label, CHART_FONT.legend))),
94
+ width * 0.45 - valueWidth - 26,
95
+ );
96
+ const legendWidth = maxLabelWidth + valueWidth + 26;
97
+ const chartWidth = width - legendWidth;
98
+ const radius = Math.min(chartWidth, height) / 2 - 8;
99
+ const cx = chartWidth / 2;
100
+ const cy = height / 2;
101
+ const inner = radius * innerRadiusRatio;
102
+
103
+ const parts: string[] = [];
104
+ // Começa às 12h: é onde o olho procura o início de uma rosca.
105
+ let angle = -Math.PI / 2;
106
+
107
+ usable.forEach((slice, index) => {
108
+ const sweep = (slice.value / total) * Math.PI * 2;
109
+ const color = chartColor(theme, index, slice.color);
110
+
111
+ parts.push(
112
+ `<path d="${ringSegment(cx, cy, radius, inner, angle, angle + sweep)}" fill="${color}" />`,
113
+ );
114
+ angle += sweep;
115
+ });
116
+
117
+ if (inner > 0 && (options.centerValue || options.centerLabel)) {
118
+ if (options.centerValue) {
119
+ parts.push(
120
+ text(options.centerValue, cx, cy + (options.centerLabel ? 0 : 4), {
121
+ size: 16,
122
+ fill: theme.ink,
123
+ anchor: 'middle',
124
+ weight: 700,
125
+ }),
126
+ );
127
+ }
128
+ if (options.centerLabel) {
129
+ parts.push(
130
+ text(options.centerLabel, cx, cy + 12, {
131
+ size: CHART_FONT.axis,
132
+ fill: theme.mutedFg,
133
+ anchor: 'middle',
134
+ }),
135
+ );
136
+ }
137
+ }
138
+
139
+ const legendX = chartWidth + 4;
140
+ const lineHeight = 15;
141
+ const legendTop = cy - (usable.length * lineHeight) / 2 + 8;
142
+
143
+ usable.forEach((slice, index) => {
144
+ const y = legendTop + index * lineHeight;
145
+ const label = truncateToWidth(
146
+ slice.label,
147
+ CHART_FONT.legend,
148
+ maxLabelWidth,
149
+ );
150
+
151
+ parts.push(
152
+ `<rect x="${legendX}" y="${y - 7}" width="8" height="8" rx="2" fill="${chartColor(theme, index, slice.color)}" />`,
153
+ text(label, legendX + 12, y, { size: CHART_FONT.legend, fill: theme.ink }),
154
+ text(valueLabels[index] ?? '', width, y, {
155
+ size: CHART_FONT.legend,
156
+ fill: theme.mutedFg,
157
+ anchor: 'end',
158
+ }),
159
+ );
160
+ });
161
+
162
+ return svgRoot(width, height, parts.join(''), options.ariaLabel);
163
+ }