@hed-hog/core 0.0.399 → 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 (668) 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 +29 -5
  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 +77 -3
  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 +386 -54
  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.service.d.ts +6 -2
  356. package/dist/pairing/pairing.service.d.ts.map +1 -1
  357. package/dist/profile/dto/change-password.dto.d.ts.map +1 -1
  358. package/dist/profile/dto/change-password.dto.js +4 -6
  359. package/dist/profile/dto/change-password.dto.js.map +1 -1
  360. package/dist/profile/profile.controller.d.ts +1 -1
  361. package/dist/profile/profile.service.d.ts +1 -1
  362. package/dist/profile/profile.service.d.ts.map +1 -1
  363. package/dist/profile/profile.service.js +9 -3
  364. package/dist/profile/profile.service.js.map +1 -1
  365. package/dist/realtime/realtime-tick.coalescer.d.ts +34 -0
  366. package/dist/realtime/realtime-tick.coalescer.d.ts.map +1 -0
  367. package/dist/realtime/realtime-tick.coalescer.js +60 -0
  368. package/dist/realtime/realtime-tick.coalescer.js.map +1 -0
  369. package/dist/realtime/realtime.service.d.ts +2 -0
  370. package/dist/realtime/realtime.service.d.ts.map +1 -1
  371. package/dist/realtime/realtime.service.js +22 -2
  372. package/dist/realtime/realtime.service.js.map +1 -1
  373. package/dist/redis/redis-kv.service.d.ts +90 -0
  374. package/dist/redis/redis-kv.service.d.ts.map +1 -0
  375. package/dist/redis/redis-kv.service.js +247 -0
  376. package/dist/redis/redis-kv.service.js.map +1 -0
  377. package/dist/redis/redis-master.d.ts +29 -0
  378. package/dist/redis/redis-master.d.ts.map +1 -0
  379. package/dist/redis/redis-master.js +81 -0
  380. package/dist/redis/redis-master.js.map +1 -0
  381. package/dist/redis/redis-pubsub.d.ts +12 -0
  382. package/dist/redis/redis-pubsub.d.ts.map +1 -1
  383. package/dist/redis/redis-pubsub.js +25 -2
  384. package/dist/redis/redis-pubsub.js.map +1 -1
  385. package/dist/redis/redis.module.d.ts +11 -0
  386. package/dist/redis/redis.module.d.ts.map +1 -0
  387. package/dist/redis/redis.module.js +30 -0
  388. package/dist/redis/redis.module.js.map +1 -0
  389. package/dist/session/session.controller.d.ts +6 -2
  390. package/dist/session/session.controller.d.ts.map +1 -1
  391. package/dist/session/session.service.d.ts +118 -15
  392. package/dist/session/session.service.d.ts.map +1 -1
  393. package/dist/session/session.service.js +251 -77
  394. package/dist/session/session.service.js.map +1 -1
  395. package/dist/setting/setting.controller.d.ts +5 -0
  396. package/dist/setting/setting.controller.d.ts.map +1 -1
  397. package/dist/setting/setting.service.d.ts +7 -0
  398. package/dist/setting/setting.service.d.ts.map +1 -1
  399. package/dist/setting/setting.service.js +38 -3
  400. package/dist/setting/setting.service.js.map +1 -1
  401. package/dist/task/task.service.d.ts +17 -0
  402. package/dist/task/task.service.d.ts.map +1 -1
  403. package/dist/task/task.service.js +48 -13
  404. package/dist/task/task.service.js.map +1 -1
  405. package/dist/token/token.service.d.ts +19 -1
  406. package/dist/token/token.service.d.ts.map +1 -1
  407. package/dist/token/token.service.js +39 -2
  408. package/dist/token/token.service.js.map +1 -1
  409. package/dist/user/user-credential.util.d.ts +10 -0
  410. package/dist/user/user-credential.util.d.ts.map +1 -1
  411. package/dist/user/user-credential.util.js +14 -1
  412. package/dist/user/user-credential.util.js.map +1 -1
  413. package/dist/user/user.service.d.ts +12 -4
  414. package/dist/user/user.service.d.ts.map +1 -1
  415. package/dist/user/user.service.js +2 -11
  416. package/dist/user/user.service.js.map +1 -1
  417. package/dist/user/user.sort.d.ts +16 -0
  418. package/dist/user/user.sort.d.ts.map +1 -0
  419. package/dist/user/user.sort.js +25 -0
  420. package/dist/user/user.sort.js.map +1 -0
  421. package/dist/utils/abbreviate-name.d.ts +13 -0
  422. package/dist/utils/abbreviate-name.d.ts.map +1 -0
  423. package/dist/utils/abbreviate-name.js +42 -0
  424. package/dist/utils/abbreviate-name.js.map +1 -0
  425. package/dist/utils/date-range-query.dto.d.ts +11 -0
  426. package/dist/utils/date-range-query.dto.d.ts.map +1 -0
  427. package/dist/utils/date-range-query.dto.js +63 -0
  428. package/dist/utils/date-range-query.dto.js.map +1 -0
  429. package/dist/utils/date-range.d.ts +96 -0
  430. package/dist/utils/date-range.d.ts.map +1 -0
  431. package/dist/utils/date-range.js +172 -0
  432. package/dist/utils/date-range.js.map +1 -0
  433. package/dist/webhook-integration/webhook-utils.d.ts.map +1 -1
  434. package/dist/webhook-integration/webhook-utils.js +24 -0
  435. package/dist/webhook-integration/webhook-utils.js.map +1 -1
  436. package/dist/whatsapp-sender/whatsapp-recipients.d.ts +49 -0
  437. package/dist/whatsapp-sender/whatsapp-recipients.d.ts.map +1 -0
  438. package/dist/whatsapp-sender/whatsapp-recipients.js +66 -0
  439. package/dist/whatsapp-sender/whatsapp-recipients.js.map +1 -0
  440. package/dist/whatsapp-sender/whatsapp-sender.service.d.ts +25 -0
  441. package/dist/whatsapp-sender/whatsapp-sender.service.d.ts.map +1 -1
  442. package/dist/whatsapp-sender/whatsapp-sender.service.js +46 -5
  443. package/dist/whatsapp-sender/whatsapp-sender.service.js.map +1 -1
  444. package/hedhog/data/integration_provider.yaml +9 -0
  445. package/hedhog/data/integration_type.yaml +6 -0
  446. package/hedhog/data/locale.yaml +0 -1
  447. package/hedhog/data/mail.yaml +2 -2
  448. package/hedhog/data/mail_layout.yaml +6 -3
  449. package/hedhog/data/menu.yaml +25 -5
  450. package/hedhog/data/route.yaml +140 -0
  451. package/hedhog/data/setting_group.yaml +137 -3
  452. package/hedhog/frontend/app/access-log/page.tsx.ejs +47 -53
  453. package/hedhog/frontend/app/account/components/active-sessions.tsx.ejs +33 -8
  454. package/hedhog/frontend/app/account/components/mcp-tokens.tsx.ejs +54 -13
  455. package/hedhog/frontend/app/account/components/mfa-method-card.tsx.ejs +7 -1
  456. package/hedhog/frontend/app/account/components/recovery-codes-dialog.tsx.ejs +1 -0
  457. package/hedhog/frontend/app/account/components/tokens.tsx.ejs +47 -17
  458. package/hedhog/frontend/app/ai_agent/page.tsx.ejs +46 -5
  459. package/hedhog/frontend/app/ai_instruction/_components/ai-instruction-form.tsx.ejs +101 -30
  460. package/hedhog/frontend/app/ai_instruction/_components/ai-instruction-versions.tsx.ejs +24 -8
  461. package/hedhog/frontend/app/ai_instruction/page.tsx.ejs +80 -15
  462. package/hedhog/frontend/app/configurations/[slug]/components/image-optimization-action.tsx.ejs +166 -0
  463. package/hedhog/frontend/app/configurations/[slug]/components/setting-field.test.tsx.ejs +145 -45
  464. package/hedhog/frontend/app/configurations/[slug]/components/setting-field.tsx.ejs +99 -219
  465. package/hedhog/frontend/app/configurations/[slug]/page.tsx.ejs +19 -1
  466. package/hedhog/frontend/app/configurations/layout.tsx.ejs +19 -5
  467. package/hedhog/frontend/app/dashboard/[slug]/widget-renderer.tsx.ejs +2 -8
  468. package/hedhog/frontend/app/dashboard/components/dynamic-widget.tsx.ejs +3 -0
  469. package/hedhog/frontend/app/dashboard/components/widget-wrapper.tsx.ejs +4 -0
  470. package/hedhog/frontend/app/dashboard/dashboard-home-tabs.tsx.ejs +43 -44
  471. package/hedhog/frontend/app/dashboard/management/tabs/component-roles-tab.tsx.ejs +41 -3
  472. package/hedhog/frontend/app/dashboard/management/tabs/components-tab.tsx.ejs +42 -2
  473. package/hedhog/frontend/app/dashboard/management/tabs/dashboard-roles-tab.tsx.ejs +41 -3
  474. package/hedhog/frontend/app/dashboard/management/tabs/dashboards-tab.tsx.ejs +39 -4
  475. package/hedhog/frontend/app/dashboard/management/tabs/items-tab.tsx.ejs +42 -3
  476. package/hedhog/frontend/app/incidents/page.tsx.ejs +60 -31
  477. package/hedhog/frontend/app/integration/profiles/page.tsx.ejs +45 -5
  478. package/hedhog/frontend/app/integrations-webhooks/page.tsx.ejs +92 -15
  479. package/hedhog/frontend/app/mail/log/page.tsx.ejs +109 -61
  480. package/hedhog/frontend/app/mail/template/page.tsx.ejs +125 -23
  481. package/hedhog/frontend/app/mcp_chat/chat-components.tsx.ejs +13 -15
  482. package/hedhog/frontend/app/mcp_chat/page.tsx.ejs +116 -110
  483. package/hedhog/frontend/app/message-templates/_components/message-template-sheet.tsx.ejs +245 -0
  484. package/hedhog/frontend/app/message-templates/_lib/types.ts.ejs +24 -0
  485. package/hedhog/frontend/app/message-templates/page.tsx.ejs +182 -0
  486. package/hedhog/frontend/app/pages/_components/page-wizard-sheet.tsx.ejs +1 -0
  487. package/hedhog/frontend/app/pages/page.tsx.ejs +94 -9
  488. package/hedhog/frontend/app/roles/menus.tsx.ejs +4 -4
  489. package/hedhog/frontend/app/roles/routes.tsx.ejs +4 -4
  490. package/hedhog/frontend/app/roles/users.tsx.ejs +4 -4
  491. package/hedhog/frontend/app/setting-list/page.tsx.ejs +71 -9
  492. package/hedhog/frontend/app/users/page.tsx.ejs +77 -67
  493. package/hedhog/frontend/messages/en.json +183 -36
  494. package/hedhog/frontend/messages/pt.json +183 -36
  495. package/hedhog/table/cron_lock.yaml +17 -0
  496. package/hedhog/table/file.yaml +13 -1
  497. package/hedhog/table/file_upload_chunk.yaml +23 -0
  498. package/hedhog/table/file_upload_ticket.yaml +67 -0
  499. package/hedhog/table/mcp_tool_call_log.yaml +30 -22
  500. package/hedhog/table/message_template.yaml +33 -0
  501. package/hedhog/table/setting.yaml +8 -0
  502. package/hedhog/table/user_session.yaml +36 -1
  503. package/package.json +7 -5
  504. package/src/ai/ai-agent.sort.ts +21 -0
  505. package/src/ai/ai.service.spec.ts +173 -1
  506. package/src/ai/ai.service.ts +64 -193
  507. package/src/ai-instruction/ai-instruction.service.ts +32 -28
  508. package/src/ai-instruction/ai-instruction.sort.ts +32 -0
  509. package/src/auth/auth.module.ts +8 -1
  510. package/src/auth/auth.service.spec.ts +108 -1
  511. package/src/auth/auth.service.ts +59 -5
  512. package/src/auth/guards/auth.guard.ts +9 -1
  513. package/src/authorize/authorize.controller.ts +126 -11
  514. package/src/authorize/authorize.errors.ts +55 -0
  515. package/src/authorize/authorize.module.ts +6 -1
  516. package/src/authorize/authorize.service.spec.ts +379 -7
  517. package/src/authorize/authorize.service.ts +309 -23
  518. package/src/authorize/dto/authorize-info.dto.ts +21 -3
  519. package/src/authorize/dto/consent.dto.ts +21 -3
  520. package/src/authorize/dto/token.dto.ts +24 -2
  521. package/src/authorize/oauth-exception.filter.ts +58 -0
  522. package/src/authorize/oauth-metadata.service.ts +67 -0
  523. package/src/authorize/well-known.controller.spec.ts +84 -0
  524. package/src/authorize/well-known.controller.ts +96 -0
  525. package/src/captcha/captcha.service.spec.ts +211 -4
  526. package/src/captcha/captcha.service.ts +127 -10
  527. package/src/core.module.ts +6 -0
  528. package/src/dashboard/dashboard-component-role/dashboard-component-role.service.ts +2 -3
  529. package/src/dashboard/dashboard-component-role/dashboard-component-role.sort.ts +18 -0
  530. package/src/dashboard/dashboard-item/dashboard-item.service.ts +2 -3
  531. package/src/dashboard/dashboard-item/dashboard-item.sort.ts +19 -0
  532. package/src/dashboard/dashboard-role/dashboard-role.service.ts +2 -3
  533. package/src/dashboard/dashboard-role/dashboard-role.sort.ts +16 -0
  534. package/src/file/file-upload-ticket.service.spec.ts +422 -0
  535. package/src/file/file-upload-ticket.service.ts +513 -0
  536. package/src/file/file.controller.ts +65 -0
  537. package/src/file/file.module.ts +14 -2
  538. package/src/file/file.service.spec.ts +94 -0
  539. package/src/file/file.service.ts +433 -53
  540. package/src/file/filename-encoding.util.spec.ts +54 -0
  541. package/src/file/filename-encoding.util.ts +67 -0
  542. package/src/file/image-optimization.service.spec.ts +156 -19
  543. package/src/file/image-optimization.service.ts +106 -21
  544. package/src/file/mcp-file-source.schema.ts +83 -0
  545. package/src/file/mcp-file-source.service.spec.ts +473 -0
  546. package/src/file/mcp-file-source.service.ts +445 -0
  547. package/src/file/mimetype-sniff.util.spec.ts +126 -0
  548. package/src/file/mimetype-sniff.util.ts +265 -0
  549. package/src/file/remote-fetch.util.spec.ts +117 -0
  550. package/src/file/remote-fetch.util.ts +330 -0
  551. package/src/impersonation/dto/start-impersonation.dto.ts +5 -2
  552. package/src/impersonation/impersonation.service.spec.ts +24 -1
  553. package/src/impersonation/impersonation.service.ts +14 -4
  554. package/src/incident/incident.controller.ts +9 -1
  555. package/src/incident/incident.service.ts +7 -0
  556. package/src/index.ts +17 -0
  557. package/src/integration-profile/integration-profile.secrets.ts +7 -0
  558. package/src/integration-profile/integration-profile.service.ts +7 -64
  559. package/src/integration-profile/integration-profile.utils.spec.ts +9 -0
  560. package/src/integration-profile/integration-profile.utils.ts +5 -5
  561. package/src/integration-profile/testers/index.ts +2 -0
  562. package/src/integration-profile/testers/remaining.testers.spec.ts +79 -0
  563. package/src/integration-profile/testers/shipping.testers.ts +94 -0
  564. package/src/mail/dto/send.dto.ts +6 -1
  565. package/src/mail/mail-template.spec.ts +58 -1
  566. package/src/mail/mail.service.spec.ts +112 -0
  567. package/src/mail/mail.service.ts +42 -4
  568. package/src/mail-sent/mail-sent.service.ts +3 -0
  569. package/src/mail-sent/mail-sent.sort.ts +19 -0
  570. package/src/mcp/filters/mcp-challenge.filter.spec.ts +76 -0
  571. package/src/mcp/filters/mcp-challenge.filter.ts +70 -0
  572. package/src/mcp/guards/mcp-auth.guard.spec.ts +51 -2
  573. package/src/mcp/guards/mcp-auth.guard.ts +24 -1
  574. package/src/mcp/guards/mcp-permission.guard.spec.ts +109 -15
  575. package/src/mcp/guards/mcp-permission.guard.ts +76 -51
  576. package/src/mcp/mcp-audit.service.spec.ts +107 -0
  577. package/src/mcp/mcp-audit.service.ts +37 -1
  578. package/src/mcp/mcp-permission.service.spec.ts +197 -0
  579. package/src/mcp/mcp-permission.service.ts +184 -0
  580. package/src/mcp/mcp-server.service.spec.ts +84 -2
  581. package/src/mcp/mcp-server.service.ts +111 -87
  582. package/src/mcp/mcp.controller.ts +8 -1
  583. package/src/mcp/mcp.module.ts +5 -1
  584. package/src/mcp/tools/core-ai.mcp-tools.ts +1 -1
  585. package/src/mcp/tools/core-dashboard-items.mcp-tools.ts +1 -1
  586. package/src/mcp/tools/core-dashboard.mcp-tools.ts +1 -1
  587. package/src/mcp/tools/core-event-webhooks.mcp-tools.ts +1 -2
  588. package/src/mcp/tools/core-files.mcp-tools.ts +202 -22
  589. package/src/mcp/tools/core-integration-events.mcp-tools.ts +1 -1
  590. package/src/mcp/tools/core-mail-sent.mcp-tools.ts +1 -1
  591. package/src/mcp/tools/core-mail.mcp-tools.ts +1 -1
  592. package/src/mcp/tools/core-menus.mcp-tools.ts +1 -2
  593. package/src/mcp/tools/core-notifications.mcp-tools.ts +0 -1
  594. package/src/mcp/tools/core-roles.mcp-tools.ts +1 -5
  595. package/src/mcp/tools/core-routes.mcp-tools.ts +1 -3
  596. package/src/mcp/tools/core-screens.mcp-tools.ts +1 -3
  597. package/src/mcp/tools/core-sessions.mcp-tools.ts +0 -2
  598. package/src/mcp/tools/core-settings.mcp-tools.ts +1 -2
  599. package/src/mcp/tools/core-users.mcp-tools.ts +1 -1
  600. package/src/mcp/tools/core-webhooks.mcp-tools.ts +1 -2
  601. package/src/mcp/types/mcp-context.type.ts +15 -6
  602. package/src/mcp-chat/mcp-chat.service.ts +8 -0
  603. package/src/meeting/meeting-provider.registry.ts +121 -0
  604. package/src/meeting/meeting.constants.ts +74 -0
  605. package/src/menu/menu.service.spec.ts +89 -0
  606. package/src/menu/menu.service.ts +29 -11
  607. package/src/message-template/dto/update-message-template.dto.ts +22 -0
  608. package/src/message-template/message-template-admin.service.spec.ts +163 -0
  609. package/src/message-template/message-template-admin.service.ts +239 -0
  610. package/src/message-template/message-template.controller.ts +52 -0
  611. package/src/message-template/message-template.module.ts +21 -0
  612. package/src/message-template/message-template.registry.spec.ts +62 -0
  613. package/src/message-template/message-template.registry.ts +125 -0
  614. package/src/message-template/message-template.service.spec.ts +149 -0
  615. package/src/message-template/message-template.service.ts +149 -0
  616. package/src/notification/notification.constants.ts +10 -0
  617. package/src/notification/notification.module.ts +3 -0
  618. package/src/notification/notification.service.spec.ts +75 -1
  619. package/src/notification/notification.service.ts +39 -1
  620. package/src/oauth/oauth.controller.ts +0 -1
  621. package/src/oauth/oauth.errors.ts +7 -0
  622. package/src/oauth/oauth.module.ts +6 -1
  623. package/src/oauth/oauth.service.spec.ts +58 -7
  624. package/src/oauth/oauth.service.ts +71 -32
  625. package/src/oauth/providers/abstract.provider.spec.ts +192 -0
  626. package/src/oauth/providers/abstract.provider.ts +46 -14
  627. package/src/oauth/providers/github.provider.ts +57 -34
  628. package/src/oauth/providers/microsoft-entra-id.provider.ts +8 -1
  629. package/src/observability/monitored-cron.spec.ts +164 -31
  630. package/src/observability/monitored-cron.ts +154 -62
  631. package/src/profile/dto/change-password.dto.ts +25 -7
  632. package/src/profile/profile.service.spec.ts +97 -0
  633. package/src/profile/profile.service.ts +9 -3
  634. package/src/realtime/realtime-tick.coalescer.spec.ts +92 -0
  635. package/src/realtime/realtime-tick.coalescer.ts +60 -0
  636. package/src/realtime/realtime.service.spec.ts +33 -0
  637. package/src/realtime/realtime.service.ts +28 -2
  638. package/src/redis/redis-kv.service.ts +261 -0
  639. package/src/redis/redis-master.spec.ts +111 -0
  640. package/src/redis/redis-master.ts +86 -0
  641. package/src/redis/redis-pubsub.ts +27 -3
  642. package/src/redis/redis.module.ts +17 -0
  643. package/src/session/session.service.spec.ts +121 -42
  644. package/src/session/session.service.ts +279 -82
  645. package/src/setting/setting.service.ts +44 -3
  646. package/src/task/task.service.spec.ts +41 -0
  647. package/src/task/task.service.ts +53 -13
  648. package/src/token/token.service.spec.ts +90 -0
  649. package/src/token/token.service.ts +48 -2
  650. package/src/user/user-credential.util.ts +14 -5
  651. package/src/user/user.service.ts +2 -12
  652. package/src/user/user.sort.ts +25 -0
  653. package/src/utils/abbreviate-name.spec.ts +50 -0
  654. package/src/utils/abbreviate-name.ts +44 -0
  655. package/src/utils/date-range-query.dto.ts +56 -0
  656. package/src/utils/date-range.spec.ts +175 -0
  657. package/src/utils/date-range.ts +246 -0
  658. package/src/webhook-integration/webhook-utils.spec.ts +67 -0
  659. package/src/webhook-integration/webhook-utils.ts +26 -0
  660. package/src/whatsapp-sender/whatsapp-recipients.spec.ts +89 -0
  661. package/src/whatsapp-sender/whatsapp-recipients.ts +83 -0
  662. package/src/whatsapp-sender/whatsapp-sender.service.spec.ts +112 -0
  663. package/src/whatsapp-sender/whatsapp-sender.service.ts +58 -5
  664. package/hedhog/query/device_pairing_request.sql +0 -46
  665. package/hedhog/query/impersonation_grant.sql +0 -71
  666. package/hedhog/query/oauth_authorize_pkce.sql +0 -58
  667. package/hedhog/query/oauth_mobile_state_token.sql +0 -30
  668. package/hedhog/query/oauth_web_ref_token.sql +0 -25
