@hed-hog/core 0.0.398 → 0.0.400

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 (664) 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 +4 -4
  6. package/dist/ai/ai.service.d.ts +35 -4
  7. package/dist/ai/ai.service.d.ts.map +1 -1
  8. package/dist/ai/ai.service.js +51 -137
  9. package/dist/ai/ai.service.js.map +1 -1
  10. package/dist/ai-instruction/ai-instruction.service.d.ts.map +1 -1
  11. package/dist/ai-instruction/ai-instruction.service.js +26 -23
  12. package/dist/ai-instruction/ai-instruction.service.js.map +1 -1
  13. package/dist/ai-instruction/ai-instruction.sort.d.ts +16 -0
  14. package/dist/ai-instruction/ai-instruction.sort.d.ts.map +1 -0
  15. package/dist/ai-instruction/ai-instruction.sort.js +32 -0
  16. package/dist/ai-instruction/ai-instruction.sort.js.map +1 -0
  17. package/dist/auth/auth.controller.d.ts +24 -8
  18. package/dist/auth/auth.controller.d.ts.map +1 -1
  19. package/dist/auth/auth.module.d.ts.map +1 -1
  20. package/dist/auth/auth.module.js +8 -1
  21. package/dist/auth/auth.module.js.map +1 -1
  22. package/dist/auth/auth.service.d.ts +72 -25
  23. package/dist/auth/auth.service.d.ts.map +1 -1
  24. package/dist/auth/auth.service.js +41 -4
  25. package/dist/auth/auth.service.js.map +1 -1
  26. package/dist/auth/guards/auth.guard.d.ts +3 -1
  27. package/dist/auth/guards/auth.guard.d.ts.map +1 -1
  28. package/dist/auth/guards/auth.guard.js +12 -3
  29. package/dist/auth/guards/auth.guard.js.map +1 -1
  30. package/dist/authorize/authorize.controller.d.ts +30 -6
  31. package/dist/authorize/authorize.controller.d.ts.map +1 -1
  32. package/dist/authorize/authorize.controller.js +120 -13
  33. package/dist/authorize/authorize.controller.js.map +1 -1
  34. package/dist/authorize/authorize.errors.d.ts +34 -0
  35. package/dist/authorize/authorize.errors.d.ts.map +1 -0
  36. package/dist/authorize/authorize.errors.js +37 -0
  37. package/dist/authorize/authorize.errors.js.map +1 -0
  38. package/dist/authorize/authorize.module.d.ts.map +1 -1
  39. package/dist/authorize/authorize.module.js +6 -1
  40. package/dist/authorize/authorize.module.js.map +1 -1
  41. package/dist/authorize/authorize.service.d.ts +78 -4
  42. package/dist/authorize/authorize.service.d.ts.map +1 -1
  43. package/dist/authorize/authorize.service.js +212 -21
  44. package/dist/authorize/authorize.service.js.map +1 -1
  45. package/dist/authorize/dto/authorize-info.dto.d.ts +10 -1
  46. package/dist/authorize/dto/authorize-info.dto.d.ts.map +1 -1
  47. package/dist/authorize/dto/authorize-info.dto.js +16 -1
  48. package/dist/authorize/dto/authorize-info.dto.js.map +1 -1
  49. package/dist/authorize/dto/consent.dto.d.ts +10 -1
  50. package/dist/authorize/dto/consent.dto.d.ts.map +1 -1
  51. package/dist/authorize/dto/consent.dto.js +16 -1
  52. package/dist/authorize/dto/consent.dto.js.map +1 -1
  53. package/dist/authorize/dto/token.dto.d.ts +12 -0
  54. package/dist/authorize/dto/token.dto.d.ts.map +1 -1
  55. package/dist/authorize/dto/token.dto.js +21 -1
  56. package/dist/authorize/dto/token.dto.js.map +1 -1
  57. package/dist/authorize/oauth-exception.filter.d.ts +17 -0
  58. package/dist/authorize/oauth-exception.filter.d.ts.map +1 -0
  59. package/dist/authorize/oauth-exception.filter.js +54 -0
  60. package/dist/authorize/oauth-exception.filter.js.map +1 -0
  61. package/dist/authorize/oauth-metadata.service.d.ts +39 -0
  62. package/dist/authorize/oauth-metadata.service.d.ts.map +1 -0
  63. package/dist/authorize/oauth-metadata.service.js +81 -0
  64. package/dist/authorize/oauth-metadata.service.js.map +1 -0
  65. package/dist/authorize/well-known.controller.d.ts +67 -0
  66. package/dist/authorize/well-known.controller.d.ts.map +1 -0
  67. package/dist/authorize/well-known.controller.js +126 -0
  68. package/dist/authorize/well-known.controller.js.map +1 -0
  69. package/dist/captcha/captcha.service.d.ts +32 -2
  70. package/dist/captcha/captcha.service.d.ts.map +1 -1
  71. package/dist/captcha/captcha.service.js +85 -12
  72. package/dist/captcha/captcha.service.js.map +1 -1
  73. package/dist/challenge/challenge.service.d.ts +2 -2
  74. package/dist/core.module.d.ts.map +1 -1
  75. package/dist/core.module.js +6 -0
  76. package/dist/core.module.js.map +1 -1
  77. package/dist/dashboard/dashboard/dashboard.controller.d.ts +9 -9
  78. package/dist/dashboard/dashboard/dashboard.service.d.ts +9 -9
  79. package/dist/dashboard/dashboard-component/dashboard-component.controller.d.ts +3 -3
  80. package/dist/dashboard/dashboard-component/dashboard-component.service.d.ts +3 -3
  81. package/dist/dashboard/dashboard-component-role/dashboard-component-role.controller.d.ts +3 -3
  82. package/dist/dashboard/dashboard-component-role/dashboard-component-role.service.d.ts +3 -3
  83. package/dist/dashboard/dashboard-component-role/dashboard-component-role.service.d.ts.map +1 -1
  84. package/dist/dashboard/dashboard-component-role/dashboard-component-role.service.js +2 -4
  85. package/dist/dashboard/dashboard-component-role/dashboard-component-role.service.js.map +1 -1
  86. package/dist/dashboard/dashboard-component-role/dashboard-component-role.sort.d.ts +8 -0
  87. package/dist/dashboard/dashboard-component-role/dashboard-component-role.sort.d.ts.map +1 -0
  88. package/dist/dashboard/dashboard-component-role/dashboard-component-role.sort.js +18 -0
  89. package/dist/dashboard/dashboard-component-role/dashboard-component-role.sort.js.map +1 -0
  90. package/dist/dashboard/dashboard-item/dashboard-item.service.d.ts.map +1 -1
  91. package/dist/dashboard/dashboard-item/dashboard-item.service.js +2 -4
  92. package/dist/dashboard/dashboard-item/dashboard-item.service.js.map +1 -1
  93. package/dist/dashboard/dashboard-item/dashboard-item.sort.d.ts +9 -0
  94. package/dist/dashboard/dashboard-item/dashboard-item.sort.d.ts.map +1 -0
  95. package/dist/dashboard/dashboard-item/dashboard-item.sort.js +19 -0
  96. package/dist/dashboard/dashboard-item/dashboard-item.sort.js.map +1 -0
  97. package/dist/dashboard/dashboard-role/dashboard-role.controller.d.ts +3 -3
  98. package/dist/dashboard/dashboard-role/dashboard-role.service.d.ts +3 -3
  99. package/dist/dashboard/dashboard-role/dashboard-role.service.d.ts.map +1 -1
  100. package/dist/dashboard/dashboard-role/dashboard-role.service.js +2 -4
  101. package/dist/dashboard/dashboard-role/dashboard-role.service.js.map +1 -1
  102. package/dist/dashboard/dashboard-role/dashboard-role.sort.d.ts +8 -0
  103. package/dist/dashboard/dashboard-role/dashboard-role.sort.d.ts.map +1 -0
  104. package/dist/dashboard/dashboard-role/dashboard-role.sort.js +16 -0
  105. package/dist/dashboard/dashboard-role/dashboard-role.sort.js.map +1 -0
  106. package/dist/file/file-upload-ticket.service.d.ts +160 -0
  107. package/dist/file/file-upload-ticket.service.d.ts.map +1 -0
  108. package/dist/file/file-upload-ticket.service.js +382 -0
  109. package/dist/file/file-upload-ticket.service.js.map +1 -0
  110. package/dist/file/file.controller.d.ts +24 -1
  111. package/dist/file/file.controller.d.ts.map +1 -1
  112. package/dist/file/file.controller.js +63 -2
  113. package/dist/file/file.controller.js.map +1 -1
  114. package/dist/file/file.module.d.ts.map +1 -1
  115. package/dist/file/file.module.js +14 -2
  116. package/dist/file/file.module.js.map +1 -1
  117. package/dist/file/file.service.d.ts +182 -6
  118. package/dist/file/file.service.d.ts.map +1 -1
  119. package/dist/file/file.service.js +385 -36
  120. package/dist/file/file.service.js.map +1 -1
  121. package/dist/file/filename-encoding.util.d.ts +24 -0
  122. package/dist/file/filename-encoding.util.d.ts.map +1 -0
  123. package/dist/file/filename-encoding.util.js +63 -0
  124. package/dist/file/filename-encoding.util.js.map +1 -0
  125. package/dist/file/image-optimization.service.d.ts +27 -0
  126. package/dist/file/image-optimization.service.d.ts.map +1 -1
  127. package/dist/file/image-optimization.service.js +63 -14
  128. package/dist/file/image-optimization.service.js.map +1 -1
  129. package/dist/file/mcp-file-source.schema.d.ts +33 -0
  130. package/dist/file/mcp-file-source.schema.d.ts.map +1 -0
  131. package/dist/file/mcp-file-source.schema.js +75 -0
  132. package/dist/file/mcp-file-source.schema.js.map +1 -0
  133. package/dist/file/mcp-file-source.service.d.ts +124 -0
  134. package/dist/file/mcp-file-source.service.d.ts.map +1 -0
  135. package/dist/file/mcp-file-source.service.js +262 -0
  136. package/dist/file/mcp-file-source.service.js.map +1 -0
  137. package/dist/file/mimetype-sniff.util.d.ts +62 -0
  138. package/dist/file/mimetype-sniff.util.d.ts.map +1 -0
  139. package/dist/file/mimetype-sniff.util.js +226 -0
  140. package/dist/file/mimetype-sniff.util.js.map +1 -0
  141. package/dist/file/remote-fetch.util.d.ts +35 -0
  142. package/dist/file/remote-fetch.util.d.ts.map +1 -0
  143. package/dist/file/remote-fetch.util.js +236 -0
  144. package/dist/file/remote-fetch.util.js.map +1 -0
  145. package/dist/impersonation/dto/start-impersonation.dto.d.ts +4 -1
  146. package/dist/impersonation/dto/start-impersonation.dto.d.ts.map +1 -1
  147. package/dist/impersonation/dto/start-impersonation.dto.js +1 -1
  148. package/dist/impersonation/dto/start-impersonation.dto.js.map +1 -1
  149. package/dist/impersonation/impersonation.service.d.ts +8 -3
  150. package/dist/impersonation/impersonation.service.d.ts.map +1 -1
  151. package/dist/impersonation/impersonation.service.js +14 -4
  152. package/dist/impersonation/impersonation.service.js.map +1 -1
  153. package/dist/incident/incident.controller.d.ts +2 -1
  154. package/dist/incident/incident.controller.d.ts.map +1 -1
  155. package/dist/incident/incident.controller.js +10 -6
  156. package/dist/incident/incident.controller.js.map +1 -1
  157. package/dist/incident/incident.service.d.ts +2 -0
  158. package/dist/incident/incident.service.d.ts.map +1 -1
  159. package/dist/incident/incident.service.js +4 -0
  160. package/dist/incident/incident.service.js.map +1 -1
  161. package/dist/index.d.ts +17 -0
  162. package/dist/index.d.ts.map +1 -1
  163. package/dist/index.js +17 -0
  164. package/dist/index.js.map +1 -1
  165. package/dist/integration-profile/integration-profile.secrets.d.ts.map +1 -1
  166. package/dist/integration-profile/integration-profile.secrets.js +7 -0
  167. package/dist/integration-profile/integration-profile.secrets.js.map +1 -1
  168. package/dist/integration-profile/integration-profile.service.d.ts +0 -13
  169. package/dist/integration-profile/integration-profile.service.d.ts.map +1 -1
  170. package/dist/integration-profile/integration-profile.service.js +5 -40
  171. package/dist/integration-profile/integration-profile.service.js.map +1 -1
  172. package/dist/integration-profile/integration-profile.utils.js +5 -5
  173. package/dist/integration-profile/integration-profile.utils.js.map +1 -1
  174. package/dist/integration-profile/testers/index.d.ts.map +1 -1
  175. package/dist/integration-profile/testers/index.js +2 -0
  176. package/dist/integration-profile/testers/index.js.map +1 -1
  177. package/dist/integration-profile/testers/shipping.testers.d.ts +3 -0
  178. package/dist/integration-profile/testers/shipping.testers.d.ts.map +1 -0
  179. package/dist/integration-profile/testers/shipping.testers.js +71 -0
  180. package/dist/integration-profile/testers/shipping.testers.js.map +1 -0
  181. package/dist/locale/locale.controller.d.ts +1 -1
  182. package/dist/locale/locale.service.d.ts +1 -1
  183. package/dist/mail/dto/send.dto.d.ts +6 -1
  184. package/dist/mail/dto/send.dto.d.ts.map +1 -1
  185. package/dist/mail/dto/send.dto.js.map +1 -1
  186. package/dist/mail/mail.service.d.ts +9 -0
  187. package/dist/mail/mail.service.d.ts.map +1 -1
  188. package/dist/mail/mail.service.js +34 -14
  189. package/dist/mail/mail.service.js.map +1 -1
  190. package/dist/mail-sent/mail-sent.controller.d.ts +1 -1
  191. package/dist/mail-sent/mail-sent.service.d.ts +1 -1
  192. package/dist/mail-sent/mail-sent.service.d.ts.map +1 -1
  193. package/dist/mail-sent/mail-sent.service.js +2 -1
  194. package/dist/mail-sent/mail-sent.service.js.map +1 -1
  195. package/dist/mail-sent/mail-sent.sort.d.ts +9 -0
  196. package/dist/mail-sent/mail-sent.sort.d.ts.map +1 -0
  197. package/dist/mail-sent/mail-sent.sort.js +19 -0
  198. package/dist/mail-sent/mail-sent.sort.js.map +1 -0
  199. package/dist/mcp/filters/mcp-challenge.filter.d.ts +20 -0
  200. package/dist/mcp/filters/mcp-challenge.filter.d.ts.map +1 -0
  201. package/dist/mcp/filters/mcp-challenge.filter.js +69 -0
  202. package/dist/mcp/filters/mcp-challenge.filter.js.map +1 -0
  203. package/dist/mcp/guards/mcp-auth.guard.d.ts +4 -1
  204. package/dist/mcp/guards/mcp-auth.guard.d.ts.map +1 -1
  205. package/dist/mcp/guards/mcp-auth.guard.js +19 -5
  206. package/dist/mcp/guards/mcp-auth.guard.js.map +1 -1
  207. package/dist/mcp/guards/mcp-permission.guard.d.ts +25 -3
  208. package/dist/mcp/guards/mcp-permission.guard.d.ts.map +1 -1
  209. package/dist/mcp/guards/mcp-permission.guard.js +46 -26
  210. package/dist/mcp/guards/mcp-permission.guard.js.map +1 -1
  211. package/dist/mcp/mcp-audit.service.d.ts +17 -0
  212. package/dist/mcp/mcp-audit.service.d.ts.map +1 -1
  213. package/dist/mcp/mcp-audit.service.js +32 -3
  214. package/dist/mcp/mcp-audit.service.js.map +1 -1
  215. package/dist/mcp/mcp-permission.service.d.ts +64 -0
  216. package/dist/mcp/mcp-permission.service.d.ts.map +1 -0
  217. package/dist/mcp/mcp-permission.service.js +178 -0
  218. package/dist/mcp/mcp-permission.service.js.map +1 -0
  219. package/dist/mcp/mcp-server.service.d.ts +3 -1
  220. package/dist/mcp/mcp-server.service.d.ts.map +1 -1
  221. package/dist/mcp/mcp-server.service.js +36 -15
  222. package/dist/mcp/mcp-server.service.js.map +1 -1
  223. package/dist/mcp/mcp.controller.d.ts.map +1 -1
  224. package/dist/mcp/mcp.controller.js +10 -2
  225. package/dist/mcp/mcp.controller.js.map +1 -1
  226. package/dist/mcp/mcp.module.d.ts.map +1 -1
  227. package/dist/mcp/mcp.module.js +5 -1
  228. package/dist/mcp/mcp.module.js.map +1 -1
  229. package/dist/mcp/tools/core-ai.mcp-tools.js +2 -9
  230. package/dist/mcp/tools/core-ai.mcp-tools.js.map +1 -1
  231. package/dist/mcp/tools/core-dashboard-items.mcp-tools.js +1 -1
  232. package/dist/mcp/tools/core-dashboard-items.mcp-tools.js.map +1 -1
  233. package/dist/mcp/tools/core-dashboard.mcp-tools.js +2 -9
  234. package/dist/mcp/tools/core-dashboard.mcp-tools.js.map +1 -1
  235. package/dist/mcp/tools/core-event-webhooks.mcp-tools.d.ts.map +1 -1
  236. package/dist/mcp/tools/core-event-webhooks.mcp-tools.js +2 -10
  237. package/dist/mcp/tools/core-event-webhooks.mcp-tools.js.map +1 -1
  238. package/dist/mcp/tools/core-files.mcp-tools.d.ts +17 -5
  239. package/dist/mcp/tools/core-files.mcp-tools.d.ts.map +1 -1
  240. package/dist/mcp/tools/core-files.mcp-tools.js +186 -24
  241. package/dist/mcp/tools/core-files.mcp-tools.js.map +1 -1
  242. package/dist/mcp/tools/core-integration-events.mcp-tools.js +2 -9
  243. package/dist/mcp/tools/core-integration-events.mcp-tools.js.map +1 -1
  244. package/dist/mcp/tools/core-mail-sent.mcp-tools.js +2 -14
  245. package/dist/mcp/tools/core-mail-sent.mcp-tools.js.map +1 -1
  246. package/dist/mcp/tools/core-mail.mcp-tools.js +2 -9
  247. package/dist/mcp/tools/core-mail.mcp-tools.js.map +1 -1
  248. package/dist/mcp/tools/core-menus.mcp-tools.d.ts.map +1 -1
  249. package/dist/mcp/tools/core-menus.mcp-tools.js +2 -10
  250. package/dist/mcp/tools/core-menus.mcp-tools.js.map +1 -1
  251. package/dist/mcp/tools/core-notifications.mcp-tools.d.ts.map +1 -1
  252. package/dist/mcp/tools/core-notifications.mcp-tools.js +0 -1
  253. package/dist/mcp/tools/core-notifications.mcp-tools.js.map +1 -1
  254. package/dist/mcp/tools/core-roles.mcp-tools.d.ts.map +1 -1
  255. package/dist/mcp/tools/core-roles.mcp-tools.js +2 -13
  256. package/dist/mcp/tools/core-roles.mcp-tools.js.map +1 -1
  257. package/dist/mcp/tools/core-routes.mcp-tools.d.ts.map +1 -1
  258. package/dist/mcp/tools/core-routes.mcp-tools.js +2 -11
  259. package/dist/mcp/tools/core-routes.mcp-tools.js.map +1 -1
  260. package/dist/mcp/tools/core-screens.mcp-tools.d.ts.map +1 -1
  261. package/dist/mcp/tools/core-screens.mcp-tools.js +2 -11
  262. package/dist/mcp/tools/core-screens.mcp-tools.js.map +1 -1
  263. package/dist/mcp/tools/core-sessions.mcp-tools.d.ts.map +1 -1
  264. package/dist/mcp/tools/core-sessions.mcp-tools.js +0 -2
  265. package/dist/mcp/tools/core-sessions.mcp-tools.js.map +1 -1
  266. package/dist/mcp/tools/core-settings.mcp-tools.d.ts.map +1 -1
  267. package/dist/mcp/tools/core-settings.mcp-tools.js +2 -10
  268. package/dist/mcp/tools/core-settings.mcp-tools.js.map +1 -1
  269. package/dist/mcp/tools/core-users.mcp-tools.js +2 -9
  270. package/dist/mcp/tools/core-users.mcp-tools.js.map +1 -1
  271. package/dist/mcp/tools/core-webhooks.mcp-tools.d.ts.map +1 -1
  272. package/dist/mcp/tools/core-webhooks.mcp-tools.js +2 -10
  273. package/dist/mcp/tools/core-webhooks.mcp-tools.js.map +1 -1
  274. package/dist/mcp/types/mcp-context.type.d.ts +9 -0
  275. package/dist/mcp/types/mcp-context.type.d.ts.map +1 -1
  276. package/dist/mcp-chat/mcp-chat.service.d.ts.map +1 -1
  277. package/dist/mcp-chat/mcp-chat.service.js +8 -0
  278. package/dist/mcp-chat/mcp-chat.service.js.map +1 -1
  279. package/dist/meeting/meeting-provider.registry.d.ts +115 -0
  280. package/dist/meeting/meeting-provider.registry.d.ts.map +1 -1
  281. package/dist/meeting/meeting-provider.registry.js.map +1 -1
  282. package/dist/meeting/meeting.constants.d.ts +70 -0
  283. package/dist/meeting/meeting.constants.d.ts.map +1 -1
  284. package/dist/meeting/meeting.constants.js +9 -1
  285. package/dist/meeting/meeting.constants.js.map +1 -1
  286. package/dist/menu/menu.service.d.ts.map +1 -1
  287. package/dist/menu/menu.service.js +29 -9
  288. package/dist/menu/menu.service.js.map +1 -1
  289. package/dist/message-template/dto/update-message-template.dto.d.ts +18 -0
  290. package/dist/message-template/dto/update-message-template.dto.d.ts.map +1 -0
  291. package/dist/message-template/dto/update-message-template.dto.js +38 -0
  292. package/dist/message-template/dto/update-message-template.dto.js.map +1 -0
  293. package/dist/message-template/message-template-admin.service.d.ts +70 -0
  294. package/dist/message-template/message-template-admin.service.d.ts.map +1 -0
  295. package/dist/message-template/message-template-admin.service.js +226 -0
  296. package/dist/message-template/message-template-admin.service.js.map +1 -0
  297. package/dist/message-template/message-template.controller.d.ts +29 -0
  298. package/dist/message-template/message-template.controller.d.ts.map +1 -0
  299. package/dist/message-template/message-template.controller.js +101 -0
  300. package/dist/message-template/message-template.controller.js.map +1 -0
  301. package/dist/message-template/message-template.module.d.ts +10 -0
  302. package/dist/message-template/message-template.module.d.ts.map +1 -0
  303. package/dist/message-template/message-template.module.js +33 -0
  304. package/dist/message-template/message-template.module.js.map +1 -0
  305. package/dist/message-template/message-template.registry.d.ts +55 -0
  306. package/dist/message-template/message-template.registry.d.ts.map +1 -0
  307. package/dist/message-template/message-template.registry.js +64 -0
  308. package/dist/message-template/message-template.registry.js.map +1 -0
  309. package/dist/message-template/message-template.service.d.ts +59 -0
  310. package/dist/message-template/message-template.service.d.ts.map +1 -0
  311. package/dist/message-template/message-template.service.js +166 -0
  312. package/dist/message-template/message-template.service.js.map +1 -0
  313. package/dist/notification/notification.constants.d.ts +11 -0
  314. package/dist/notification/notification.constants.d.ts.map +1 -0
  315. package/dist/notification/notification.constants.js +14 -0
  316. package/dist/notification/notification.constants.js.map +1 -0
  317. package/dist/notification/notification.controller.d.ts +20 -20
  318. package/dist/notification/notification.module.d.ts.map +1 -1
  319. package/dist/notification/notification.module.js +3 -0
  320. package/dist/notification/notification.module.js.map +1 -1
  321. package/dist/notification/notification.service.d.ts +33 -21
  322. package/dist/notification/notification.service.d.ts.map +1 -1
  323. package/dist/notification/notification.service.js +36 -2
  324. package/dist/notification/notification.service.js.map +1 -1
  325. package/dist/oauth/oauth.controller.d.ts +4 -6
  326. package/dist/oauth/oauth.controller.d.ts.map +1 -1
  327. package/dist/oauth/oauth.controller.js +0 -1
  328. package/dist/oauth/oauth.controller.js.map +1 -1
  329. package/dist/oauth/oauth.errors.d.ts +15 -1
  330. package/dist/oauth/oauth.errors.d.ts.map +1 -1
  331. package/dist/oauth/oauth.errors.js +9 -1
  332. package/dist/oauth/oauth.errors.js.map +1 -1
  333. package/dist/oauth/oauth.module.d.ts.map +1 -1
  334. package/dist/oauth/oauth.module.js +6 -1
  335. package/dist/oauth/oauth.module.js.map +1 -1
  336. package/dist/oauth/oauth.service.d.ts +25 -5
  337. package/dist/oauth/oauth.service.d.ts.map +1 -1
  338. package/dist/oauth/oauth.service.js +63 -27
  339. package/dist/oauth/oauth.service.js.map +1 -1
  340. package/dist/oauth/providers/abstract.provider.d.ts +10 -0
  341. package/dist/oauth/providers/abstract.provider.d.ts.map +1 -1
  342. package/dist/oauth/providers/abstract.provider.js +39 -12
  343. package/dist/oauth/providers/abstract.provider.js.map +1 -1
  344. package/dist/oauth/providers/github.provider.d.ts +1 -1
  345. package/dist/oauth/providers/github.provider.d.ts.map +1 -1
  346. package/dist/oauth/providers/github.provider.js +48 -22
  347. package/dist/oauth/providers/github.provider.js.map +1 -1
  348. package/dist/oauth/providers/microsoft-entra-id.provider.d.ts.map +1 -1
  349. package/dist/oauth/providers/microsoft-entra-id.provider.js +6 -0
  350. package/dist/oauth/providers/microsoft-entra-id.provider.js.map +1 -1
  351. package/dist/observability/monitored-cron.d.ts +29 -12
  352. package/dist/observability/monitored-cron.d.ts.map +1 -1
  353. package/dist/observability/monitored-cron.js +131 -46
  354. package/dist/observability/monitored-cron.js.map +1 -1
  355. package/dist/pairing/pairing.controller.d.ts +9 -9
  356. package/dist/pairing/pairing.service.d.ts +15 -11
  357. package/dist/pairing/pairing.service.d.ts.map +1 -1
  358. package/dist/profile/dto/change-password.dto.d.ts.map +1 -1
  359. package/dist/profile/dto/change-password.dto.js +4 -6
  360. package/dist/profile/dto/change-password.dto.js.map +1 -1
  361. package/dist/profile/profile.controller.d.ts +1 -1
  362. package/dist/profile/profile.service.d.ts +1 -1
  363. package/dist/profile/profile.service.d.ts.map +1 -1
  364. package/dist/profile/profile.service.js +9 -3
  365. package/dist/profile/profile.service.js.map +1 -1
  366. package/dist/realtime/realtime-tick.coalescer.d.ts +34 -0
  367. package/dist/realtime/realtime-tick.coalescer.d.ts.map +1 -0
  368. package/dist/realtime/realtime-tick.coalescer.js +60 -0
  369. package/dist/realtime/realtime-tick.coalescer.js.map +1 -0
  370. package/dist/realtime/realtime.service.d.ts +2 -0
  371. package/dist/realtime/realtime.service.d.ts.map +1 -1
  372. package/dist/realtime/realtime.service.js +22 -2
  373. package/dist/realtime/realtime.service.js.map +1 -1
  374. package/dist/redis/redis-kv.service.d.ts +90 -0
  375. package/dist/redis/redis-kv.service.d.ts.map +1 -0
  376. package/dist/redis/redis-kv.service.js +247 -0
  377. package/dist/redis/redis-kv.service.js.map +1 -0
  378. package/dist/redis/redis-master.d.ts +29 -0
  379. package/dist/redis/redis-master.d.ts.map +1 -0
  380. package/dist/redis/redis-master.js +81 -0
  381. package/dist/redis/redis-master.js.map +1 -0
  382. package/dist/redis/redis-pubsub.d.ts +12 -0
  383. package/dist/redis/redis-pubsub.d.ts.map +1 -1
  384. package/dist/redis/redis-pubsub.js +25 -2
  385. package/dist/redis/redis-pubsub.js.map +1 -1
  386. package/dist/redis/redis.module.d.ts +11 -0
  387. package/dist/redis/redis.module.d.ts.map +1 -0
  388. package/dist/redis/redis.module.js +30 -0
  389. package/dist/redis/redis.module.js.map +1 -0
  390. package/dist/session/session.controller.d.ts +6 -2
  391. package/dist/session/session.controller.d.ts.map +1 -1
  392. package/dist/session/session.service.d.ts +118 -15
  393. package/dist/session/session.service.d.ts.map +1 -1
  394. package/dist/session/session.service.js +251 -77
  395. package/dist/session/session.service.js.map +1 -1
  396. package/dist/setting/setting.controller.d.ts +5 -0
  397. package/dist/setting/setting.controller.d.ts.map +1 -1
  398. package/dist/setting/setting.service.d.ts +7 -0
  399. package/dist/setting/setting.service.d.ts.map +1 -1
  400. package/dist/setting/setting.service.js +38 -3
  401. package/dist/setting/setting.service.js.map +1 -1
  402. package/dist/task/task.service.d.ts +17 -0
  403. package/dist/task/task.service.d.ts.map +1 -1
  404. package/dist/task/task.service.js +48 -13
  405. package/dist/task/task.service.js.map +1 -1
  406. package/dist/token/token.service.d.ts +19 -1
  407. package/dist/token/token.service.d.ts.map +1 -1
  408. package/dist/token/token.service.js +39 -2
  409. package/dist/token/token.service.js.map +1 -1
  410. package/dist/user/user-credential.util.d.ts +10 -0
  411. package/dist/user/user-credential.util.d.ts.map +1 -1
  412. package/dist/user/user-credential.util.js +14 -1
  413. package/dist/user/user-credential.util.js.map +1 -1
  414. package/dist/user/user.service.d.ts +12 -4
  415. package/dist/user/user.service.d.ts.map +1 -1
  416. package/dist/user/user.service.js +2 -11
  417. package/dist/user/user.service.js.map +1 -1
  418. package/dist/user/user.sort.d.ts +16 -0
  419. package/dist/user/user.sort.d.ts.map +1 -0
  420. package/dist/user/user.sort.js +25 -0
  421. package/dist/user/user.sort.js.map +1 -0
  422. package/dist/utils/abbreviate-name.d.ts +13 -0
  423. package/dist/utils/abbreviate-name.d.ts.map +1 -0
  424. package/dist/utils/abbreviate-name.js +42 -0
  425. package/dist/utils/abbreviate-name.js.map +1 -0
  426. package/dist/utils/date-range-query.dto.d.ts +11 -0
  427. package/dist/utils/date-range-query.dto.d.ts.map +1 -0
  428. package/dist/utils/date-range-query.dto.js +63 -0
  429. package/dist/utils/date-range-query.dto.js.map +1 -0
  430. package/dist/utils/date-range.d.ts +96 -0
  431. package/dist/utils/date-range.d.ts.map +1 -0
  432. package/dist/utils/date-range.js +172 -0
  433. package/dist/utils/date-range.js.map +1 -0
  434. package/dist/webhook-integration/webhook-utils.d.ts.map +1 -1
  435. package/dist/webhook-integration/webhook-utils.js +24 -0
  436. package/dist/webhook-integration/webhook-utils.js.map +1 -1
  437. package/dist/whatsapp-sender/whatsapp-recipients.d.ts +49 -0
  438. package/dist/whatsapp-sender/whatsapp-recipients.d.ts.map +1 -0
  439. package/dist/whatsapp-sender/whatsapp-recipients.js +66 -0
  440. package/dist/whatsapp-sender/whatsapp-recipients.js.map +1 -0
  441. package/dist/whatsapp-sender/whatsapp-sender.service.d.ts +25 -0
  442. package/dist/whatsapp-sender/whatsapp-sender.service.d.ts.map +1 -1
  443. package/dist/whatsapp-sender/whatsapp-sender.service.js +46 -5
  444. package/dist/whatsapp-sender/whatsapp-sender.service.js.map +1 -1
  445. package/hedhog/data/integration_provider.yaml +9 -0
  446. package/hedhog/data/integration_type.yaml +6 -0
  447. package/hedhog/data/locale.yaml +0 -1
  448. package/hedhog/data/mail.yaml +2 -2
  449. package/hedhog/data/mail_layout.yaml +6 -3
  450. package/hedhog/data/menu.yaml +25 -5
  451. package/hedhog/data/route.yaml +140 -0
  452. package/hedhog/data/setting_group.yaml +137 -3
  453. package/hedhog/frontend/app/access-log/page.tsx.ejs +47 -53
  454. package/hedhog/frontend/app/account/components/active-sessions.tsx.ejs +33 -8
  455. package/hedhog/frontend/app/account/components/mcp-tokens.tsx.ejs +54 -13
  456. package/hedhog/frontend/app/account/components/mfa-method-card.tsx.ejs +7 -1
  457. package/hedhog/frontend/app/account/components/recovery-codes-dialog.tsx.ejs +1 -0
  458. package/hedhog/frontend/app/account/components/tokens.tsx.ejs +47 -17
  459. package/hedhog/frontend/app/ai_agent/page.tsx.ejs +46 -5
  460. package/hedhog/frontend/app/ai_instruction/_components/ai-instruction-form.tsx.ejs +101 -30
  461. package/hedhog/frontend/app/ai_instruction/_components/ai-instruction-versions.tsx.ejs +24 -8
  462. package/hedhog/frontend/app/ai_instruction/page.tsx.ejs +80 -15
  463. package/hedhog/frontend/app/configurations/[slug]/components/image-optimization-action.tsx.ejs +166 -0
  464. package/hedhog/frontend/app/configurations/[slug]/components/setting-field.test.tsx.ejs +145 -45
  465. package/hedhog/frontend/app/configurations/[slug]/components/setting-field.tsx.ejs +99 -219
  466. package/hedhog/frontend/app/configurations/[slug]/page.tsx.ejs +19 -1
  467. package/hedhog/frontend/app/configurations/layout.tsx.ejs +19 -5
  468. package/hedhog/frontend/app/dashboard/[slug]/widget-renderer.tsx.ejs +2 -8
  469. package/hedhog/frontend/app/dashboard/components/dynamic-widget.tsx.ejs +3 -0
  470. package/hedhog/frontend/app/dashboard/components/widget-wrapper.tsx.ejs +4 -0
  471. package/hedhog/frontend/app/dashboard/dashboard-home-tabs.tsx.ejs +43 -44
  472. package/hedhog/frontend/app/dashboard/management/tabs/component-roles-tab.tsx.ejs +41 -3
  473. package/hedhog/frontend/app/dashboard/management/tabs/components-tab.tsx.ejs +42 -2
  474. package/hedhog/frontend/app/dashboard/management/tabs/dashboard-roles-tab.tsx.ejs +41 -3
  475. package/hedhog/frontend/app/dashboard/management/tabs/dashboards-tab.tsx.ejs +39 -4
  476. package/hedhog/frontend/app/dashboard/management/tabs/items-tab.tsx.ejs +42 -3
  477. package/hedhog/frontend/app/incidents/page.tsx.ejs +60 -31
  478. package/hedhog/frontend/app/integration/profiles/page.tsx.ejs +45 -5
  479. package/hedhog/frontend/app/integrations-webhooks/page.tsx.ejs +92 -15
  480. package/hedhog/frontend/app/mail/log/page.tsx.ejs +109 -61
  481. package/hedhog/frontend/app/mail/template/page.tsx.ejs +125 -23
  482. package/hedhog/frontend/app/mcp_chat/chat-components.tsx.ejs +13 -15
  483. package/hedhog/frontend/app/mcp_chat/page.tsx.ejs +116 -110
  484. package/hedhog/frontend/app/message-templates/_components/message-template-sheet.tsx.ejs +245 -0
  485. package/hedhog/frontend/app/message-templates/_lib/types.ts.ejs +24 -0
  486. package/hedhog/frontend/app/message-templates/page.tsx.ejs +182 -0
  487. package/hedhog/frontend/app/pages/_components/page-wizard-sheet.tsx.ejs +1 -0
  488. package/hedhog/frontend/app/pages/page.tsx.ejs +94 -9
  489. package/hedhog/frontend/app/roles/menus.tsx.ejs +4 -4
  490. package/hedhog/frontend/app/roles/routes.tsx.ejs +4 -4
  491. package/hedhog/frontend/app/roles/users.tsx.ejs +4 -4
  492. package/hedhog/frontend/app/setting-list/page.tsx.ejs +71 -9
  493. package/hedhog/frontend/app/users/page.tsx.ejs +77 -67
  494. package/hedhog/frontend/messages/en.json +183 -36
  495. package/hedhog/frontend/messages/pt.json +183 -36
  496. package/hedhog/table/cron_lock.yaml +17 -0
  497. package/hedhog/table/file.yaml +13 -1
  498. package/hedhog/table/file_upload_chunk.yaml +23 -0
  499. package/hedhog/table/file_upload_ticket.yaml +67 -0
  500. package/hedhog/table/mcp_tool_call_log.yaml +30 -22
  501. package/hedhog/table/message_template.yaml +33 -0
  502. package/hedhog/table/setting.yaml +8 -0
  503. package/hedhog/table/user_session.yaml +36 -1
  504. package/package.json +8 -6
  505. package/src/ai/ai-agent.sort.ts +21 -0
  506. package/src/ai/ai.service.spec.ts +173 -1
  507. package/src/ai/ai.service.ts +64 -193
  508. package/src/ai-instruction/ai-instruction.service.ts +32 -28
  509. package/src/ai-instruction/ai-instruction.sort.ts +32 -0
  510. package/src/auth/auth.module.ts +8 -1
  511. package/src/auth/auth.service.spec.ts +108 -1
  512. package/src/auth/auth.service.ts +59 -5
  513. package/src/auth/guards/auth.guard.ts +9 -1
  514. package/src/authorize/authorize.controller.ts +126 -11
  515. package/src/authorize/authorize.errors.ts +55 -0
  516. package/src/authorize/authorize.module.ts +6 -1
  517. package/src/authorize/authorize.service.spec.ts +379 -7
  518. package/src/authorize/authorize.service.ts +309 -23
  519. package/src/authorize/dto/authorize-info.dto.ts +21 -3
  520. package/src/authorize/dto/consent.dto.ts +21 -3
  521. package/src/authorize/dto/token.dto.ts +24 -2
  522. package/src/authorize/oauth-exception.filter.ts +58 -0
  523. package/src/authorize/oauth-metadata.service.ts +67 -0
  524. package/src/authorize/well-known.controller.spec.ts +84 -0
  525. package/src/authorize/well-known.controller.ts +96 -0
  526. package/src/captcha/captcha.service.spec.ts +211 -4
  527. package/src/captcha/captcha.service.ts +127 -10
  528. package/src/core.module.ts +6 -0
  529. package/src/dashboard/dashboard-component-role/dashboard-component-role.service.ts +2 -3
  530. package/src/dashboard/dashboard-component-role/dashboard-component-role.sort.ts +18 -0
  531. package/src/dashboard/dashboard-item/dashboard-item.service.ts +2 -3
  532. package/src/dashboard/dashboard-item/dashboard-item.sort.ts +19 -0
  533. package/src/dashboard/dashboard-role/dashboard-role.service.ts +2 -3
  534. package/src/dashboard/dashboard-role/dashboard-role.sort.ts +16 -0
  535. package/src/file/file-upload-ticket.service.spec.ts +422 -0
  536. package/src/file/file-upload-ticket.service.ts +513 -0
  537. package/src/file/file.controller.ts +65 -0
  538. package/src/file/file.module.ts +14 -2
  539. package/src/file/file.service.spec.ts +94 -0
  540. package/src/file/file.service.ts +432 -30
  541. package/src/file/filename-encoding.util.spec.ts +54 -0
  542. package/src/file/filename-encoding.util.ts +67 -0
  543. package/src/file/image-optimization.service.spec.ts +156 -19
  544. package/src/file/image-optimization.service.ts +106 -21
  545. package/src/file/mcp-file-source.schema.ts +83 -0
  546. package/src/file/mcp-file-source.service.spec.ts +473 -0
  547. package/src/file/mcp-file-source.service.ts +445 -0
  548. package/src/file/mimetype-sniff.util.spec.ts +126 -0
  549. package/src/file/mimetype-sniff.util.ts +265 -0
  550. package/src/file/remote-fetch.util.spec.ts +117 -0
  551. package/src/file/remote-fetch.util.ts +330 -0
  552. package/src/impersonation/dto/start-impersonation.dto.ts +5 -2
  553. package/src/impersonation/impersonation.service.spec.ts +24 -1
  554. package/src/impersonation/impersonation.service.ts +14 -4
  555. package/src/incident/incident.controller.ts +9 -1
  556. package/src/incident/incident.service.ts +7 -0
  557. package/src/index.ts +17 -0
  558. package/src/integration-profile/integration-profile.secrets.ts +7 -0
  559. package/src/integration-profile/integration-profile.service.ts +7 -64
  560. package/src/integration-profile/integration-profile.utils.spec.ts +9 -0
  561. package/src/integration-profile/integration-profile.utils.ts +5 -5
  562. package/src/integration-profile/testers/index.ts +2 -0
  563. package/src/integration-profile/testers/remaining.testers.spec.ts +79 -0
  564. package/src/integration-profile/testers/shipping.testers.ts +94 -0
  565. package/src/mail/dto/send.dto.ts +6 -1
  566. package/src/mail/mail-template.spec.ts +58 -1
  567. package/src/mail/mail.service.spec.ts +112 -0
  568. package/src/mail/mail.service.ts +42 -4
  569. package/src/mail-sent/mail-sent.service.ts +3 -0
  570. package/src/mail-sent/mail-sent.sort.ts +19 -0
  571. package/src/mcp/filters/mcp-challenge.filter.spec.ts +76 -0
  572. package/src/mcp/filters/mcp-challenge.filter.ts +70 -0
  573. package/src/mcp/guards/mcp-auth.guard.spec.ts +51 -2
  574. package/src/mcp/guards/mcp-auth.guard.ts +24 -1
  575. package/src/mcp/guards/mcp-permission.guard.spec.ts +109 -15
  576. package/src/mcp/guards/mcp-permission.guard.ts +76 -51
  577. package/src/mcp/mcp-audit.service.spec.ts +107 -0
  578. package/src/mcp/mcp-audit.service.ts +37 -1
  579. package/src/mcp/mcp-permission.service.spec.ts +197 -0
  580. package/src/mcp/mcp-permission.service.ts +184 -0
  581. package/src/mcp/mcp-server.service.spec.ts +84 -2
  582. package/src/mcp/mcp-server.service.ts +111 -87
  583. package/src/mcp/mcp.controller.ts +8 -1
  584. package/src/mcp/mcp.module.ts +5 -1
  585. package/src/mcp/tools/core-ai.mcp-tools.ts +1 -1
  586. package/src/mcp/tools/core-dashboard-items.mcp-tools.ts +1 -1
  587. package/src/mcp/tools/core-dashboard.mcp-tools.ts +1 -1
  588. package/src/mcp/tools/core-event-webhooks.mcp-tools.ts +1 -2
  589. package/src/mcp/tools/core-files.mcp-tools.ts +202 -22
  590. package/src/mcp/tools/core-integration-events.mcp-tools.ts +1 -1
  591. package/src/mcp/tools/core-mail-sent.mcp-tools.ts +1 -1
  592. package/src/mcp/tools/core-mail.mcp-tools.ts +1 -1
  593. package/src/mcp/tools/core-menus.mcp-tools.ts +1 -2
  594. package/src/mcp/tools/core-notifications.mcp-tools.ts +0 -1
  595. package/src/mcp/tools/core-roles.mcp-tools.ts +1 -5
  596. package/src/mcp/tools/core-routes.mcp-tools.ts +1 -3
  597. package/src/mcp/tools/core-screens.mcp-tools.ts +1 -3
  598. package/src/mcp/tools/core-sessions.mcp-tools.ts +0 -2
  599. package/src/mcp/tools/core-settings.mcp-tools.ts +1 -2
  600. package/src/mcp/tools/core-users.mcp-tools.ts +1 -1
  601. package/src/mcp/tools/core-webhooks.mcp-tools.ts +1 -2
  602. package/src/mcp/types/mcp-context.type.ts +15 -6
  603. package/src/mcp-chat/mcp-chat.service.ts +8 -0
  604. package/src/meeting/meeting-provider.registry.ts +121 -0
  605. package/src/meeting/meeting.constants.ts +74 -0
  606. package/src/menu/menu.service.spec.ts +89 -0
  607. package/src/menu/menu.service.ts +29 -11
  608. package/src/message-template/dto/update-message-template.dto.ts +22 -0
  609. package/src/message-template/message-template-admin.service.spec.ts +163 -0
  610. package/src/message-template/message-template-admin.service.ts +239 -0
  611. package/src/message-template/message-template.controller.ts +52 -0
  612. package/src/message-template/message-template.module.ts +21 -0
  613. package/src/message-template/message-template.registry.spec.ts +62 -0
  614. package/src/message-template/message-template.registry.ts +125 -0
  615. package/src/message-template/message-template.service.spec.ts +149 -0
  616. package/src/message-template/message-template.service.ts +149 -0
  617. package/src/notification/notification.constants.ts +10 -0
  618. package/src/notification/notification.module.ts +3 -0
  619. package/src/notification/notification.service.spec.ts +75 -1
  620. package/src/notification/notification.service.ts +39 -1
  621. package/src/oauth/oauth.controller.ts +0 -1
  622. package/src/oauth/oauth.errors.ts +7 -0
  623. package/src/oauth/oauth.module.ts +6 -1
  624. package/src/oauth/oauth.service.spec.ts +58 -7
  625. package/src/oauth/oauth.service.ts +71 -32
  626. package/src/oauth/providers/abstract.provider.spec.ts +192 -0
  627. package/src/oauth/providers/abstract.provider.ts +46 -14
  628. package/src/oauth/providers/github.provider.ts +57 -34
  629. package/src/oauth/providers/microsoft-entra-id.provider.ts +8 -1
  630. package/src/observability/monitored-cron.spec.ts +164 -31
  631. package/src/observability/monitored-cron.ts +154 -62
  632. package/src/profile/dto/change-password.dto.ts +25 -7
  633. package/src/profile/profile.service.spec.ts +97 -0
  634. package/src/profile/profile.service.ts +9 -3
  635. package/src/realtime/realtime-tick.coalescer.spec.ts +92 -0
  636. package/src/realtime/realtime-tick.coalescer.ts +60 -0
  637. package/src/realtime/realtime.service.spec.ts +33 -0
  638. package/src/realtime/realtime.service.ts +28 -2
  639. package/src/redis/redis-kv.service.ts +261 -0
  640. package/src/redis/redis-master.spec.ts +111 -0
  641. package/src/redis/redis-master.ts +86 -0
  642. package/src/redis/redis-pubsub.ts +27 -3
  643. package/src/redis/redis.module.ts +17 -0
  644. package/src/session/session.service.spec.ts +121 -42
  645. package/src/session/session.service.ts +279 -82
  646. package/src/setting/setting.service.ts +44 -3
  647. package/src/task/task.service.spec.ts +41 -0
  648. package/src/task/task.service.ts +53 -13
  649. package/src/token/token.service.spec.ts +90 -0
  650. package/src/token/token.service.ts +48 -2
  651. package/src/user/user-credential.util.ts +14 -5
  652. package/src/user/user.service.ts +2 -12
  653. package/src/user/user.sort.ts +25 -0
  654. package/src/utils/abbreviate-name.spec.ts +50 -0
  655. package/src/utils/abbreviate-name.ts +44 -0
  656. package/src/utils/date-range-query.dto.ts +56 -0
  657. package/src/utils/date-range.spec.ts +175 -0
  658. package/src/utils/date-range.ts +246 -0
  659. package/src/webhook-integration/webhook-utils.spec.ts +67 -0
  660. package/src/webhook-integration/webhook-utils.ts +26 -0
  661. package/src/whatsapp-sender/whatsapp-recipients.spec.ts +89 -0
  662. package/src/whatsapp-sender/whatsapp-recipients.ts +83 -0
  663. package/src/whatsapp-sender/whatsapp-sender.service.spec.ts +112 -0
  664. package/src/whatsapp-sender/whatsapp-sender.service.ts +58 -5
