@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
@@ -21,6 +21,26 @@ export interface CaptchaPublicConfig {
21
21
  site_key: string | null;
22
22
  }
23
23
 
24
+ /**
25
+ * Contexto da submissao que esta sendo verificada. Tudo opcional: uma superficie
26
+ * que ainda nao manda `action` continua passando, o que permite subir o backend
27
+ * antes do front sem derrubar quem esta com bundle antigo em cache.
28
+ */
29
+ export interface CaptchaVerifyContext {
30
+ /** IP do visitante (X-Forwarded-For repassado pelo BFF), nao o IP do pod. */
31
+ remoteIp?: string | null;
32
+ /** `data-action` que a superficie manda no widget. */
33
+ expectedAction?: string | null;
34
+ }
35
+
36
+ /** Resposta do siteverify que nos interessa. Os provedores mandam mais campos. */
37
+ interface SiteverifyResponse {
38
+ success?: boolean;
39
+ action?: string;
40
+ hostname?: string;
41
+ 'error-codes'?: string[];
42
+ }
43
+
24
44
  interface AltchaPayload {
25
45
  algorithm: string;
26
46
  challenge: string;
@@ -29,6 +49,12 @@ interface AltchaPayload {
29
49
  signature: string;
30
50
  }
31
51
 
52
+ /** Teto do token aceito pelo siteverify; acima disso nem vale a viagem de rede. */
53
+ const MAX_TOKEN_LENGTH = 2048;
54
+
55
+ /** Timeout da chamada ao provedor: sem ele um provedor lento prende o request. */
56
+ const SITEVERIFY_TIMEOUT_MS = 10_000;
57
+
32
58
  /**
33
59
  * Server-side CAPTCHA verification shared by every public form in the platform.
34
60
  *
@@ -45,19 +71,36 @@ export class CaptchaService {
45
71
  /**
46
72
  * Verifies a token against the provider configured in an integration profile.
47
73
  * Throws `BadRequestException` when the challenge does not check out.
74
+ *
75
+ * The profile can be addressed by numeric id or by slug. Forms and channels
76
+ * hold a real FK (`captcha_integration_profile_id`), but a setting picked
77
+ * through the admin's entity-picker stores the profile *slug* — as
78
+ * `commerce-back-in-stock-captcha-profile-id` does. Accepting both keeps a
79
+ * profile chosen on screen from silently failing the challenge shut.
48
80
  */
49
81
  async verifyForProfile(
50
- integrationProfileId: number | null | undefined,
82
+ integrationProfileRef: number | string | null | undefined,
51
83
  token: string | null | undefined,
84
+ context: CaptchaVerifyContext = {},
52
85
  ): Promise<void> {
53
- if (!integrationProfileId) {
86
+ const ref =
87
+ typeof integrationProfileRef === 'string'
88
+ ? integrationProfileRef.trim()
89
+ : integrationProfileRef;
90
+
91
+ // `'0'` is the legacy default of the settings named `...-profile-id`: it is
92
+ // nobody's id and nobody's slug.
93
+ if (!ref || ref === '0') {
54
94
  throw new BadRequestException(
55
95
  'CAPTCHA is enabled but no integration profile is configured.',
56
96
  );
57
97
  }
58
98
 
99
+ const numericId =
100
+ typeof ref === 'number' ? ref : /^\d+$/.test(ref) ? Number(ref) : null;
101
+
59
102
  const profile = await (this.prisma as any).integration_profile.findFirst({
60
- where: { id: integrationProfileId },
103
+ where: numericId ? { id: numericId } : { slug: String(ref) },
61
104
  select: {
62
105
  config: true,
63
106
  integration_provider: { select: { slug: true } },
@@ -72,6 +115,7 @@ export class CaptchaService {
72
115
  token ?? '',
73
116
  profile.integration_provider?.slug as string,
74
117
  (profile.config ?? {}) as Record<string, string>,
118
+ context,
75
119
  );
76
120
  }
77
121
 
@@ -80,25 +124,32 @@ export class CaptchaService {
80
124
  token: string,
81
125
  providerSlug: string,
82
126
  config: Record<string, string>,
127
+ context: CaptchaVerifyContext = {},
83
128
  ): Promise<void> {
84
129
  if (!token) {
85
130
  throw new BadRequestException('CAPTCHA token is required.');
86
131
  }
87
132
 
133
+ if (token.length > MAX_TOKEN_LENGTH) {
134
+ throw new BadRequestException('CAPTCHA token is malformed.');
135
+ }
136
+
88
137
  switch (providerSlug) {
89
138
  case 'recaptcha':
90
139
  await this.verifyRemote(
91
140
  'https://www.google.com/recaptcha/api/siteverify',
92
- config.secret_key,
141
+ config,
93
142
  token,
143
+ context,
94
144
  );
95
145
  break;
96
146
 
97
147
  case 'cloudflare-turnstile':
98
148
  await this.verifyRemote(
99
149
  'https://challenges.cloudflare.com/turnstile/v0/siteverify',
100
- config.secret_key,
150
+ config,
101
151
  token,
152
+ context,
102
153
  );
103
154
  break;
104
155
 
@@ -148,16 +199,82 @@ export class CaptchaService {
148
199
  return value ? String(value) : null;
149
200
  }
150
201
 
202
+ /**
203
+ * Hostnames que o perfil aceita, em `config.hostnames` (separados por virgula).
204
+ * Vazio significa "nao confira" - todo perfil ja existente continua valendo.
205
+ */
206
+ static parseHostnames(config: Record<string, unknown> | null): Set<string> {
207
+ const raw = config?.hostnames ?? config?.allowed_hostnames;
208
+ return new Set(
209
+ String(raw ?? '')
210
+ .split(',')
211
+ .map((hostname) => hostname.trim().toLowerCase())
212
+ .filter(Boolean),
213
+ );
214
+ }
215
+
216
+ /**
217
+ * Chamada canonica de siteverify: manda o IP do visitante, tem timeout, e
218
+ * confere `action` e `hostname` alem do `success`.
219
+ *
220
+ * Toda falha - rede, HTTP nao-2xx, corpo que nao e JSON - vira falha de
221
+ * CAPTCHA. Deixar a excecao subir crua transformaria um solavanco do provedor em
222
+ * 500, e o visitante veria "erro do servidor" no lugar de "tente de novo".
223
+ */
151
224
  private async verifyRemote(
152
225
  url: string,
153
- secret: string,
226
+ config: Record<string, string>,
154
227
  token: string,
228
+ context: CaptchaVerifyContext,
155
229
  ): Promise<void> {
156
- const body = new URLSearchParams({ secret, response: token });
157
- const response = await fetch(url, { method: 'POST', body });
158
- const json = (await response.json()) as { success: boolean };
230
+ const body = new URLSearchParams({
231
+ secret: config.secret_key,
232
+ response: token,
233
+ });
234
+
235
+ if (context.remoteIp) {
236
+ body.set('remoteip', context.remoteIp);
237
+ }
238
+
239
+ let result: SiteverifyResponse;
240
+ try {
241
+ const response = await fetch(url, {
242
+ method: 'POST',
243
+ headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
244
+ signal: AbortSignal.timeout(SITEVERIFY_TIMEOUT_MS),
245
+ body,
246
+ });
247
+
248
+ if (!response.ok) {
249
+ throw new Error(`siteverify ${response.status}`);
250
+ }
251
+
252
+ result = (await response.json()) as SiteverifyResponse;
253
+ } catch {
254
+ throw new BadRequestException('CAPTCHA validation failed.');
255
+ }
256
+
257
+ if (!result?.success) {
258
+ throw new BadRequestException('CAPTCHA validation failed.');
259
+ }
260
+
261
+ // As duas checagens abaixo so valem quando os dois lados informaram o campo:
262
+ // o reCAPTCHA v2 nao devolve `action`, e um perfil sem `hostnames` nao pediu
263
+ // conferencia de origem.
264
+ if (
265
+ context.expectedAction &&
266
+ result.action &&
267
+ result.action !== context.expectedAction
268
+ ) {
269
+ throw new BadRequestException('CAPTCHA validation failed.');
270
+ }
159
271
 
160
- if (!json.success) {
272
+ const hostnames = CaptchaService.parseHostnames(config);
273
+ if (
274
+ hostnames.size > 0 &&
275
+ result.hostname &&
276
+ !hostnames.has(result.hostname.toLowerCase())
277
+ ) {
161
278
  throw new BadRequestException('CAPTCHA validation failed.');
162
279
  }
163
280
  }
@@ -25,6 +25,8 @@ import { LeakedPasswordModule } from './leaked-password/leaked-password.module';
25
25
  import { LeakedPasswordService } from './leaked-password/leaked-password.service';
26
26
  import { MailLayoutModule } from './mail-layout/mail-layout.module';
27
27
  import { MailModule } from './mail/mail.module';
28
+ import { MessageTemplateModule } from './message-template/message-template.module';
29
+ import { DocumentKitModule } from './document-kit/document-kit.module';
28
30
  import { McpChatModule } from './mcp-chat/mcp-chat.module';
29
31
  import { McpModule } from './mcp/mcp.module';
30
32
  import { MenuModule } from './menu/menu.module';
@@ -33,6 +35,7 @@ import { NotificationModule } from './notification/notification.module';
33
35
  import { OAuthModule } from './oauth/oauth.module';
34
36
  import { PresenceModule } from './presence/presence.module';
35
37
  import { RealtimeModule } from './realtime/realtime.module';
38
+ import { RedisModule } from './redis/redis.module';
36
39
  import { PdfModule } from './pdf/pdf.module';
37
40
  import { ProfileModule } from './profile/profile.module';
38
41
  import { RoleModule } from './role/role.module';
@@ -87,6 +90,8 @@ import { WhatsappSenderModule } from './whatsapp-sender/whatsapp-sender.module';
87
90
  forwardRef(() => IncidentModule),
88
91
  forwardRef(() => LeakedPasswordModule),
89
92
  forwardRef(() => MailModule),
93
+ forwardRef(() => MessageTemplateModule),
94
+ forwardRef(() => DocumentKitModule),
90
95
  forwardRef(() => MailLayoutModule),
91
96
  forwardRef(() => IntegrationProfileModule),
92
97
  forwardRef(() => WhatsappSenderModule),
@@ -110,6 +115,7 @@ import { WhatsappSenderModule } from './whatsapp-sender/whatsapp-sender.module';
110
115
  forwardRef(() => AccessLogModule),
111
116
  forwardRef(() => RealtimeModule),
112
117
  forwardRef(() => PresenceModule),
118
+ RedisModule,
113
119
  MailboxModule,
114
120
 
115
121
  MeetingModule,
@@ -120,6 +126,8 @@ import { WhatsappSenderModule } from './whatsapp-sender/whatsapp-sender.module';
120
126
  IncidentModule,
121
127
  LeakedPasswordModule,
122
128
  MailModule,
129
+ MessageTemplateModule,
130
+ DocumentKitModule,
123
131
  MailLayoutModule,
124
132
  IntegrationProfileModule,
125
133
  WhatsappSenderModule,
@@ -151,6 +159,7 @@ import { WhatsappSenderModule } from './whatsapp-sender/whatsapp-sender.module';
151
159
  AccessLogModule,
152
160
  RealtimeModule,
153
161
  PresenceModule,
162
+ RedisModule,
154
163
  CaptchaModule,
155
164
  ],
156
165
  providers: [
@@ -11,6 +11,7 @@ import {
11
11
  CreateDashboardComponentRoleBatchDTO,
12
12
  CreateDashboardComponentRoleDTO,
13
13
  } from './dto';
14
+ import { DASHBOARD_COMPONENT_ROLE_SORT } from './dashboard-component-role.sort';
14
15
 
15
16
  @Injectable()
16
17
  export class DashboardComponentRoleService {
@@ -46,11 +47,9 @@ export class DashboardComponentRoleService {
46
47
  },
47
48
  },
48
49
  },
49
- orderBy: {
50
- id: 'desc',
51
- },
52
50
  },
53
51
  'dashboardComponentRole',
52
+ { sort: DASHBOARD_COMPONENT_ROLE_SORT },
54
53
  );
55
54
  }
56
55
 
@@ -0,0 +1,18 @@
1
+ import { defineSortable } from '@hed-hog/api-pagination';
2
+
3
+ /**
4
+ * Campos ordenáveis de `dashboard_component_role`. Nomes localizados
5
+ * (`dashboard_component_locale`/`role_locale`) ficam de fora — relação de
6
+ * locale, dois saltos. `component_slug`/`role_slug` ordenam pelo slug da
7
+ * relação to-one, que o Prisma já suporta direto.
8
+ */
9
+ export const DASHBOARD_COMPONENT_ROLE_SORT = defineSortable(
10
+ {
11
+ id: { initialOrder: 'desc' },
12
+ component_slug: {
13
+ orderBy: (dir) => ({ dashboard_component: { slug: dir } }),
14
+ },
15
+ role_slug: { orderBy: (dir) => ({ role: { slug: dir } }) },
16
+ },
17
+ { default: 'id', defaultOrder: 'desc' },
18
+ );
@@ -8,6 +8,7 @@ import {
8
8
  NotFoundException
9
9
  } from '@nestjs/common';
10
10
  import { CreateDashboardItemDTO } from './dto';
11
+ import { DASHBOARD_ITEM_SORT } from './dashboard-item.sort';
11
12
 
12
13
  @Injectable()
13
14
  export class DashboardItemService {
@@ -46,11 +47,9 @@ export class DashboardItemService {
46
47
  },
47
48
  },
48
49
  },
49
- orderBy: {
50
- id: 'desc',
51
- },
52
50
  },
53
51
  'dashboardItem',
52
+ { sort: DASHBOARD_ITEM_SORT },
54
53
  );
55
54
  }