@@ -0,0 +1,32 @@
1
+ import { defineSortable } from '@hed-hog/api-pagination';
2
+
3
+ /**
4
+ * Campos ordenáveis de `ai_instruction` (`AiInstructionService.list`).
5
+ *
6
+ * `model`/`temperature`/`max_tokens` (coluna "Parâmetros" da tela, concatenados
7
+ * em `renderModelParams`) e o estado calculado a partir do registry + flags
8
+ * (coluna "Estado") ficam de fora: nenhum dos dois é uma coluna única — não há
9
+ * como declarar um `orderBy` que corresponda ao que a célula mostra.
10
+ *
11
+ * Desempate: o `$queryRaw` antigo tinha `ORDER BY layer, slug` fixo (as duas
12
+ * sempre ascendentes, sem opção de inverter). O default abaixo reproduz isso
13
+ * com `default: 'layer', defaultOrder: 'asc'` e `tiebreaker: 'slug'` fixado em
14
+ * `'asc'` (em vez do `id` padrão do `defineSortable`) — mais fiel ao
15
+ * comportamento anterior do que cair no id como desempate.
16
+ */
17
+ export const AI_INSTRUCTION_SORT = defineSortable(
18
+ {
19
+ slug: true,
20
+ name: true,
21
+ layer: true,
22
+ module_slug: true,
23
+ version: true,
24
+ updated_at: { initialOrder: 'desc' },
25
+ },
26
+ {
27
+ default: 'layer',
28
+ defaultOrder: 'asc',
29
+ tiebreaker: 'slug',
30
+ tiebreakerOrder: 'asc',
31
+ },
32
+ );
@@ -8,6 +8,7 @@ import { JwtModule } from '@nestjs/jwt';
8
8
  import cookieParser from 'cookie-parser';