@@ -32,7 +32,7 @@ export class CoreRolesMcpTools {
32
32
  page: args.page ?? 1,
33
33
  pageSize: args.pageSize ?? 20,
34
34
  search: args.search ?? '',
35
- sortField: args.sortField ?? 'id',
35
+ ...(args.sortField ? { sortField: args.sortField } : {}),
36
36
  sortOrder: (args.sortOrder as any) ?? 'asc',
37
37
  fields: '',
38
38
  },
@@ -130,7 +130,6 @@ export class CoreRolesMcpTools {
130
130
  page: args.page ?? 1,
131
131
  pageSize: args.pageSize ?? 20,
132
132
  search: '',
133
- sortField: 'id',
134
133
  sortOrder: PageOrderDirection.Asc,
135
134
  fields: '',
136
135
  });
@@ -171,7 +170,6 @@ export class CoreRolesMcpTools {
171
170
  page: args.page ?? 1,
172
171
  pageSize: args.pageSize ?? 20,
173
172
  search: '',
174
- sortField: 'id',
175
173
  sortOrder: PageOrderDirection.Asc,
176
174
  fields: '',
177
175
  });
@@ -219,7 +217,6 @@ export class CoreRolesMcpTools {
219
217
  page: args.page ?? 1,
220
218
  pageSize: args.pageSize ?? 20,
221
219
  search: '',
222
- sortField: 'id',
223
220
  sortOrder: PageOrderDirection.Asc,
224
221
  fields: '',
225
222
  },