56
55
 
@@ -0,0 +1,19 @@
1
+ import { defineSortable } from '@hed-hog/api-pagination';
2
+
3
+ /**
4
+ * Campos ordenáveis de `dashboard_item`. Os nomes localizados exibidos na
5
+ * tela (`dashboard.dashboard_locale.name`, `dashboard_component.
6
+ * dashboard_component_locale.name`) ficam de fora — relação de locale, dois
7
+ * saltos a partir de `dashboard_item`. `dashboard_slug`/`component_slug`
8
+ * ordenam pelo slug da relação to-one, que o Prisma já suporta direto.
9
+ */
10
+ export const DASHBOARD_ITEM_SORT = defineSortable(
11
+ {
12
+ id: { initialOrder: 'desc' },
13
+ dashboard_slug: { orderBy: (dir) => ({ dashboard: { slug: dir } }) },
14
+ component_slug: {
15
+ orderBy: (dir) => ({ dashboard_component: { slug: dir } }),
16
+ },
17
+ },
18
+ { default: 'id', defaultOrder: 'desc' },
19
+ );
@@ -11,6 +11,7 @@ import {
11
11
  CreateDashboardRoleBatchDTO,
12
12
  CreateDashboardRoleDTO,
13
13
  } from './dto';
14
+ import { DASHBOARD_ROLE_SORT } from './dashboard-role.sort';
14
15
 