9
9
  import { ChallengeModule } from '../challenge/challenge.module';
10
10
  import { ChallengeService } from '../challenge/challenge.service';
11
+ import { OAuthMetadataService } from '../authorize/oauth-metadata.service';
11
12
  import { MailSentModule } from '../mail-sent/mail-sent.module';
12
13
  import { MailModule } from '../mail/mail.module';
13
14
  import { SecurityModule } from '../security/security.module';
@@ -88,12 +89,18 @@ import { AuthGuard } from './guards/auth.guard';
88
89
  AuthService,
89
90
  TokenService,
90
91
  ChallengeService,
92
+ // Declarado aqui, e nao em AuthorizeModule (onde o arquivo mora), porque o
93
+ // AuthGuard abaixo e um APP_GUARD deste modulo: um provider de outro modulo
94
+ // so seria resolvido importando AuthorizeModule, que por sua vez importa
95
+ // AuthModule — circulo. Como este modulo e @Global, exportar aqui atende
96
+ // tambem o McpAuthGuard, sem ninguem precisar importar nada.
97
+ OAuthMetadataService,
91
98
  {
92
99
  provide: APP_GUARD,
93
100
  useClass: AuthGuard,
94
101
  },
95
102
  ],
96
- exports: [AuthService],
103
+ exports: [AuthService, OAuthMetadataService],
97
104
  })