@@ -264,7 +261,6 @@ export class CoreRolesMcpTools {
264
261
  page: args.page ?? 1,
265
262
  pageSize: args.pageSize ?? 20,
266
263
  search: '',
267
- sortField: 'id',
268
264
  sortOrder: PageOrderDirection.Asc,
269
265
  fields: '',
270
266
  });
@@ -31,7 +31,7 @@ export class CoreRoutesMcpTools {
31
31
  page: args.page ?? 1,
32
32
  pageSize: args.pageSize ?? 20,
33
33
  search: args.search ?? '',
34
- sortField: args.sortField ?? 'id',
34
+ ...(args.sortField ? { sortField: args.sortField } : {}),
35
35
  sortOrder: (args.sortOrder as any) ?? 'asc',
36
36
  fields: '',
37
37
  });
@@ -131,7 +131,6 @@ export class CoreRoutesMcpTools {
131
131
  page: args.page ?? 1,
132
132
  pageSize: args.pageSize ?? 20,
133
133
  search: '',
134
- sortField: 'id',
135
134
  sortOrder: PageOrderDirection.Asc,
136
135
  fields: '',
137
136
  });
@@ -172,7 +171,6 @@ export class CoreRoutesMcpTools {
172
171
  page: args.page ?? 1,
173
172
  pageSize: args.pageSize ?? 20,
174
173
  search: '',
175
- sortField: 'id',
176
174
  sortOrder: PageOrderDirection.Asc,
177
175
  fields: '',
178
176
  });
