@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,89 @@
1
+ import { parseWhatsappRecipients, toWhatsappGroupJid } from './whatsapp-recipients';
2
+
3
+ /**
4
+ * O que este parser decide é para ONDE um aviso interno vai. Errar aqui não dá
5
+ * erro: entrega em outro número, ou some em silêncio — os dois modos de falha
6
+ * que o canal existe para evitar.
7
+ */
8
+ describe('toWhatsappGroupJid', () => {
9
+ it('aceita a forma atual, só dígitos com sufixo', () => {
10
+ expect(toWhatsappGroupJid('120363430651137530@g.us')).toBe(
11
+ '120363430651137530@g.us',
12
+ );
13
+ });
14
+
15
+ it('aceita a forma antiga, derivada de quem criou o grupo', () => {
16
+ expect(toWhatsappGroupJid('5511992662104-1564082267@g.us')).toBe(
17
+ '5511992662104-1564082267@g.us',
18
+ );
19
+ });
20
+
21
+ it('completa o sufixo de um id colado sem ele', () => {
22
+ expect(toWhatsappGroupJid('120363430651137530')).toBe(
23
+ '120363430651137530@g.us',
24
+ );
25
+ });
26
+
27
+ it('não confunde telefone com grupo', () => {
28
+ expect(toWhatsappGroupJid('5511999998888')).toBeNull();
29
+ });
30
+
31
+ it('descarta a colagem de dois telefones grudados', () => {
32
+ expect(toWhatsappGroupJid('5511999998888551199999777')).toBeNull();
33
+ });
34
+ });
35
+
36
+ describe('parseWhatsappRecipients', () => {
37
+ it('devolve lista vazia para configuração ausente', () => {
38
+ expect(parseWhatsappRecipients(null)).toEqual([]);
39
+ expect(parseWhatsappRecipients('')).toEqual([]);
40
+ });
41
+
42
+ it('completa o DDI 55 de um número nacional com máscara', () => {
43
+ expect(parseWhatsappRecipients('(11) 99999-8888')).toEqual([
44
+ { to: '5511999998888', targetType: 'phone' },
45
+ ]);
46
+ });
47
+
48
+ it('não acrescenta DDI a quem já veio com um', () => {
49
+ expect(parseWhatsappRecipients('5511999998888')).toEqual([
50
+ { to: '5511999998888', targetType: 'phone' },
51
+ ]);
52
+ });
53
+
54
+ it('separa por vírgula, ponto-e-vírgula e quebra de linha, nunca por espaço', () => {
55
+ // Espaço faz parte da máscara: quebrar ali produziria `+55`, `(11)` e
56
+ // `3333-4444`, todos descartados, e a lista sumiria em silêncio.
57
+ expect(
58
+ parseWhatsappRecipients(
59
+ '+55 (11) 3333-4444, 5511999998888;\n120363430651137530@g.us',
60
+ ),
61
+ ).toEqual([
62
+ { to: '551133334444', targetType: 'phone' },
63
+ { to: '5511999998888', targetType: 'phone' },
64
+ { to: '120363430651137530@g.us', targetType: 'group' },
65
+ ]);
66
+ });
67
+
68
+ it('conta uma vez só o mesmo destino escrito de duas formas', () => {
69
+ expect(
70
+ parseWhatsappRecipients('(11) 99999-8888, 5511999998888'),
71
+ ).toHaveLength(1);
72
+ });
73
+
74
+ it('descarta o que não é telefone nem grupo', () => {
75
+ // Menos de 10 dígitos não tem DDD, e acima de 20 nem grupo é: a faixa entre
76
+ // 16 e 20 pertence ao id de grupo colado sem o sufixo `@g.us`.
77
+ expect(
78
+ parseWhatsappRecipients('123, abc, 123456789012345678901'),
79
+ ).toEqual([]);
80
+ });
81
+
82
+ it('16 a 20 dígitos é id de grupo, não telefone longo demais', () => {
83
+ // O descarte silencioso por "longo demais" é justamente o modo de falha que
84
+ // este canal combate: quem cola o id do painel da Evolution não recebe erro.
85
+ expect(parseWhatsappRecipients('1203634306511375')).toEqual([
86
+ { to: '1203634306511375@g.us', targetType: 'group' },
87
+ ]);
88
+ });
89
+ });
@@ -0,0 +1,83 @@
1
+ import { WhatsappTargetType } from './whatsapp-sender.service';
2
+
3
+ /**
4
+ * Destino de um aviso interno por WhatsApp: celular ou grupo.
5
+ *
6
+ * Mora no core, e nao na library que avisa, porque ja sao duas a ler a mesma
7
+ * lista digitada a mao — o SAC, para o grupo do atendimento, e o commerce, para
8
+ * os grupos de venda. Reconhecedor de JID de grupo duplicado e como as duas
9
+ * divergem: uma passa a aceitar o id sem sufixo e a outra nao, e o destino some
10
+ * em silencio no modulo que ficou para tras.
11
+ */
12
+ export type WhatsappRecipient = {
13
+ to: string;
14
+ targetType: WhatsappTargetType;
15
+ };
16
+
17
+ /**
18
+ * Id de grupo do WhatsApp (`...@g.us`), ou null quando o item nao e grupo.
19
+ *
20
+ * Grupo tem duas formas: a atual, so digitos (`120363...@g.us`), e a antiga,
21
+ * derivada de quem criou o grupo (`5511999998888-1564082267@g.us`). As duas
22
+ * saem do painel da Evolution ja com o sufixo.
23
+ *
24
+ * Sem sufixo tambem vale: um id colado do painel tem 18 digitos, e acima do teto
25
+ * do E.164 (15) nao existe telefone — a alternativa seria o descarte silencioso
26
+ * por "longo demais", que e o modo de falha que este canal combate. O corte em
27
+ * 20 digitos deixa de fora a colagem de dois telefones grudados, que nao e
28
+ * destino nenhum.
29
+ */
30
+ export function toWhatsappGroupJid(value: string): string | null {
31
+ const match = /^(\d{5,}(?:-\d{5,})?)@g\.us$/i.exec(value);
32
+ if (match) return `${match[1]}@g.us`;
33
+
34
+ return /^\d{16,20}$/.test(value) ? `${value}@g.us` : null;
35
+ }
36
+
37
+ /**
38
+ * Destinos de WhatsApp de uma lista digitada a mao: celulares e grupos.
39
+ *
40
+ * Nao da para reusar um `split` de e-mail: `WhatsappSenderService.normalizeTarget`
41
+ * apenas remove os nao-digitos e **nao acrescenta DDI**. Um `(11) 99999-8888`
42
+ * digitado no admin viraria `11999998888`, um numero que o provedor aceita e
43
+ * entrega em outro lugar — falha silenciosa, que e exatamente o que este canal
44
+ * existe para evitar. Por isso o DDI 55 e completado aqui quando o que sobrou
45
+ * tem cara de numero nacional (DDD + 8 ou 9 digitos).
46
+ *
47
+ * A separacao e so por virgula, ponto-e-virgula e quebra de linha — nao por
48
+ * espaco. Espaco faz parte da mascara de um telefone (`+55 (11) 3333-4444`), e
49
+ * quebrar ali produziria os fragmentos `+55`, `(11)` e `3333-4444`, todos
50
+ * descartados: a lista inteira sumiria em silencio.
51
+ *
52
+ * Menos de 10 digitos nao e telefone com DDD, e mais de 15 nao e telefone nenhum
53
+ * (o teto do E.164) — normalmente sao dois numeros que alguem separou so com
54
+ * espaco. Descartar e melhor que enviar para um numero inventado.
55
+ */
56
+ export function parseWhatsappRecipients(
57
+ raw: string | null | undefined,
58
+ ): WhatsappRecipient[] {
59
+ if (!raw) return [];
60
+
61
+ // Map, e nao Set: o mesmo destino escrito de duas formas continua contando uma
62
+ // vez so, e o tipo precisa vir junto do valor.
63
+ const seen = new Map<string, WhatsappRecipient>();
64
+
65
+ for (const item of raw.split(/[,;\n]+/)) {
66
+ const value = item.trim();
67
+ if (!value) continue;
68
+
69
+ const group = toWhatsappGroupJid(value);
70
+
71
+ if (group) {
72
+ seen.set(group, { to: group, targetType: 'group' });
73
+ continue;
74
+ }
75
+
76
+ const digits = value.replace(/\D+/g, '');
77
+ if (digits.length < 10 || digits.length > 15) continue;
78
+ const phone = digits.length <= 11 ? `55${digits}` : digits;
79
+ seen.set(phone, { to: phone, targetType: 'phone' });
80
+ }
81
+
82
+ return [...seen.values()];
83
+ }
@@ -0,0 +1,185 @@
1
+ import {
2
+ WhatsappSendError,
3
+ WhatsappSenderService,
4
+ } from './whatsapp-sender.service';
5
+
6
+ describe('WhatsappSenderService', () => {
7
+ const buildService = (providerSlug: string) => {
8
+ const prisma = {
9
+ integration_profile: {
10
+ findUnique: jest.fn().mockResolvedValue({
11
+ id: 7,
12
+ slug: 'whatsapp-api-hcode',
13
+ config: { access_token: 'token', phone_number_id: '109371452' },
14
+ integration_provider: { slug: providerSlug },
15
+ integration_type: { slug: 'whatsapp' },
16
+ }),
17
+ findFirst: jest.fn(),
18
+ },
19
+ };
20
+
21
+ return { prisma, service: new WhatsappSenderService(prisma as any) };
22
+ };
23
+
24
+ describe('normalizeTarget', () => {
25
+ it('preserva o sufixo do grupo, que um strip de digitos destruiria', () => {
26
+ const { service } = buildService('evolution-api');
27
+
28
+ expect(
29
+ service.normalizeTarget('120363430651137530@g.us', 'group'),
30
+ ).toBe('120363430651137530@g.us');
31
+ });
32
+
33
+ it('reduz o telefone a digitos', () => {
34
+ const { service } = buildService('evolution-api');
35
+
36
+ expect(service.normalizeTarget('+55 (11) 3333-4444')).toBe(
37
+ '551133334444',
38
+ );
39
+ });
40
+ });
41
+
42
+ // A Cloud API nao tem endpoint de grupo. Sem a guarda, o destino seria
43
+ // reduzido a digitos e a Graph API receberia o id do grupo como telefone.
44
+ describe('grupo no provider oficial', () => {
45
+ let fetchSpy: jest.SpyInstance;
46
+
47
+ beforeEach(() => {
48
+ fetchSpy = jest
49
+ .spyOn(global, 'fetch' as any)
50
+ .mockResolvedValue({ ok: true, json: async () => ({}) } as any);
51
+ });
52
+
53
+ afterEach(() => fetchSpy.mockRestore());
54
+
55
+ it('recusa o envio sem chamar a Graph API', async () => {
56
+ const { service } = buildService('whatsapp-official');
57
+
58
+ await expect(
59
+ service.send({
60
+ profileSlug: 'whatsapp-api-hcode',
61
+ to: '120363430651137530@g.us',
62
+ targetType: 'group',
63
+ text: 'Novo chamado',
64
+ }),
65
+ ).rejects.toThrow(/não envia mensagem para grupo/);
66
+
67
+ expect(fetchSpy).not.toHaveBeenCalled();
68
+ });
69
+
70
+ it('marca a recusa como permanente, para o job nao insistir', async () => {
71
+ const { service } = buildService('whatsapp-official');
72
+
73
+ const error = await service
74
+ .send({
75
+ profileSlug: 'whatsapp-api-hcode',
76
+ to: '120363430651137530@g.us',
77
+ targetType: 'group',
78
+ text: 'Novo chamado',
79
+ })
80
+ .catch((thrown) => thrown);
81
+
82
+ expect(error).toBeInstanceOf(WhatsappSendError);
83
+ expect((error as WhatsappSendError).retryable).toBe(false);
84
+ });
85
+
86
+ it('a Evolution continua entregando no grupo', async () => {
87
+ const { prisma, service } = buildService('evolution-api');
88
+ prisma.integration_profile.findUnique.mockResolvedValue({
89
+ id: 2,
90
+ slug: 'hcode',
91
+ config: {
92
+ host: 'https://evolution.hcode.com.br',
93
+ token: 'apikey',
94
+ instance_name: 'hcode',
95
+ },
96
+ integration_provider: { slug: 'evolution-api' },
97
+ integration_type: { slug: 'whatsapp' },
98
+ });
99
+
100
+ await service.send({
101
+ profileSlug: 'hcode',
102
+ to: '120363430651137530@g.us',
103
+ targetType: 'group',
104
+ text: 'Novo chamado',
105
+ });
106
+
107
+ const [url, init] = fetchSpy.mock.calls[0];
108
+ expect(url).toBe('https://evolution.hcode.com.br/message/sendText/hcode');
109
+ expect(JSON.parse(init.body).number).toBe('120363430651137530@g.us');
110
+ });
111
+ });
112
+
113
+ // O worker so insiste quando a recusa pode mudar; numero sem WhatsApp e dado
114
+ // de cadastro e reprocessaria o job tres vezes a toa.
115
+ describe('recusa da Evolution', () => {
116
+ let fetchSpy: jest.SpyInstance;
117
+
118
+ const buildEvolution = () => {
119
+ const built = buildService('evolution-api');
120
+ built.prisma.integration_profile.findUnique.mockResolvedValue({
121
+ id: 2,
122
+ slug: 'hcode',
123
+ config: {
124
+ host: 'https://evolution.hcode.com.br',
125
+ token: 'apikey',
126
+ instance_name: 'hcode',
127
+ },
128
+ integration_provider: { slug: 'evolution-api' },
129
+ integration_type: { slug: 'whatsapp' },
130
+ });
131
+ return built.service;
132
+ };
133
+
134
+ const respond = (status: number, body: unknown) =>
135
+ fetchSpy.mockResolvedValue({
136
+ ok: false,
137
+ status,
138
+ text: async () => JSON.stringify(body),
139
+ } as any);
140
+
141
+ const sendAndCatch = () =>
142
+ buildEvolution()
143
+ .send({ profileSlug: 'hcode', to: '5515991103304', text: 'Oi' })
144
+ .catch((thrown) => thrown);
145
+
146
+ beforeEach(() => {
147
+ fetchSpy = jest.spyOn(global, 'fetch' as any);
148
+ });
149
+
150
+ afterEach(() => fetchSpy.mockRestore());
151
+
152
+ it('numero sem WhatsApp e recusa permanente com mensagem legivel', async () => {
153
+ respond(400, {
154
+ status: 400,
155
+ error: 'Bad Request',
156
+ response: {
157
+ message: [{ jid: '5515991103304@s.whatsapp.net', exists: false, number: '5515991103304' }],
158
+ },
159
+ });
160
+
161
+ const error = await sendAndCatch();
162
+
163
+ expect(error).toBeInstanceOf(WhatsappSendError);
164
+ expect(error.retryable).toBe(false);
165
+ expect(error.message).toMatch(/5515991103304 não tem WhatsApp/);
166
+ });
167
+
168
+ it('outro 4xx tambem e permanente', async () => {
169
+ respond(400, { response: { message: ['text is required'] } });
170
+
171
+ const error = await sendAndCatch();
172
+
173
+ expect(error.retryable).toBe(false);
174
+ expect(error.message).toMatch(/HTTP 400/);
175
+ });
176
+
177
+ it('5xx e 429 podem ser tentados de novo', async () => {
178
+ respond(502, {});
179
+ expect((await sendAndCatch()).retryable).toBe(true);
180
+
181
+ respond(429, {});
182
+ expect((await sendAndCatch()).retryable).toBe(true);
183
+ });
184
+ });
185
+ });
@@ -35,11 +35,27 @@ export type WhatsappSendInput = {
35
35
  };