15
16
  @Injectable()
16
17
  export class DashboardRoleService {
@@ -46,11 +47,9 @@ export class DashboardRoleService {
46
47
  },
47
48
  },
48
49
  },
49
- orderBy: {
50
- id: 'desc',
51
- },
52
50
  },
53
51
  'dashboardRole',
52
+ { sort: DASHBOARD_ROLE_SORT },
54
53
  );
55
54
  }
56
55
 
@@ -0,0 +1,16 @@
1
+ import { defineSortable } from '@hed-hog/api-pagination';
2
+
3
+ /**
4
+ * Campos ordenáveis de `dashboard_role`. Nomes localizados
5
+ * (`dashboard_locale`/`role_locale`) ficam de fora — relação de locale, dois
6
+ * saltos. `dashboard_slug`/`role_slug` ordenam pelo slug da relação to-one,
7
+ * que o Prisma já suporta direto.
8
+ */
9
+ export const DASHBOARD_ROLE_SORT = defineSortable(
10
+ {
11
+ id: { initialOrder: 'desc' },
12
+ dashboard_slug: { orderBy: (dir) => ({ dashboard: { slug: dir } }) },
13
+ role_slug: { orderBy: (dir) => ({ role: { slug: dir } }) },
14
+ },
15
+ { default: 'id', defaultOrder: 'desc' },
16
+ );
@@ -0,0 +1,12 @@
1
+ import { forwardRef, Module } from '@nestjs/common';
2
+
3
+ import { AiInstructionModule } from '../ai-instruction/ai-instruction.module';
4
+ import { AiModule } from '../ai/ai.module';
5
+ import { DocumentKitService } from './document-kit.service';
6
+
7
+ @Module({
8
+ imports: [forwardRef(() => AiModule), forwardRef(() => AiInstructionModule)],
9
+ providers: [DocumentKitService],
10
+ exports: [DocumentKitService],
11
+ })
12
+ export class DocumentKitModule {}
@@ -0,0 +1,125 @@
1
+ /**
2
+ * Document kits: what a library needs to have a document drafted by AI and
3
+ * printed with a core template — the prompts, the reference texts the prompts
4
+ * lean on (catalog, price table, writing rules) and the sections the document
5
+ * is made of.
6
+ *
7
+ * Only code, like the message templates: the editable parts are the prompts and
8
+ * references, which are `ai_instruction` rows and already have their own screen
9
+ * (Core › AI Instructions), with versions and "restore default". A kit only ties
10
+ * them together.
11
+ *
12
+ * Libraries register at import time, from their `*.prompts.ts`:
13
+ *
14
+ * registerDocumentKits([{ slug: 'crm.commercial-proposal', ... }]);
15
+ */
16
+
17
+ export type DocumentKitTemplate = 'commercial-proposal';
18
+
19
+ export type DocumentKitSection = {
20
+ /** Stable id: the key the model answers with and the one stored with the document. */
21
+ key: string;
22
+ /** Short label next to the section number (`02 · ESCOPO`). */
23
+ eyebrow: Record<string, string>;
24
+ /** Default title, a short sentence; the model may propose a better one. */
25
+ title: Record<string, string>;
26
+ /** What goes in the section, as told to the model. */
27
+ guidance: string;
28
+ };
29
+
30
+ export type DocumentKitDefinition = {
31
+ /** `<module>.<name>`, e.g. `crm.commercial-proposal`. */
32
+ slug: string;
33
+ /** Must equal the first slug segment. */
34
+ moduleSlug: string;
35
+ /** 'pt' required. */
36
+ name: Record<string, string>;
37
+ template: DocumentKitTemplate;
38
+ /** `ai_instruction` slugs of the drafting call. */
39
+ prompts: { system: string; user: string };
40
+ /**
41
+ * Prompt variable → `ai_instruction` slug (`.raw`) whose content is handed to
42
+ * the prompts under that name. Lets the business content be edited apart from
43
+ * the instructions.
44
+ */
45
+ references: Record<string, string>;
46
+ sections: DocumentKitSection[];
47
+ };
48
+
49
+ const SLUG_RE = /^([a-z0-9-]+)\.([a-z0-9-]+)$/;
50
+ const KEY_RE = /^[a-z][a-z0-9_]*$/;
51
+
52
+ const registry = new Map<string, DocumentKitDefinition>();
53
+
54
+ function assertDefinition(definition: DocumentKitDefinition) {
55
+ const match = SLUG_RE.exec(definition.slug);
56
+ if (!match) {
57
+ throw new Error(`Invalid document kit slug "${definition.slug}". Expected "<module>.<name>".`);
58
+ }
59
+ if (match[1] !== definition.moduleSlug) {
60
+ throw new Error(
61
+ `Document kit "${definition.slug}" declares moduleSlug "${definition.moduleSlug}" but its slug says "${match[1]}".`,
62
+ );
63
+ }
64
+ if (!definition.name?.pt) {
65
+ throw new Error(`Document kit "${definition.slug}" needs a 'pt' name.`);
66
+ }
67
+ if (!definition.prompts?.system || !definition.prompts?.user) {
68
+ throw new Error(`Document kit "${definition.slug}" needs a system and a user prompt.`);
69
+ }
70
+ if (!definition.sections?.length) {
71
+ throw new Error(`Document kit "${definition.slug}" has no sections.`);
72
+ }
73
+
74
+ const keys = new Set<string>();
75
+ for (const section of definition.sections) {
76
+ if (!KEY_RE.test(section.key)) {
77
+ throw new Error(`Document kit "${definition.slug}" has an invalid section key "${section.key}".`);
78
+ }
79
+ if (keys.has(section.key)) {
80
+ throw new Error(`Document kit "${definition.slug}" repeats the section key "${section.key}".`);
81
+ }
82
+ if (!section.eyebrow?.pt || !section.title?.pt) {
83
+ throw new Error(`Section "${section.key}" of "${definition.slug}" needs a 'pt' eyebrow and title.`);
84
+ }
85
+ keys.add(section.key);
86
+ }
87
+
88
+ for (const variable of Object.keys(definition.references ?? {})) {
89
+ if (variable === 'sectionsSpec') {
90
+ throw new Error(`Document kit "${definition.slug}" cannot name a reference "sectionsSpec".`);
91
+ }
92
+ }
93
+ }
94
+
95
+ export function registerDocumentKits(definitions: DocumentKitDefinition[]): void {
96
+ for (const definition of definitions) {
97
+ assertDefinition(definition);
98
+ const existing = registry.get(definition.slug);
99
+ if (existing && existing !== definition) {
100
+ throw new Error(`Document kit "${definition.slug}" is already registered.`);
101
+ }
102
+ registry.set(definition.slug, definition);
103
+ }
104
+ }
105
+
106
+ export function getDocumentKit(slug: string): DocumentKitDefinition | undefined {
107
+ return registry.get(slug);
108
+ }
109
+
110
+ export function listDocumentKits(moduleSlug?: string): DocumentKitDefinition[] {
111
+ const all = [...registry.values()];
112
+ const filtered = moduleSlug ? all.filter((kit) => kit.moduleSlug === moduleSlug) : all;
113
+ return filtered.sort((a, b) => a.slug.localeCompare(b.slug));
114
+ }
115
+
116
+ /** Test helper. */
117
+ export function clearDocumentKitRegistry(): void {
118
+ registry.clear();
119
+ }
120
+
121
+ /** Text of a localized label, falling back to 'pt'. */
122
+ export function pickLocale(value: Record<string, string>, locale?: string): string {
123
+ const short = String(locale || 'pt').toLowerCase().split('-')[0];
124
+ return value[short] ?? value.pt ?? Object.values(value)[0] ?? '';
125
+ }
@@ -0,0 +1,156 @@
1
+ import { BadGatewayException, NotFoundException } from '@nestjs/common';
2
+ import { afterEach, beforeEach, describe, expect, it, jest } from '@jest/globals';
3
+
4
+ import {
5
+ DocumentKitDefinition,
6
+ clearDocumentKitRegistry,
7
+ getDocumentKit,
8
+ registerDocumentKits,
9
+ } from './document-kit.registry';
10
+ import { DocumentKitService, extractJsonObject } from './document-kit.service';
11
+
12
+ const kit = (overrides: Partial<DocumentKitDefinition> = {}): DocumentKitDefinition => ({
13
+ slug: 'crm.commercial-proposal',
14
+ moduleSlug: 'crm',
15
+ name: { pt: 'Proposta comercial' },
16
+ template: 'commercial-proposal',
17
+ prompts: { system: 'task.crm.proposal-draft.compose.system', user: 'task.crm.proposal-draft.compose.user' },
18
+ references: { catalog: 'task.crm.proposal-draft.catalog.raw' },
19
+ sections: [
20
+ { key: 'scope', eyebrow: { pt: 'Escopo', en: 'Scope' }, title: { pt: 'O que entra.', en: 'What is in.' }, guidance: 'O que está incluído.' },
21
+ { key: 'program', eyebrow: { pt: 'Programa' }, title: { pt: 'Como é o dia.' }, guidance: 'Blocos do programa.' },
22
+ ],
23
+ ...overrides,
24
+ });
25
+
26
+ describe('registerDocumentKits', () => {
27
+ afterEach(() => clearDocumentKitRegistry());
28
+
29
+ it('registra e devolve o kit pelo slug', () => {
30
+ registerDocumentKits([kit()]);
31
+ expect(getDocumentKit('crm.commercial-proposal')?.sections).toHaveLength(2);
32
+ });
33
+
34
+ it('recusa slug fora do formato e módulo divergente', () => {
35
+ expect(() => registerDocumentKits([kit({ slug: 'proposal' })])).toThrow(/Invalid document kit slug/);
36
+ expect(() => registerDocumentKits([kit({ moduleSlug: 'lms' })])).toThrow(/declares moduleSlug/);
37
+ });
38
+
39
+ it('recusa seção repetida, chave inválida e kit sem seção', () => {
40
+ const section = kit().sections[0];
41
+ expect(() => registerDocumentKits([kit({ sections: [section, section] })])).toThrow(/repeats/);
42
+ expect(() => registerDocumentKits([kit({ sections: [{ ...section, key: 'Escopo' }] })])).toThrow(/invalid section key/);
43
+ expect(() => registerDocumentKits([kit({ sections: [] })])).toThrow(/no sections/);
44
+ });
45
+
46
+ it('recusa outro kit com o mesmo slug', () => {
47
+ registerDocumentKits([kit()]);
48
+ expect(() => registerDocumentKits([kit()])).toThrow(/already registered/);
49
+ });
50
+ });
51
+
52
+ describe('extractJsonObject', () => {
53
+ it('lê JSON puro, com cerca de código e com texto em volta', () => {
54
+ expect(extractJsonObject('{"a":1}')).toEqual({ a: 1 });
55
+ expect(extractJsonObject('```json\n{"a":1}\n```')).toEqual({ a: 1 });
56
+ expect(extractJsonObject('Segue a proposta:\n{"a":{"b":2}}\nBoa sorte.')).toEqual({ a: { b: 2 } });
57
+ });
58
+
59
+ it('devolve null para texto sem objeto ou JSON quebrado', () => {
60
+ expect(extractJsonObject('não consegui')).toBeNull();
61
+ expect(extractJsonObject('{"a":')).toBeNull();
62
+ expect(extractJsonObject('[1,2]')).toBeNull();
63
+ });
64
+ });
65
+
66
+ describe('DocumentKitService.draft', () => {
67
+ let chatWithPrompt: jest.Mock<(...args: any[]) => Promise<any>>;
68
+ let resolveMany: jest.Mock<(...args: any[]) => Promise<any>>;
69
+ let service: DocumentKitService;
70
+
71
+ beforeEach(() => {
72
+ registerDocumentKits([kit()]);
73
+ chatWithPrompt = jest.fn();
74
+ resolveMany = jest.fn(async () => ({
75
+ 'task.crm.proposal-draft.catalog.raw': { content: ' Workshop 4h ' },
76
+ }));
77
+ service = new DocumentKitService({ chatWithPrompt } as any, { resolveMany } as any);
78
+ });
79
+
80
+ afterEach(() => clearDocumentKitRegistry());
81
+
82
+ const answer = (content: string) =>
83
+ chatWithPrompt.mockResolvedValue({ provider: 'claude', model: 'claude-sonnet-4-5', content, executionId: 9 });
84
+
85
+ it('passa referências, seções e variáveis do chamador aos prompts, pedindo JSON', async () => {
86
+ answer('{"summary_html":"<p>Oi</p>","sections":{}}');
87
+
88
+ await service.draft('crm.commercial-proposal', { variables: { clientName: 'ArcelorMittal' }, locale: 'pt-BR' });
89
+
90
+ const call = chatWithPrompt.mock.calls[0][0];
91
+ expect(call).toMatchObject({
92
+ systemPromptSlug: 'task.crm.proposal-draft.compose.system',
93
+ userPromptSlug: 'task.crm.proposal-draft.compose.user',
94
+ params: { responseFormat: 'json_object' },
95
+ contextSlug: 'document-kit.crm.commercial-proposal',
96
+ });
97
+ expect(call.variables.catalog).toBe('Workshop 4h');
98
+ expect(call.variables.clientName).toBe('ArcelorMittal');
99
+ expect(call.variables.sectionsSpec).toContain('- scope — "O que entra.": O que está incluído.');
100
+ });
101
+
102
+ it('devolve as seções na ordem do kit, sem chave desconhecida nem seção vazia', async () => {
103
+ answer(
104
+ '```json\n' +
105
+ JSON.stringify({
106
+ summary_html: '<p>Resumo</p>',
107
+ sections: {
108
+ program: { title: 'Um dia de prática.', html: '<p>Blocos</p>' },
109
+ invented: { html: '<p>fora do kit</p>' },
110
+ scope: { html: '<p>Tudo</p>' },
111
+ },
112
+ }) +
113
+ '\n```',
114
+ );
115
+
116
+ const draft = await service.draft('crm.commercial-proposal', { locale: 'en' });
117
+
118
+ expect(draft.summaryHtml).toBe('<p>Resumo</p>');
119
+ expect(draft.sections).toEqual([
120
+ { key: 'scope', eyebrow: 'Scope', title: 'What is in.', html: '<p>Tudo</p>' },
121
+ { key: 'program', eyebrow: 'Programa', title: 'Um dia de prática.', html: '<p>Blocos</p>' },
122
+ ]);
123
+ expect(draft.executionId).toBe(9);
124
+ });
125
+
126
+ it('aceita a seção como string e omite a que veio vazia', async () => {
127
+ answer('{"sections":{"scope":"<p>Tudo</p>","program":{"html":" "}}}');
128
+
129
+ const draft = await service.draft('crm.commercial-proposal', {});
130
+
131
+ expect(draft.summaryHtml).toBeNull();
132
+ expect(draft.sections.map((section) => section.key)).toEqual(['scope']);
133
+ });
134
+
135
+ it('responde 502 quando a IA não devolve JSON', async () => {
136
+ answer('Desculpe, não consigo ajudar.');
137
+
138
+ await expect(service.draft('crm.commercial-proposal', {})).rejects.toBeInstanceOf(BadGatewayException);
139
+ });
140
+
141
+ it('troca a falha do provedor por 502 e deixa passar erro HTTP com mensagem própria', async () => {
142
+ chatWithPrompt.mockRejectedValueOnce(new Error('Request failed with status code 401'));
143
+ await expect(service.draft('crm.commercial-proposal', {})).rejects.toThrow(
144
+ 'The AI provider did not answer',
145
+ );
146
+
147
+ chatWithPrompt.mockRejectedValueOnce(new NotFoundException('Integration profile not found'));
148
+ await expect(service.draft('crm.commercial-proposal', {})).rejects.toThrow(
149
+ 'Integration profile not found',
150
+ );
151
+ });
152
+
153
+ it('responde 404 para kit não registrado', async () => {
154
+ await expect(service.draft('crm.nao-existe', {})).rejects.toBeInstanceOf(NotFoundException);
155
+ });
156
+ });