@@ -31,7 +31,7 @@ export class CoreScreensMcpTools {
31
31
  page: args.page ?? 1,
32
32
  pageSize: args.pageSize ?? 20,
33
33
  search: args.search ?? '',
34
- sortField: args.sortField ?? 'id',
34
+ ...(args.sortField ? { sortField: args.sortField } : {}),
35
35
  sortOrder: (args.sortOrder as any) ?? 'asc',
36
36
  fields: '',
37
37
  });
@@ -121,7 +121,6 @@ export class CoreScreensMcpTools {
121
121
  page: args.page ?? 1,
122
122
  pageSize: args.pageSize ?? 20,
123
123
  search: '',
124
- sortField: 'id',
125
124
  sortOrder: PageOrderDirection.Asc,
126
125
  fields: '',
127
126
  });
@@ -162,7 +161,6 @@ export class CoreScreensMcpTools {
162
161
  page: args.page ?? 1,
163
162
  pageSize: args.pageSize ?? 20,
164
163
  search: '',
165
- sortField: 'id',
166
164
  sortOrder: PageOrderDirection.Asc,
167
165
  fields: '',
168
166
  });
@@ -26,7 +26,6 @@ export class CoreSessionsMcpTools {
26
26
  page: args.page ?? 1,
27
27
  pageSize: args.pageSize ?? 20,
28
28
  search: '',
29
- sortField: 'id',
30
29
  sortOrder: PageOrderDirection.Asc,
31
30
  fields: '',
32
31
  },