36
36
 
37
37
  type ResolvedProfile = {
38
+ id: number;
38
39
  slug: string;
39
40
  providerSlug: string;
40
41
  config: Record<string, unknown>;
41
42
  };
42
43
 
44
+ /**
45
+ * Erro de envio classificado: `retryable` diz se tentar de novo pode dar
46
+ * resultado diferente. Um HTTP 4xx da Graph API (id inexistente, sem
47
+ * permissão, token ruim) não muda em cinco minutos; um 5xx ou falha de rede
48
+ * pode ser uma instabilidade passageira do provedor.
49
+ */
50
+ export class WhatsappSendError extends BadRequestException {
51
+ constructor(
52
+ message: string,
53
+ public readonly retryable: boolean,
54
+ ) {
55
+ super(message);
56
+ }
57
+ }
58
+
43
59
  /**
44
60
  * Envio de WhatsApp usando um perfil de integração escolhido pelo usuário.
45
61
  *
@@ -92,6 +108,22 @@ export class WhatsappSenderService {
92
108
  }
93
109
  }
94
110
 
111
+ /**
112
+ * Identidade do perfil que o `send` usaria, sem o `config`.
113
+ *
114
+ * Quem envia pelo provider oficial precisa dizer por qual número a mensagem
115
+ * sai, e cada módulo guarda esse id no próprio cadastro. Para achar o cadastro
116
+ * certo é preciso saber qual perfil foi resolvido — inclusive quando o slug
117
+ * veio vazio e a escolha coube a este serviço. O `config` fica de fora de
118
+ * propósito: é onde moram `access_token` e `app_secret`.
119
+ */
120
+ async describeProfile(
121
+ profileSlug?: string,
122
+ ): Promise<{ id: number; slug: string; providerSlug: string }> {
123
+ const { id, slug, providerSlug } = await this.resolveProfile(profileSlug);
124
+ return { id, slug, providerSlug };
125
+ }
126
+
95
127
  /**
96
128
  * Normaliza o destino: número vira só dígitos, id de grupo passa intacto
97
129
  * (grupos do WhatsApp têm sufixo `@g.us`, que seria destruído por um strip).
@@ -153,6 +185,7 @@ export class WhatsappSenderService {
153
185
  }
154
186
 
155
187
  return {
188
+ id: profile.id,
156
189
  slug: profile.slug,
157
190
  providerSlug: String((profile as any).integration_provider?.slug ?? ''),
158
191
  config: ((profile.config ?? {}) as Record<string, unknown>),
@@ -209,13 +242,27 @@ export class WhatsappSenderService {
209
242
  const detail = await response.text().catch(() => '');
210
243
 
211
244
  if (response.status === 401) {
212
- throw new BadRequestException(
245
+ throw new WhatsappSendError(
213
246
  `Credenciais do WhatsApp inválidas (401). Verifique o token do perfil "${profile.slug}".`,
247
+ false,
214
248
  );
215
249
  }
216
250
 
217
- throw new BadRequestException(
251
+ // Número sem conta no WhatsApp: a Evolution responde 400 com
252
+ // `exists: false`. É dado do cadastro, não instabilidade — reenviar não
253
+ // muda nada, e o chamador precisa saber disso para não insistir.
254
+ if (isEvolutionNumberMissing(detail)) {
255
+ throw new WhatsappSendError(
256
+ `O número ${target} não tem WhatsApp (Evolution: exists=false).`,
257
+ false,
258
+ );
259
+ }
260
+
261
+ // Mesmo critério do provider oficial: 4xx é recusa estrutural, 5xx e
262
+ // 429 podem passar numa próxima tentativa.
263
+ throw new WhatsappSendError(
218
264
  `Evolution API recusou o envio (HTTP ${response.status}): ${detail.slice(0, 300)}`,
265
+ response.status >= 500 || response.status === 429,
219
266
  );
220
267
  }
221
268
  }
@@ -226,6 +273,19 @@ export class WhatsappSenderService {
226
273
  ): Promise<void> {
227
274
  const cfg = buildWhatsappOfficialConfigFromIntegration(profile.config);
228
275
 
276
+ // A Cloud API da Meta não envia para grupo — não há endpoint para isso. Sem
277
+ // esta guarda o `normalizeTarget(..., 'phone')` logo abaixo arrancaria o
278
+ // sufixo `@g.us` e a Graph API receberia o id do grupo como se fosse um
279
+ // telefone: ou erro genérico de número inválido, ou (pior) entrega a um
280
+ // número que por acaso exista. `retryable: false` porque trocar de provider
281
+ // é decisão de configuração, não instabilidade.
282
+ if (input.targetType === 'group') {
283
+ throw new WhatsappSendError(
284
+ `Perfil de integração "${profile.slug}" usa a Cloud API oficial da Meta, que não envia mensagem para grupo. Use um perfil evolution-api para esse destino.`,
285
+ false,
286
+ );
287
+ }
288
+
229
289
  if (!cfg.accessToken) {
230
290
  throw new BadRequestException(
231
291
  `Perfil de WhatsApp "${profile.slug}" está sem access_token.`,
@@ -290,22 +350,45 @@ export class WhatsappSenderService {
290
350
 
291
351
  if (!response.ok) {
292
352
  const payload = (await response.json().catch(() => ({}))) as {
293
- error?: { message?: string };
353
+ error?: { message?: string; code?: number };
294
354
  };
295
355
 
296
- throw new BadRequestException(
356
+ // Código documentado pela Meta para "business-initiated message fora da
357
+ // janela de 24h sem template" (re-engagement). Outros 4xx (id inválido,
358
+ // sem permissão, token ruim) não têm nada a ver com template e não
359
+ // devem exibir essa dica.
360
+ const isReengagementWindowError = payload?.error?.code === 131047;
361
+
362
+ throw new WhatsappSendError(
297
363
  `WhatsApp recusou o envio (HTTP ${response.status}): ${
298
364
  payload?.error?.message ?? 'sem detalhe'
299
365
  }${
300
- input.template?.name
301
- ? ''
302
- : ' — sem template configurado, a entrega só funciona na janela de 24h'
366
+ !input.template?.name && isReengagementWindowError
367
+ ? ' — sem template configurado, a entrega só funciona na janela de 24h'
368
+ : ''
303
369
  }`,
370
+ response.status >= 500,
304
371
  );
305
372
  }
306
373
  }
307
374
  }
308
375
 
376
+ /**
377
+ * Reconhece o 400 da Evolution para destino inexistente:
378
+ * `{"response":{"message":[{"exists":false,"number":"55..."}]}}`.
379
+ */
380
+ function isEvolutionNumberMissing(detail: string): boolean {
381
+ try {
382
+ const messages = JSON.parse(detail)?.response?.message;
383
+ return (
384
+ Array.isArray(messages) &&
385
+ messages.some((item) => item && typeof item === 'object' && item.exists === false)
386
+ );
387
+ } catch {
388
+ return false;
389
+ }
390
+ }
391
+
309
392
  /** Evolution espera base64 puro; um data URL vindo do chamador quebraria o envio. */