98
105
  export class AuthModule {
99
106
  configure(consumer: MiddlewareConsumer) {
@@ -63,6 +63,7 @@ const makeDeps = () => {
63
63
  setRefreshTokenCookie: jest.fn(),
64
64
  };
65
65
  const session = {
66
+ peekByRefreshToken: jest.fn<any>().mockResolvedValue({ id: 2, user_id: 9, audience: null, oauth_client_id: null, revoked_at: null, expires_at: new Date('2099-01-01') }),
66
67
  create: jest.fn(),
67
68
  refresh: jest.fn(),
68
69
  deleteRefreshTokenCookie: jest.fn(),
@@ -120,7 +121,7 @@ describe('AuthService', () => {
120
121
 
121
122
  const result = await service.getAuthenticationPayload('pt-BR', 1, '1.2.3.4', 'UA', 'browser-1');
122
123
 
123
- expect(deps.session.create).toHaveBeenCalledWith('pt-BR', 1, '1.2.3.4', 'UA', 'browser-1');
124
+ expect(deps.session.create).toHaveBeenCalledWith('pt-BR', 1, '1.2.3.4', 'UA', 'browser-1', undefined);
124
125
  expect(deps.prisma.user.update).toHaveBeenCalledWith({
125
126
  where: { id: 1 },
126
127
  data: { last_login_at: expect.any(Date) },
@@ -202,6 +203,37 @@ describe('AuthService', () => {
202
203
  ).rejects.toThrow(BadRequestException);
203
204
  });
204
205
 
206
+ it('recusa a senha de credencial revogada', async () => {
207
+ // A revogação é o que o convite de acesso enterprise usa para trocar
208
+ // "autorize o acesso" por "crie sua conta e defina a senha"
209
+ // (`notifyAdminAccess` com `resetPassword`). Antes deste filtro, o login
210
+ // ignorava `revoked_at` e a senha antiga continuava entrando — enquanto o
211
+ // "esqueci minha senha", que sempre exigiu credencial ativa, dizia que a
212
+ // conta não tinha senha.
213
+ const { service, deps } = makeService();
214
+ deps.user.findUserByEmail.mockResolvedValue({
215
+ id: 1,
216
+ user_credential: [{ type: 'password', revoked_at: new Date() }],
217
+ user_identifier: [{ type: 'email', value: 'a@b.com' }],
218
+ });
219
+ deps.security.validatePassword.mockResolvedValue(false);
220
+
221
+ await expect(
222
+ service.loginWithEmailAndPassword({}, 'pt-BR', '1.1.1.1', 'UA', {
223
+ email: 'a@b.com',
224
+ password: 'a-senha-revogada',
225
+ } as any),
226
+ ).rejects.toThrow(BadRequestException);
227
+
228
+ // Sem credencial ativa não há o que verificar: a lista chega vazia, e é isso
229
+ // que garante que nenhum hash revogado é comparado.
230
+ expect(deps.security.validatePassword).toHaveBeenCalledWith(
231
+ 'pt-BR',
232
+ [],
233
+ 'a-senha-revogada',
234
+ );
235
+ });
236
+
205
237
  it('retorna requiresMfa quando existem métodos MFA verificados, enviando código para emails MFA', async () => {
206
238
  const { service, deps } = makeService();
207
239
  deps.user.findUserByEmail.mockResolvedValue({
@@ -680,6 +712,81 @@ describe('AuthService', () => {
680
712
  session: { id: 2, user_id: 9 },
681
713
  });
682
714
  });
715
+
716
+ // Sem esta recusa, um cliente externo trocaria o refresh token restrito por
717
+ // uma sessao com acesso a API inteira, e o audience binding nao valeria nada.
718
+ it('recusa renovar uma sessao de conector (com audience)', async () => {
719
+ const { service, deps } = makeService();
720
+ deps.session.peekByRefreshToken.mockResolvedValue({
721
+ id: 2,
722
+ user_id: 9,
723
+ audience: 'https://hub-api.example.com/mcp',
724
+ oauth_client_id: 'claude-connector',
725
+ revoked_at: null,
726
+ expires_at: new Date('2099-01-01'),
727
+ });
728
+
729
+ await expect(
730
+ service.refreshAccessToken('pt-BR', 'connector-refresh', '1.1.1.1', 'UA'),
731
+ ).rejects.toThrow(UnauthorizedException);
732
+
733
+ expect(deps.token.createAccessToken).not.toHaveBeenCalled();
734
+ });
735
+
736
+ /**
737
+ * REGRESSAO: a recusa acontecia DEPOIS de session.refresh(), que ja commitou
738
+ * o compare-and-swap — o cliente ficava com um token morto em 30s e sem
739
+ * substituto. Negar um pedido nao pode destruir a sessao.
740
+ */
741
+ it('nao gira o refresh token quando vai recusar', async () => {
742
+ const { service, deps } = makeService();
743
+ deps.session.peekByRefreshToken.mockResolvedValue({
744
+ id: 2,
745
+ user_id: 9,
746
+ audience: 'https://hub-api.example.com/mcp',
747
+ oauth_client_id: 'claude-connector',
748
+ revoked_at: null,
749
+ expires_at: new Date('2099-01-01'),
750
+ });
751
+
752
+ await expect(
753
+ service.refreshAccessToken('pt-BR', 'connector-refresh', '1.1.1.1', 'UA'),
754
+ ).rejects.toThrow(UnauthorizedException);
755
+
756
+ expect(deps.session.refresh).not.toHaveBeenCalled();
757
+ });
758
+ });
759
+
760
+ describe('getAuthenticationPayload - fluxo OAuth com resource', () => {
761
+ it('emite aud, iss, scope e cid e marca a sessao', async () => {
762
+ const { service, deps } = makeService();
763
+ deps.session.create.mockResolvedValue({
764
+ token: 'refresh-token',
765
+ session: { id: 5, expires_at: new Date('2026-01-02') },
766
+ });
767
+ deps.token.createAccessToken.mockResolvedValue('access-token');
768
+
769
+ await service.getAuthenticationPayload('pt-BR', 1, '1.2.3.4', 'UA', null, {
770
+ audience: 'https://hub-api.example.com/mcp',
771
+ scope: 'mcp',
772
+ clientId: 'claude-connector',
773
+ issuer: 'https://hub-api.example.com',
774
+ ttlMinutes: 10080,
775
+ });
776
+
777
+ expect(deps.token.createAccessToken).toHaveBeenCalledWith({
778
+ sub: 1,
779
+ sessionId: 5,
780
+ aud: 'https://hub-api.example.com/mcp',
781
+ iss: 'https://hub-api.example.com',
782
+ scope: 'mcp',
783
+ cid: 'claude-connector',
784
+ });
785
+ expect(deps.session.create).toHaveBeenCalledWith(
786
+ 'pt-BR', 1, '1.2.3.4', 'UA', null,
787
+ { audience: 'https://hub-api.example.com/mcp', clientId: 'claude-connector', ttlMinutes: 10080 },
788
+ );
789
+ });
683
790
  });
684
791
 
685
792
  describe('forgotPassword / logout', () => {
@@ -24,7 +24,7 @@ import { SessionService } from '../session/session.service';
24
24
  import { SettingService } from '../setting/setting.service';
25
25
  import { TokenService } from '../token/token.service';
26
26
  import { UserDeviceService } from '../user-device/user-device.service';
27
- import { hasPendingPasswordReset } from '../user/user-credential.util';
27
+ import { hasPendingPasswordReset, isActivePasswordCredential } from '../user/user-credential.util';
28
28
  import { CreateWithEmailAndPasswordDTO } from '../user/dto/create-with-email-and-password.dto';
29
29
  import { UserService } from '../user/user.service';
30
30
  import { buildSecurityEventVars } from '../utils/security-event-vars';
@@ -57,9 +57,40 @@ export class AuthService {
57
57
  private readonly userDevice: UserDeviceService,
58
58
  ) { }
59
59
 
60
- async getAuthenticationPayload(locale: string, userId: number, ipAddress: string, userAgent: string, browserId?: string | null) {
61
- const { token: refreshToken, session } = await this.session.create(locale, userId, ipAddress, userAgent, browserId);
62
- const payload = { sub: userId, sessionId: session.id };
60
+ /**
61
+ * `oauth` so vem preenchido quando a troca do authorization code pediu um
62
+ * `resource` (RFC 8707). Nesse caso o access token nasce amarrado aquele
63
+ * recurso — e o TokenService passa a recusa-lo em qualquer outro lugar. Sem o
64
+ * parametro, o token e o de sempre: sem `aud`, valido na API inteira.
65
+ */
66
+ async getAuthenticationPayload(
67
+ locale: string,
68
+ userId: number,
69
+ ipAddress: string,
70
+ userAgent: string,
71
+ browserId?: string | null,
72
+ oauth?: { audience: string; scope: string; clientId: string; issuer: string; ttlMinutes?: number },
73
+ ) {
74
+ const { token: refreshToken, session } = await this.session.create(
75
+ locale,
76
+ userId,
77
+ ipAddress,
78
+ userAgent,
79
+ browserId,
80
+ oauth
81
+ ? { audience: oauth.audience, clientId: oauth.clientId, ttlMinutes: oauth.ttlMinutes }
82
+ : undefined,
83
+ );
84
+ const payload = oauth
85
+ ? {
86
+ sub: userId,
87
+ sessionId: session.id,
88
+ aud: oauth.audience,
89
+ iss: oauth.issuer,
90
+ scope: oauth.scope,
91
+ cid: oauth.clientId,
92
+ }
93
+ : { sub: userId, sessionId: session.id };
63
94
  const accessToken = await this.token.createAccessToken(payload);
64
95
  await this.prisma.user.update({ where: { id: userId }, data: { last_login_at: new Date() } });
65
96
 
@@ -525,7 +556,11 @@ export class AuthService {
525
556
 
526
557
  if (!user) throw new BadRequestException(getLocaleText('accessDenied', locale, 'Access denied.'));
527
558
 
528
- const credentials = (user as unknown as User).user_credential?.filter((c) => c.type === 'password') || [];
559
+ // Revogada não vale: sem o `revoked_at` aqui, revogar a senha (o que o convite
560
+ // de acesso enterprise faz para forçar a definição de uma nova) não impedia o
561
+ // login com a senha antiga. Mesmo critério de `hasPasswordCredential`, que é
562
+ // o que decide se o "esqueci minha senha" pode seguir.
563
+ const credentials = (user as unknown as User).user_credential?.filter(isActivePasswordCredential) || [];
529
564
 
530
565
  const identifier = user.user_identifier?.find((i) => i.type === 'email' && i.value === email);
531
566
 
@@ -692,6 +727,13 @@ export class AuthService {
692
727
  };
693
728
  }
694
729
 
730
+ /**
731
+ * POST /auth/refresh e publico e devolve um token SEM `aud`. Se aceitasse o
732
+ * refresh token de um conector, o cliente externo trocaria seu token restrito
733
+ * por uma sessao com acesso a API inteira e todo o audience binding viraria
734
+ * enfeite. A renovacao dele e o grant_type=refresh_token do /auth/token, que
735
+ * reaplica o `aud`.
736
+ */
695
737
  async refreshAccessToken(locale: string, refreshToken: string, ipAddress: string, userAgent: string, browserId?: string | null) {
696
738
 
697
739
  if (!refreshToken) {
@@ -701,6 +743,18 @@ export class AuthService {
701
743
 
702
744
  this.logger.debug(`[AuthService] refreshAccessToken ip=${ipAddress} ua=${userAgent?.slice(0, 40)}`);
703
745
 
746
+ // ANTES de girar. `session.refresh()` commita a rotacao assim que roda, com
747
+ // apenas 30s de graca para o token anterior — recusar depois dela deixaria o
748
+ // cliente sem o token novo e com o antigo prestes a morrer, ou seja,
749
+ // destruiria a sessao em vez de negar o pedido.
750
+ const existing = await this.session.peekByRefreshToken(refreshToken);
751
+ if (existing?.audience) {
752
+ this.logger.warn(
753
+ `[AuthService] refreshAccessToken rejected: sessionId=${existing.id} userId=${existing.user_id} belongs to resource ${existing.audience}`,
754
+ );
755
+ throw new UnauthorizedException(getLocaleText('accessDenied', locale, 'Access denied.'));
756
+ }
757
+
704
758
  const { session, token } = await this.session.refresh(
705
759
  locale,
706
760
  refreshToken,
@@ -11,6 +11,7 @@ import {
11
11
  import { Reflector } from '@nestjs/core';
12
12
  import { Request } from 'express';
13
13
  import { ALLOW_MCP_TOKEN } from '../../mcp/decorators/allow-mcp-token.decorator';
14
+ import { OAuthMetadataService } from '../../authorize/oauth-metadata.service';
14
15
  import { SecurityService } from '../../security/security.service';
15
16
  import { TokenService } from '../../token/token.service';
16
17
 
@@ -23,6 +24,7 @@ export class AuthGuard implements CanActivate {
23
24
  private reflector: Reflector,
24
25
  private prisma: PrismaService,
25
26
  private security: SecurityService,
27
+ private oauthMetadata: OAuthMetadataService,
26
28
  ) { }
27
29
 
28
30
  async canActivate(context: ExecutionContext): Promise<boolean> {
@@ -89,7 +91,13 @@ export class AuthGuard implements CanActivate {
89
91
  }
90
92
 
91
93
  try {
92
- const payload = await this.token.verify(locale, token);
94
+ // So o /mcp e um "recurso" com audiencia propria. Em todo o resto o terceiro
95
+ // argumento fica ausente de proposito: e a ausencia que faz um token de
96
+ // conector ser recusado no REST.
97
+ const allowedAudience = allowMcpToken
98
+ ? await this.oauthMetadata.getMcpResource()
99
+ : undefined;
100
+ const payload = await this.token.verify(locale, token, allowedAudience);
93
101
 
94
102
  request['auth'] = payload;
95
103
  } catch (error) {
@@ -4,16 +4,23 @@ import {
4
4
  Body,
5
5
  Controller,
6
6
  Get,
7
+ Header,
7
8
  Headers,
8
9
  Inject,
9
10
  Ip,
10
11
  Post,
11
12
  Query,
13
+ Res,
14
+ UseFilters,
12
15
  UseGuards,
13
16
  forwardRef,
14
17
  } from '@nestjs/common';
15
18
  import { Throttle, ThrottlerGuard } from '@nestjs/throttler';
19
+ import type { Response } from 'express';
20
+ import { OAuthError } from './authorize.errors';
16
21
  import { AuthorizeService } from './authorize.service';
22
+ import { OAuthMetadataService } from './oauth-metadata.service';
23
+ import { OAuthExceptionFilter } from './oauth-exception.filter';
17
24
  import { AuthorizeInfoDTO } from './dto/authorize-info.dto';
18
25
  import { ConsentDTO } from './dto/consent.dto';
19
26
  import { TokenDTO } from './dto/token.dto';
@@ -21,18 +28,87 @@ import { TokenDTO } from './dto/token.dto';
21
28
  /**
22
29
  * Endpoints do fluxo Authorization Code + PKCE.
23
30
  *
24
- * Note o que NÃO existe aqui: um `GET /auth/authorize` que redireciona. O
25
- * redirect final é feito pelo browser, na página de consent do admin, depois do
26
- * POST /auth/authorize/consent. Assim toda a validação fica no servidor e o
27
- * `code` não passa pelo mecanismo de redirect do Nest (nem pelos seus logs).
31
+ * O `GET /auth/authorize` daqui NÃO emite o `code`: ele valida e redireciona para
32
+ * a tela de consent do admin, que é quem faz o redirect final depois do
33
+ * `POST /auth/authorize/consent`. A restrição original continua valendo — o
34
+ * `code` nunca passa pelo mecanismo de redirect do Nest, nem pelos seus logs.
35
+ *
36
+ * Ele existe porque um cliente OAuth padrão (o conector do Claude) espera um
37
+ * `authorization_endpoint` na mesma origem do `issuer`, e porque a validação de
38
+ * `response_type`, `scope` e `resource` tem que acontecer no servidor, antes de
39
+ * qualquer render — um erro precisa voltar como `error=` na query, e não como uma
40
+ * tela morta.
28
41
  */
29
42
  @Controller('auth')
30
43
  export class AuthorizeController {
31
44
  constructor(
32
45
  @Inject(forwardRef(() => AuthorizeService))
33
46
  private readonly service: AuthorizeService,
47
+ @Inject(forwardRef(() => OAuthMetadataService))
48
+ private readonly metadata: OAuthMetadataService,
34
49
  ) {}
35
50
 
51
+ /**
52
+ * O authorization endpoint anunciado nos metadados.
53
+ *
54
+ * A ordem de validação é normativa (RFC 6749 §4.1.2.1): `client_id` e
55
+ * `redirect_uri` primeiro, e falha neles NÃO redireciona — sem um redirect_uri
56
+ * validado, redirecionar seria mandar o usuário para onde o atacante pediu.
57
+ * Tudo o mais volta para o cliente como `error` na query.
58
+ */
59
+ @Public()
60
+ @UseGuards(ThrottlerGuard)
61
+ @Throttle({ default: { limit: 30, ttl: 60000 } })
62
+ @UseFilters(OAuthExceptionFilter)
63
+ @Get('authorize')
64
+ async authorize(@Query() query: AuthorizeInfoDTO, @Res() res: Response) {
65
+ try {
66
+ await this.service.getAuthorizationInfo({
67
+ clientId: query.client_id,
68
+ redirectUri: query.redirect_uri,
69
+ scope: query.scope,
70
+ codeChallenge: query.code_challenge,
71
+ codeChallengeMethod: query.code_challenge_method,
72
+ responseType: query.response_type,
73
+ resource: query.resource,
74
+ });
75
+ } catch (error) {
76
+ if (error instanceof OAuthError && error.redirectable) {
77
+ return res.redirect(
78
+ 302,
79
+ await this.buildErrorRedirect(query, error),
80
+ );
81
+ }
82
+ throw error;
83
+ }
84
+
85
+ // Só parâmetros validados seguem para a tela. O `code` é emitido lá, pelo
86
+ // consent, e volta por um redirect do browser — não por este.
87
+ const consentBase = await this.metadata.getConsentUiBase();
88
+ const params = new URLSearchParams();
89
+ for (const [key, value] of Object.entries(query)) {
90
+ if (value !== undefined && value !== null && value !== '') {
91
+ params.set(key, String(value));
92
+ }
93
+ }
94
+
95
+ return res.redirect(302, `${consentBase}/auth/authorize?${params.toString()}`);
96
+ }
97
+
98
+ private async buildErrorRedirect(
99
+ query: AuthorizeInfoDTO,
100
+ error: OAuthError,
101
+ ): Promise<string> {
102
+ const target = new URL(query.redirect_uri);
103
+ target.searchParams.set('error', error.code);
104
+ target.searchParams.set('error_description', error.description);
105
+ if (query.state) target.searchParams.set('state', query.state);
106
+ // RFC 9207: vai também no erro, e o cliente valida antes de exibir qualquer
107
+ // coisa. Anunciamos `authorization_response_iss_parameter_supported`.
108
+ target.searchParams.set('iss', await this.metadata.getIssuer());
109
+ return target.toString();
110
+ }
111
+
36
112
  /**
37
113
  * Metadados para a tela de consent. Público: a página precisa validar os
38
114
  * parâmetros e mostrar de quem é o app ANTES de exigir login.
@@ -42,13 +118,32 @@ export class AuthorizeController {
42
118
  @Throttle({ default: { limit: 30, ttl: 60000 } })
43
119
  @Get('authorize/info')
44
120
  async authorizeInfo(@Query() query: AuthorizeInfoDTO) {
45
- return this.service.getAuthorizationInfo({
46
- clientId: query.client_id,
47
- redirectUri: query.redirect_uri,
48
- scope: query.scope,
49
- codeChallenge: query.code_challenge,
50
- codeChallengeMethod: query.code_challenge_method,
51
- });
121
+ try {
122
+ return await this.service.getAuthorizationInfo({
123
+ clientId: query.client_id,
124
+ redirectUri: query.redirect_uri,
125
+ scope: query.scope,
126
+ codeChallenge: query.code_challenge,
127
+ codeChallengeMethod: query.code_challenge_method,
128
+ responseType: query.response_type,
129
+ resource: query.resource,
130
+ });
131
+ } catch (error) {
132
+ // Erro redirecionável volta para o cliente pelas mãos da tela, e o RFC 9207
133
+ // exige `iss` também nele. Mas a tela só aprende o issuer no caminho de
134
+ // SUCESSO desta chamada — num erro ela redirecionaria sem o parâmetro, e um
135
+ // cliente que o valide (nós anunciamos suportá-lo) rejeita a resposta
136
+ // inteira. Então o issuer viaja junto do erro.
137
+ if (error instanceof OAuthError && error.redirectable) {
138
+ throw new OAuthError(
139
+ error.code,
140
+ error.description,
141
+ true,
142
+ await this.metadata.getIssuer(),
143
+ );
144
+ }
145
+ throw error;
146
+ }
52
147
  }
53
148
 
54
149
  /** O usuário logado aprova. O code sai vinculado a ele. */
@@ -64,6 +159,8 @@ export class AuthorizeController {
64
159
  scope: body.scope,
65
160
  codeChallenge: body.code_challenge,
66
161
  codeChallengeMethod: body.code_challenge_method,
162
+ responseType: body.response_type,
163
+ resource: body.resource,
67
164
  });
68
165
 
69
166
  return { code };
@@ -79,6 +176,11 @@ export class AuthorizeController {
79
176
  @Public()
80
177
  @UseGuards(ThrottlerGuard)
81
178
  @Throttle({ default: { limit: 20, ttl: 60000 } })
179
+ @UseFilters(OAuthExceptionFilter)
180
+ // RFC 6749 5.1: a resposta carrega credenciais e nao pode ser cacheada. O
181
+ // filtro ja poe isto nos erros; aqui vale para o sucesso.
182
+ @Header('Cache-Control', 'no-store')
183
+ @Header('Pragma', 'no-cache')
82
184
  @Post('token')
83
185
  async token(
84
186
  @Body() body: TokenDTO,
@@ -87,11 +189,24 @@ export class AuthorizeController {
87
189
  @Headers('user-agent') userAgent: string,
88
190
  @Headers('x-browser-id') browserId: string,
89
191
  ) {
192
+ if (body.grant_type === 'refresh_token') {
193
+ return this.service.exchangeRefreshToken({
194
+ refreshToken: body.refresh_token,
195
+ clientId: body.client_id,
196
+ resource: body.resource,
197
+ locale,
198
+ ipAddress,
199
+ userAgent,
200
+ browserId: browserId || null,
201
+ });
202
+ }
203
+
90
204
  return this.service.exchangeCode({
91
205
  code: body.code,
92
206
  codeVerifier: body.code_verifier,
93
207
  clientId: body.client_id,
94
208
  redirectUri: body.redirect_uri,
209
+ resource: body.resource,
95
210
  locale,
96
211
  ipAddress,
97
212
  userAgent,
@@ -0,0 +1,55 @@
1
+ import { BadRequestException } from '@nestjs/common';
2
+
3
+ /**
4
+ * Códigos de erro do RFC 6749 §4.1.2.1 e §5.2, mais o `invalid_target` do
5
+ * RFC 8707.
6
+ */
7
+ export type OAuthErrorCode =
8
+ | 'invalid_request'
9
+ | 'invalid_client'
10
+ | 'invalid_grant'
11
+ | 'unauthorized_client'
12
+ | 'unsupported_grant_type'
13
+ | 'unsupported_response_type'
14
+ | 'invalid_scope'
15
+ | 'invalid_target'
16
+ | 'access_denied'
17
+ | 'login_required'
18
+ | 'server_error';
19
+
20
+ /**
21
+ * Erro do fluxo OAuth.
22
+ *
23
+ * `redirectable` decide o que acontece com ele, e a distinção é normativa
24
+ * (RFC 6749 §4.1.2.1): erro de `client_id` ou de `redirect_uri` **não** pode
25
+ * voltar para o `redirect_uri` — se ele não foi validado, redirecionar seria
26
+ * mandar o usuário para onde o atacante pediu. Todo o resto volta para o cliente
27
+ * como `error` na query, que é como ele descobre o que fez de errado.
28
+ */
29
+ export class OAuthError extends BadRequestException {
30
+ // Herda de BadRequestException, e nao de HttpException direto: todo erro OAuth
31
+ // de requisicao e um 400, e manter a hierarquia preserva qualquer `catch` que
32
+ // ja exista para BadRequestException — inclusive os testes que descrevem o
33
+ // comportamento anterior.
34
+ constructor(
35
+ readonly code: OAuthErrorCode,
36
+ readonly description: string,
37
+ readonly redirectable = false,
38
+ /**
39
+ * Só acompanha erro redirecionável: é o `iss` que a tela precisa devolver ao
40
+ * cliente junto do erro (RFC 9207). No caminho de sucesso ela já o recebe em
41
+ * `getAuthorizationInfo`.
42
+ */
43
+ readonly issuer?: string,
44
+ ) {
45
+ super({
46
+ error: code,
47
+ error_description: description,
48
+ redirectable,
49
+ ...(issuer ? { issuer } : {}),
50
+ // `message` fica junto porque os clientes ja registrados leem esse campo
51
+ // nas respostas de erro de hoje. Tirar seria uma quebra silenciosa.
52
+ message: description,
53
+ });
54
+ }
55
+ }
@@ -2,8 +2,11 @@ import { PrismaModule } from '@hed-hog/api-prisma';
2
2
  import { Module, forwardRef } from '@nestjs/common';
3
3
  import { AuthModule } from '../auth/auth.module';
4
4
  import { SecurityModule } from '../security/security.module';
5
+ import { SessionModule } from '../session/session.module';
6
+ import { TokenModule } from '../token/token.module';
5
7
  import { AuthorizeController } from './authorize.controller';
6
8
  import { AuthorizeService } from './authorize.service';
9
+ import { WellKnownController } from './well-known.controller';
7
10
 
8
11
  /**
9
12
  * Separado de OAuthModule de propósito: lá o HedHog é *client* de IdPs externos
@@ -15,8 +18,10 @@ import { AuthorizeService } from './authorize.service';
15
18
  forwardRef(() => PrismaModule),
16
19
  forwardRef(() => SecurityModule),
17
20
  forwardRef(() => AuthModule),
21
+ forwardRef(() => SessionModule),
22
+ forwardRef(() => TokenModule),
18
23
  ],
19
- controllers: [AuthorizeController],
24
+ controllers: [AuthorizeController, WellKnownController],
20
25
  providers: [AuthorizeService],
21
26
  exports: [AuthorizeService],
22
27
  })