@@ -53,7 +52,6 @@ export class CoreSessionsMcpTools {
53
52
  page: args.page ?? 1,
54
53
  pageSize: args.pageSize ?? 20,
55
54
  search: '',
56
- sortField: 'id',
57
55
  sortOrder: PageOrderDirection.Asc,
58
56
  fields: '',
59
57
  },
@@ -74,7 +74,7 @@ export class CoreSettingsMcpTools {
74
74
  page: args.page ?? 1,
75
75
  pageSize: args.pageSize ?? 20,
76
76
  search: args.search ?? '',
77
- sortField: args.sortField ?? 'id',
77
+ ...(args.sortField ? { sortField: args.sortField } : {}),
78
78
  sortOrder: (args.sortOrder as any) ?? 'asc',
79
79
  fields: '',
80
80
  });
@@ -117,7 +117,6 @@ export class CoreSettingsMcpTools {
117
117
  page: args.page ?? 1,
118
118
  pageSize: args.pageSize ?? 20,
119
119
  search: args.search ?? '',
120
- sortField: 'id',
121
120
  sortOrder: 'asc' as any,
122
121
  fields: '',
123
122
  });
@@ -46,7 +46,7 @@ export class CoreUsersMcpTools {
46
46
  page: args.page ?? 1,
47
47
  pageSize: args.pageSize ?? 20,
48
48
  search: args.search ?? '',
49
- sortField: args.sortField ?? 'id',
49
+ ...(args.sortField ? { sortField: args.sortField } : {}),
50
50
  sortOrder: (args.sortOrder as any) ?? 'asc',
51
51
  fields: '',
52
52
  });