310
393
  function stripDataUrlPrefix(image: string): string {
311
394
  const match = /^data:[^;]+;base64,(.*)$/i.exec(image);
@@ -1,46 +0,0 @@
1
- -- Pareamento de dispositivo (QR entre celular e navegador).
2
- --
3
- -- Tabela de infra de auth: vive so aqui, sem YAML em hedhog/table (ver
4
- -- oauth_mobile_state_token.sql).
5
- --
6
- -- Usada por libraries/core/src/pairing/pairing.service.ts. A FK para "user"
7
- -- resolve porque os arquivos de hedhog/query sao anexados DEPOIS de todos os
8
- -- CREATE TABLE (ver docs/YAML-SPEC.md secao 7).
9
- CREATE TABLE IF NOT EXISTS device_pairing_request (
10
- id BIGSERIAL PRIMARY KEY,
11
- direction VARCHAR(20) NOT NULL,
12
- -- Só o hash do token de resgate/poll: um dump do banco não permite reivindicar
13
- -- nem consumir pareamento nenhum.
14
- auth_hash VARCHAR(255) NOT NULL UNIQUE,
15
- -- NULL em 'device-to-browser' até a aprovação: o navegador que pede ainda não
16
- -- é ninguém. Preenchido pelo aparelho que aprova.
17
- user_id INTEGER NULL REFERENCES "user"(id) ON DELETE CASCADE,
18
- client_id VARCHAR(100) NOT NULL,
19
- purpose VARCHAR(50) NOT NULL DEFAULT 'vaults',
20
- -- 'device-to-browser': ponto EC não comprimido (65 bytes) em base64. É a chave
21
- -- para a qual o celular cifra; a privada correspondente nunca sai da aba.
22
- eph_public_key TEXT NULL,
23
- -- 'device-to-browser': o navegador também precisa de sessão (computador novo,
24
- -- ninguém logado) ou só das chaves do cofre (sessão já existe, cofre travado).
25
- want_session BOOLEAN NOT NULL DEFAULT TRUE,
26
- -- OPACO para o servidor: AES-256-GCM feito no cliente com uma chave que nunca
27
- -- chega aqui (fragmento do QR ou par efêmero da aba). Fica NULL até a
28
- -- aprovação, então um pareamento não aprovado nunca guarda material de chave.
29
- payload_enc TEXT NULL,
30
- issued_ip VARCHAR(64) NULL,
31
- issued_user_agent TEXT NULL,
32
- claimed_at TIMESTAMPTZ NULL,
33
- claim_ip VARCHAR(64) NULL,
34
- claim_user_agent TEXT NULL,
35
- confirmed_at TIMESTAMPTZ NULL,
36
- cancelled_at TIMESTAMPTZ NULL,
37
- consumed_at TIMESTAMPTZ NULL,
38
- expires_at TIMESTAMPTZ NOT NULL,
39
- created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
40
- );
41
-
42
- CREATE INDEX IF NOT EXISTS idx_device_pairing_request_expires_at
43
- ON device_pairing_request (expires_at);
44
-
45
- CREATE INDEX IF NOT EXISTS idx_device_pairing_request_user
46
- ON device_pairing_request (user_id, created_at DESC);
@@ -1,71 +0,0 @@
1
- -- Simulacao de acesso ("simular login"): um operador abre uma sessao curta,
2
- -- auditada e nao renovavel como outro usuario.
3
- --
4
- -- Tabela de infra de auth: vive so aqui, sem YAML em hedhog/table (ver
5
- -- oauth_mobile_state_token.sql).
6
- --
7
- -- Usada por libraries/core/src/impersonation/impersonation.service.ts.
8
- --
9
- -- POR QUE impersonator_user_id E target_user_id SAO INTEGER SEM FOREIGN KEY:
10
- -- as tabelas marcadas mais abaixo ja tem uma FK para "user". Uma segunda FK faz
11
- -- o `prisma db pull` desambiguar os nomes das relacoes NOS DOIS LADOS, o que
12
- -- renomearia `user.user_session`, `user.access_log` e `user.user_activity` e
13
- -- quebraria UserService, packages/api-types e a tela de sessoes do admin. O nome
14
- -- do operador e resolvido por uma segunda consulta.
15
- CREATE TABLE IF NOT EXISTS impersonation_grant (
16
- id SERIAL PRIMARY KEY,
17
- code_hash VARCHAR(255) NOT NULL UNIQUE,
18
- -- Sem FK de proposito — ver a nota no topo do arquivo.
19
- impersonator_user_id INTEGER NOT NULL,
20
- target_user_id INTEGER NOT NULL,
21
- -- Chave do app de destino ('admin', 'class', 'partners'), resolvida contra a
22
- -- setting app-urls.
23
- app VARCHAR(50) NOT NULL,
24
- reason VARCHAR(255) NULL,
25
- -- Preenchido no resgate: aponta para a user_session simulada que nasceu daqui.
26
- session_id INTEGER NULL,
27
- issued_ip VARCHAR(64) NULL,
28
- issued_user_agent TEXT NULL,
29
- redeemed_ip VARCHAR(64) NULL,
30
- redeemed_user_agent TEXT NULL,
31
- consumed_at TIMESTAMPTZ NULL,
32
- ended_at TIMESTAMPTZ NULL,
33
- expires_at TIMESTAMPTZ NOT NULL,
34
- created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
35
- );
36
-
37
- CREATE INDEX IF NOT EXISTS idx_impersonation_grant_impersonator
38
- ON impersonation_grant (impersonator_user_id, created_at DESC);
39
-
40
- CREATE INDEX IF NOT EXISTS idx_impersonation_grant_target
41
- ON impersonation_grant (target_user_id, created_at DESC);
42
-
43
- CREATE INDEX IF NOT EXISTS idx_impersonation_grant_expires
44
- ON impersonation_grant (expires_at);
45
-
46
- CREATE INDEX IF NOT EXISTS idx_impersonation_grant_session
47
- ON impersonation_grant (session_id)
48
- WHERE session_id IS NOT NULL;
49
-
50
- -- ---------------------------------------------------------------------------
51
- -- Indices das colunas de simulacao nas tabelas que TEM YAML.
52
- --
53
- -- As colunas em si vem de hedhog/table/{user_session,access_log,user_activity}.yaml
54
- -- e o CLI as cria; os indices NAO — o gerador nao emite indice para elas, e a
55
- -- semantica parcial (WHERE ... IS NOT NULL) nao e exprimivel em YAML.
56
- --
57
- -- Parciais de proposito: a esmagadora maioria das linhas nao tem simulacao
58
- -- nenhuma, entao um indice cheio numa coluna quase toda NULL seria bem maior sem
59
- -- servir a nenhuma consulta.
60
- -- ---------------------------------------------------------------------------
61
- CREATE INDEX IF NOT EXISTS "user_session_impersonator_user_id_idx"
62
- ON "user_session" ("impersonator_user_id")
63
- WHERE "impersonator_user_id" IS NOT NULL;
64
-
65
- CREATE INDEX IF NOT EXISTS "access_log_impersonator_user_id_idx"
66
- ON "access_log" ("impersonator_user_id")
67
- WHERE "impersonator_user_id" IS NOT NULL;
68
-
69
- CREATE INDEX IF NOT EXISTS "user_activity_actor_user_id_idx"
70
- ON "user_activity" ("actor_user_id")
71
- WHERE "actor_user_id" IS NOT NULL;