@@ -30,7 +30,7 @@ export class CoreWebhooksMcpTools {
30
30
  page: args.page ?? 1,
31
31
  pageSize: args.pageSize ?? 20,
32
32
  search: args.search ?? '',
33
- sortField: args.sortField ?? 'id',
33
+ ...(args.sortField ? { sortField: args.sortField } : {}),
34
34
  sortOrder: (args.sortOrder as any) ?? 'asc',
35
35
  fields: '',
36
36
  });
@@ -191,7 +191,6 @@ export class CoreWebhooksMcpTools {
191
191
  page: args.page ?? 1,
192
192
  pageSize: args.pageSize ?? 20,
193
193
  search: '',
194
- sortField: 'id',
195
194
  sortOrder: 'desc' as any,
196
195
  fields: '',
197
196
  });
@@ -1,6 +1,15 @@
1
- export type McpContext = {
2
- userId: number;
3
- sessionId: string;
4
- locale: string;
5
- toolName: string;
6
- };
1
+ export type McpContext = {
2
+ userId: number;
3
+ sessionId: string;
4
+ locale: string;
5
+ toolName: string;
6
+ /**
7
+ * Client OAuth externo que originou a chamada (hoje `claude-connector`), ou
8
+ * null para o caminho interno — chave `hedhog_mcp_`, JWT de login, mcp-chat.
9
+ *
10
+ * Vale por dois motivos: a auditoria precisa distinguir uma acao feita pelo
11
+ * Claude Desktop de uma feita pelo Claude Code, e o teto de permissao so se
12
+ * aplica a cliente externo.
13
+ */
14
+ clientId: string | null;
15
+ };
@@ -562,6 +562,10 @@ export class McpChatService {
562
562
  sessionId: '',
563
563
  locale,
564
564
  toolName: originalName,
565
+ // O chat do admin e caminho interno: quem chama e o proprio
566
+ // operador, com a tela na frente. Nao ha client OAuth externo, e
567
+ // por isso o teto do conector nao se aplica aqui.
568
+ clientId: null,
565
569
  };
566
570
  try {
567
571
  const result = await entry.handler(args, context);
@@ -746,6 +750,10 @@ export class McpChatService {
746
750
  sessionId: '',
747
751
  locale,
748
752
  toolName: originalName,
753
+ // O chat do admin e caminho interno: quem chama e o proprio
754
+ // operador, com a tela na frente. Nao ha client OAuth externo, e
755
+ // por isso o teto do conector nao se aplica aqui.
756
+ clientId: null,
749
757
  };
750
758
  try {
751
759
  const result = await entry.handler(args ?? {}, context);
@@ -25,6 +25,12 @@ export interface CreateMeetingInput {
25
25
  * participante comum.
26
26
  */
27
27
  coOrganizerUserIds?: number[];
28
+ /**
29
+ * E-mails/UPNs adicionais do Entra ID a coorganizar, além dos resolvidos por
30
+ * {@link coOrganizerUserIds}. Resolvidos pelo provedor — quem não existir no
31
+ * diretório é apenas ignorado, nunca falha a criação da reunião.
32
+ */
33
+ coOrganizerEmails?: string[];
28
34
  /** Convidados do evento de calendário. */
29
35
  attendeeEmails?: string[];
30
36
  /** Local do evento (aula presencial/híbrida com reunião gerenciada). */
@@ -77,6 +83,40 @@ export interface UpdateMeetingDetailsInput {
77
83
  description?: string | null;
78
84
  }
79
85
 
86
+ /**
87
+ * Pedido de troca dos coorganizadores extras de uma reunião já existente.
88
+ *
89
+ * Separado de `createMeeting` pelo mesmo motivo de `updateAttendees`: corrigir
90
+ * a reunião de uma aula que já foi criada não pode gerar link novo. Só cobre
91
+ * os coorganizadores extras (por e-mail) — o coorganizador derivado do
92
+ * instrutor não é tocado por este caminho.
93
+ */
94
+ export interface UpdateMeetingCoOrganizersInput {
95
+ sourceModule: string;
96
+ sourceEntity: string;
97
+ sourceEntityId: string;
98
+ coOrganizerEmails: string[];
99
+ }
100
+
101
+ /**
102
+ * Estado da tarefa que traz a gravação do provedor para o storage local.
103
+ *
104
+ * Descrito em termos genéricos de propósito: a origem precisa saber se a
105
+ * importação está andando, travou ou vai retentar, mas não pode depender de
106
+ * como o provedor a executa. Hoje é um job da fila do módulo Microsoft; num
107
+ * provedor com webhook não haveria job nenhum, e o contrato continua valendo.
108
+ */
109
+ export interface MeetingRecordingImport {
110
+ status: 'pending' | 'running' | 'done' | 'failed';
111
+ attempts: number;
112
+ maxAttempts: number;
113
+ lastError: string | null;
114
+ startedAt: Date | null;
115
+ finishedAt: Date | null;
116
+ /** Quando a próxima tentativa acontece, se houver uma agendada. */
117
+ nextRetryAt: Date | null;
118
+ }
119
+
80
120
  /**
81
121
  * Estado de uma reunião, na forma em que o módulo de origem precisa ver.
82
122
  *
@@ -107,6 +147,12 @@ export interface MeetingSummary {
107
147
  * acompanha a turma.
108
148
  */
109
149
  attendeeEmails: string[];
150
+ /**
151
+ * Coorganizadores extras (por e-mail) atualmente aplicados na reunião, para
152
+ * o módulo de origem comparar antes de mandar atualizar — mesmo motivo de
153
+ * `attendeeEmails`. Não inclui o coorganizador derivado do instrutor.
154
+ */
155
+ coOrganizerEmails: string[];
110
156
  /** Estado da importação da gravação, quando `autoRecord` está ligado. */
111
157
  recordingStatus:
112
158
  | 'not_requested'
@@ -116,6 +162,60 @@ export interface MeetingSummary {
116
162
  | 'failed';
117
163
  recordingFileId: number | null;
118
164
  lastError: string | null;
165
+ /**
166
+ * Quando o provedor procurou a gravação pela última vez, e quantas vezes já
167
+ * procurou.
168
+ *
169
+ * Existe para a origem distinguir "ainda não deu tempo" de "está procurando e
170
+ * não acha": os dois são `recordingStatus: 'pending'`, e sem isto a tela do
171
+ * módulo de origem só pode dizer "aguardando", que é a mesma frase por horas.
172
+ */
173
+ recordingCheckedAt: Date | null;
174
+ recordingAttempts: number;
175
+ recordingImportedAt: Date | null;
176
+ /**
177
+ * Janela em que o provedor procura a gravação, já resolvida em instantes.
178
+ *
179
+ * Derivada aqui, e não na origem, porque a carência antes da primeira busca e
180
+ * a largura da janela são conhecimento do provedor — o LMS não deve saber que
181
+ * o Teams leva 15 minutos para publicar nem que a busca desiste em 48 h.
182
+ * `null` quando não há gravação pedida ou o provedor não expõe a janela.
183
+ */
184
+ recordingSearchStartsAt: Date | null;
185
+ recordingSearchExpiresAt: Date | null;
186
+ /**
187
+ * Andamento do download da gravação, quando o provedor já o iniciou.
188
+ *
189
+ * Vem do provedor e não da origem porque só ele sabe como importa — a
190
+ * alternativa seria o módulo de origem vasculhar a fila de outro módulo por
191
+ * `source_entity`, que é exatamente o acoplamento que este contrato evita.
192
+ */
193
+ recordingImport: MeetingRecordingImport | null;
194
+ }
195
+
196
+ /**
197
+ * Pedido do conteúdo de um anexo do chat de uma reunião.
198
+ *
199
+ * A origem repassa os identificadores que recebeu no evento do chat; traduzi-los
200
+ * em chamadas ao provedor é problema de quem implementa.
201
+ */
202
+ export interface FetchMeetingChatAttachmentInput {
203
+ sourceModule: string;
204
+ sourceEntity: string;
205
+ sourceEntityId: string;
206
+ providerMessageId: string;
207
+ providerAttachmentId: string;
208
+ /** O que veio no evento; alguns provedores só sabem baixar por ele. */
209
+ contentUrl?: string | null;
210
+ /** Acima disso o provedor desiste antes de transferir. */
211
+ maxBytes?: number;
212
+ }
213
+
214
+ export interface MeetingChatAttachmentContent {
215
+ buffer: Buffer;
216
+ filename: string;
217
+ mimetype: string;
218
+ size: number;
119
219
  }
120
220
 
121
221
  /**
@@ -146,8 +246,29 @@ export interface IMeetingProvider {
146
246
  * link novo. Tolerante a reunião inexistente (mesmo padrão de updateAttendees).
147
247
  */
148
248
  updateDetails(input: UpdateMeetingDetailsInput): Promise<void>;
249
+ /**
250
+ * Troca os coorganizadores extras de uma reunião já criada, sem gerar link
251
+ * novo. Tolerante a reunião inexistente (mesmo padrão de updateAttendees).
252
+ */
253
+ updateCoOrganizers(input: UpdateMeetingCoOrganizersInput): Promise<void>;
149
254
  /** Estado das reuniões das origens informadas, para a UI do módulo de origem. */
150
255
  findBySource(ref: MeetingSourceRef): Promise<MeetingSummary[]>;
256
+ /**
257
+ * Baixa o conteúdo de um anexo do chat da reunião.
258
+ *
259
+ * Opcional de propósito: o chat é o terceiro artefato pós-reunião e nem todo
260
+ * provedor o expõe. Quem chama testa a existência do método antes — assim um
261
+ * provedor mais antigo continua válido sem alteração.
262
+ *
263
+ * Devolve `null` quando o anexo não pôde ser lido (permissão do arquivo,
264
+ * item removido, tamanho acima do teto). Não é erro: o arquivo do anexo mora
265
+ * no drive de quem o enviou, não na caixa que organizou a reunião, então
266
+ * negativa é desfecho esperado e a origem precisa de um plano B em vez de uma
267
+ * exceção.
268
+ */
269
+ fetchChatAttachment?(
270
+ input: FetchMeetingChatAttachmentInput,
271
+ ): Promise<MeetingChatAttachmentContent | null>;
151
272
  }
152
273
 
153
274
  /**
@@ -51,3 +51,77 @@ export interface MeetingAttendanceAvailablePayload {
51
51
  providerMeetingId?: string | null;
52
52
  records: MeetingAttendanceRecord[];
53
53
  }
54
+
55
+ /**
56
+ * Evento publicado quando o chat de uma reunião foi capturado.
57
+ *
58
+ * Terceiro do mesmo desenho, depois de gravação e presença, e pela mesma razão:
59
+ * o provedor sabe o que foi escrito no chat, mas não sabe o que é uma aula; o
60
+ * módulo de origem sabe quem é o instrutor, mas não conhece o Graph.
61
+ */
62
+ export const MEETING_CHAT_AVAILABLE_EVENT = 'microsoft.meeting.chat.available';
63
+
64
+ /** Arquivo ou imagem que acompanha uma mensagem do chat. */
65
+ export interface MeetingChatAttachment {
66
+ providerAttachmentId: string;
67
+ /**
68
+ * `attachment` é arquivo compartilhado na conversa; `hosted_content` é imagem
69
+ * colada no corpo da mensagem. A origem costuma querer só o primeiro — print
70
+ * de tela raramente é material de aula.
71
+ */
72
+ kind: 'attachment' | 'hosted_content';
73
+ name: string | null;
74
+ contentType: string | null;
75
+ /**
76
+ * Endereço do arquivo no provedor. Não é baixável sem token: serve de rastro
77
+ * e é o que a origem devolve ao provedor para pedir o conteúdo.
78
+ */
79
+ contentUrl: string | null;
80
+ }
81
+
82
+ /** Uma mensagem do chat, na forma em que a origem precisa ver. */
83
+ export interface MeetingChatMessage {
84
+ providerMessageId: string;
85
+ /** Mensagem à qual esta responde, quando houver. */
86
+ replyToId: string | null;
87
+ /**
88
+ * Nulo quando o provedor não identificou quem escreveu (convidado anônimo,
89
+ * aplicativo, ou evento de sistema). A origem decide o que fazer — e quando a
90
+ * decisão publica conteúdo para terceiros, o certo é descartar: casar por
91
+ * nome confundiria homônimos.
92
+ */
93
+ senderEmail: string | null;
94
+ senderDisplayName: string;
95
+ /** ISO-8601. */
96
+ sentAt: string;
97
+ /** `message`, `systemEventMessage`, … — como o provedor classificou. */
98
+ messageType: string;
99
+ /**
100
+ * Texto puro, nunca HTML.
101
+ *
102
+ * O payload é persistido como jsonb no outbox, e o HTML do Teams é gordo o
103
+ * bastante para que uma aula inteira não caiba. Quem precisar do original lê
104
+ * a tabela do provedor.
105
+ */
106
+ text: string;
107
+ attachments: MeetingChatAttachment[];
108
+ }
109
+
110
+ export interface MeetingChatAvailablePayload {
111
+ sourceModule: string;
112
+ sourceEntity: string;
113
+ sourceEntityId: string;
114
+ providerMeetingId?: string | null;
115
+ providerChatId?: string | null;
116
+ /** Quantas mensagens o chat tem de verdade, mesmo se `messages` foi cortado. */
117
+ messageCount: number;
118
+ firstMessageAt: string | null;
119
+ lastMessageAt: string | null;
120
+ /** Mensagens em ordem cronológica, limitadas ao teto do evento. */
121
+ messages: MeetingChatMessage[];
122
+ /**
123
+ * `messages` não traz tudo: o chat passou do teto do evento ou da paginação
124
+ * do provedor. `messageCount` continua sendo o número real.
125
+ */
126
+ truncated: boolean;
127
+ }
@@ -74,3 +74,92 @@ describe('MenuService.ensureValidParent', () => {
74
74
  await expect(call('en', 5, 10)).rejects.toThrow(BadRequestException);
75
75
  });
76
76
  });
77
+
78
+ describe('MenuService.getMenus', () => {
79
+ let prisma: any;
80
+ let service: MenuService;
81
+
82
+ const row = (id: number, menuId: number | null, name: string) => ({
83
+ id,
84
+ menu_id: menuId,
85
+ order: id,
86
+ menu_locale: [{ name }],
87
+ });
88
+
89
+ beforeEach(() => {
90
+ prisma = {
91
+ user: { count: jest.fn<any>().mockResolvedValue(1) },
92
+ menu: { findMany: jest.fn<any>().mockResolvedValue([]) },
93
+ };
94
+ service = makeService(prisma);
95
+ });
96
+
97
+ afterEach(() => {
98
+ jest.clearAllMocks();
99
+ });
100
+
101
+ it('lança BadRequestException quando o usuário não existe', async () => {
102
+ prisma.user.count.mockResolvedValue(0);
103
+ await expect(service.getMenus('en', 42)).rejects.toThrow(BadRequestException);
104
+ expect(prisma.menu.findMany).not.toHaveBeenCalled();
105
+ });
106
+
107
+ it('monta a árvore inteira com uma única consulta', async () => {
108
+ prisma.menu.findMany.mockResolvedValue([
109
+ row(1, null, 'LMS'),
110
+ row(2, 1, 'Cursos'),
111
+ row(3, 2, 'Estrutura'),
112
+ row(4, null, 'CRM'),
113
+ ]);
114
+
115
+ const tree = await service.getMenus('en', 42);
116
+
117
+ // O ponto da correção: uma query para tudo, não uma por nó.
118
+ expect(prisma.menu.findMany).toHaveBeenCalledTimes(1);
119
+ expect(prisma.user.count).toHaveBeenCalledTimes(1);
120
+
121
+ expect(tree.map((m: any) => m.id)).toEqual([1, 4]);
122
+ expect(tree[0].name).toBe('LMS');
123
+ expect(tree[0].menu.map((m: any) => m.id)).toEqual([2]);
124
+ expect(tree[0].menu[0].menu.map((m: any) => m.id)).toEqual([3]);
125
+ expect(tree[1].menu).toEqual([]);
126
+ });
127
+
128
+ it('não promove a raiz um menu cujo pai o usuário não acessa', async () => {
129
+ // O pai (10) não veio do banco porque o usuário não tem o papel dele; o
130
+ // filho não pode aparecer solto na raiz por causa disso.
131
+ prisma.menu.findMany.mockResolvedValue([
132
+ row(1, null, 'LMS'),
133
+ row(11, 10, 'Filho de menu inacessível'),
134
+ ]);
135
+
136
+ const tree = await service.getMenus('en', 42);
137
+
138
+ expect(tree.map((m: any) => m.id)).toEqual([1]);
139
+ });
140
+
141
+ it('respeita a ordem dos irmãos vinda da consulta', async () => {
142
+ prisma.menu.findMany.mockResolvedValue([
143
+ row(7, 1, 'Segundo'),
144
+ row(1, null, 'Raiz'),
145
+ row(5, 1, 'Primeiro'),
146
+ ]);
147
+
148
+ const tree = await service.getMenus('en', 42);
149
+
150
+ expect(tree[0].menu.map((m: any) => m.id)).toEqual([7, 5]);
151
+ });
152
+
153
+ it('retorna apenas a subárvore quando um menuId é informado', async () => {
154
+ prisma.menu.findMany.mockResolvedValue([
155
+ row(1, null, 'LMS'),
156
+ row(2, 1, 'Cursos'),
157
+ row(3, 2, 'Estrutura'),
158
+ ]);
159
+
160
+ const tree = await service.getMenus('en', 42, 1);
161
+
162
+ expect(tree.map((m: any) => m.id)).toEqual([2]);
163
+ expect(tree[0].menu.map((m: any) => m.id)).toEqual([3]);
164
+ });
165
+ });
@@ -258,7 +258,6 @@ export class MenuService {
258
258
  }
259
259
 
260
260
  async getMenus(locale: string, userId: number, menuId = 0) {
261
-
262
261
  const userExists = await this.prismaService.user.count({
263
262
  where: {
264
263
  id: userId,
@@ -271,13 +270,13 @@ export class MenuService {
271
270
  );
272
271
  }
273
272
 
274
- if (menuId === 0) {
275
- menuId = null;
276
- }
277
-
278
- let menu = (await this.prismaService.menu.findMany({
273
+ // Uma consulta para a árvore inteira, em vez de uma por nó. A versão
274
+ // recursiva anterior repetia esta busca — e o `user.count` acima — a cada
275
+ // nível: com os ~260 itens de menu que as libraries registram, eram
276
+ // centenas de idas ao banco em série e o `/menu/system` levava ~2s a cada
277
+ // navegação do admin, mesmo quando a resposta terminava em 304.
278
+ const rows = (await this.prismaService.menu.findMany({
279
279
  where: {
280
- menu_id: menuId,
281
280
  role_menu: {
282
281
  some: {
283
282
  role: {
@@ -307,13 +306,32 @@ export class MenuService {
307
306
  },
308
307
  })) as unknown[] as any[];
309
308
 
310
- menu = menu.map((m) => itemTranslations('menu_locale', m));
309
+ const childrenByParent = new Map<number | null, any[]>();
310
+
311
+ for (const row of rows) {
312
+ const item = itemTranslations('menu_locale', row) as any;
313
+ const parentId = item.menu_id ?? null;
314
+ const siblings = childrenByParent.get(parentId);
311
315
 
312
- for (let i = 0; i < menu.length; i++) {
313
- menu[i].menu = await this.getMenus(locale, userId, menu[i].id);
316
+ if (siblings) siblings.push(item);
317
+ else childrenByParent.set(parentId, [item]);
314
318
  }
315
319
 
316
- return menu;
320
+ // Descer apenas pelos filhos presentes no resultado preserva a regra
321
+ // anterior: um menu cujo pai o usuário não acessa continua invisível, em
322
+ // vez de subir para a raiz. Os irmãos já vêm ordenados por `order` da
323
+ // consulta, e o agrupamento acima mantém essa ordem.
324
+ const buildTree = (parentId: number | null): any[] => {
325
+ const children = childrenByParent.get(parentId) ?? [];
326
+
327
+ for (const child of children) {
328
+ child.menu = buildTree(child.id);
329
+ }
330
+
331
+ return children;
332
+ };
333
+
334
+ return buildTree(menuId === 0 ? null : menuId);
317
335
  }
318
336
 
319
337
  async getSystemMenu(locale: string, userId: number) {
@@ -0,0 +1,22 @@
1
+ import { IsBoolean, IsObject, IsOptional } from 'class-validator';
2
+
3
+ /**
4
+ * Corpo aceito pela edição de um modelo de mensagem.
5
+ *
6
+ * `slug` fica de fora de propósito: quem procura o modelo é o código, e
7
+ * renomeá-lo pelo painel desligaria o aviso em silêncio. O que se edita aqui é o
8
+ * texto.
9
+ *
10
+ * `name` e `description` também não entram: eles moram no registry, declarados
11
+ * pela library dona do modelo. Deixar editá-los aqui criaria um rótulo que
12
+ * diverge do que o código diz — e a tela não teria como saber qual vale.
13
+ */
14
+ export class UpdateMessageTemplateDTO {
15
+ @IsOptional()
16
+ @IsBoolean()
17
+ is_active?: boolean;
18
+
19
+ @IsOptional()
20
+ @IsObject()
21
+ locale?: Record<string, { body?: string }>;
22
+ }