@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
@@ -6,11 +6,13 @@ import {
6
6
  PageHeader,
7
7
  PaginationFooter,
8
8
  SearchBar,
9
+ SortableTableHead,
9
10
  type SearchBarControl,
10
11
  } from '@/components/entity-list';
11
12
  import { Badge } from '@/components/ui/badge';
12
13
  import { Button } from '@/components/ui/button';
13
14
  import { Card, CardContent } from '@/components/ui/card';
15
+ import { DateRangePicker } from '@/components/ui/date-range-picker';
14
16
  import { Input } from '@/components/ui/input';
15
17
  import { KpiCardsGrid, type KpiCardItem } from '@/components/ui/kpi-cards-grid';
16
18
  import { ScrollArea } from '@/components/ui/scroll-area';
@@ -31,7 +33,9 @@ import {
31
33
  } from '@/components/ui/table';
32
34
  import { ToggleGroup, ToggleGroupItem } from '@/components/ui/toggle-group';
33
35
  import { useDebounce } from '@/hooks/use-debounce';
36
+ import { useListUrlState } from '@/hooks/use-list-url-state';
34
37
  import { usePersistedPageSize } from '@/hooks/use-persisted-page-size';
38
+ import { useTableSort, type SortableColumn } from '@/hooks/use-table-sort';
35
39
  import { formatDate } from '@/lib/format-date';
36
40
  import { useApp, useQuery } from '@hed-hog/next-app-provider';
37
41
  import {
@@ -48,7 +52,7 @@ import {
48
52
  User,
49
53
  } from 'lucide-react';
50
54
  import { useTranslations } from 'next-intl';
51
- import { useMemo, useState } from 'react';
55
+ import { useEffect, useMemo, useState } from 'react';
52
56
 
53
57
  type PaginationResult<T> = {
54
58
  data: T[];
@@ -129,20 +133,57 @@ type ViewMode = 'cards' | 'table';
129
133
 
130
134
  const DEFAULT_PAGE_SIZES = [6, 12, 24, 48, 96] as const;
131
135
 
136
+ /**
137
+ * "Delivery" fica de fora: é um badge composto, agregado a partir da relação
138
+ * `mail_sent_user` no service — não é coluna que o backend saiba ordenar. Ver
139
+ * `MAIL_SENT_SORT` em `libraries/core/src/mail-sent/mail-sent.sort.ts`.
140
+ */
141
+ type MailSentSortField = 'id' | 'subject' | 'from' | 'to' | 'created_at';
142
+
143
+ const SORT_COLUMNS = [
144
+ 'id',
145
+ 'subject',
146
+ 'from',
147
+ 'to',
148
+ { field: 'created_at', initialOrder: 'desc' },
149
+ ] as const satisfies readonly SortableColumn<MailSentSortField>[];
150
+
132
151
  export default function MailLogPage() {
133
152
  const t = useTranslations('core.MailLog');
134
153
  const [selectedLog, setSelectedLog] = useState<MailSent | null>(null);
135
154
  const [isDetailSheetOpen, setIsDetailSheetOpen] = useState(false);
136
- const [searchTerm, setSearchTerm] = useState('');
137
- const [recipientEmail, setRecipientEmail] = useState('');
138
- const [statusFilter, setStatusFilter] = useState<DeliveryStatusFilter>('all');
139
- const [hasErrorFilter, setHasErrorFilter] = useState<HasErrorFilter>('all');
140
- const [deliveryFilter, setDeliveryFilter] =
141
- useState<DeliveryOutcomeFilter>('all');
142
- const [createdAtFrom, setCreatedAtFrom] = useState('');
143
- const [createdAtTo, setCreatedAtTo] = useState('');
155
+ // Busca, filtros e página vivem na URL: voltar do detalhe de um envio
156
+ // recupera a mesma consulta, e o link pode ser passado adiante.
157
+ const urlState = useListUrlState({
158
+ filters: {
159
+ recipient: { param: 'recipient', defaultValue: '' },
160
+ status: { param: 'status', defaultValue: 'all' },
161
+ hasError: { param: 'hasError', defaultValue: 'all' },
162
+ delivery: { param: 'delivery', defaultValue: 'all' },
163
+ createdAtFrom: { param: 'createdAtFrom', defaultValue: '' },
164
+ createdAtTo: { param: 'createdAtTo', defaultValue: '' },
165
+ },
166
+ });
167
+ const {
168
+ search: searchTerm,
169
+ setSearch: setSearchTerm,
170
+ debouncedSearch,
171
+ page,
172
+ setPage,
173
+ } = urlState;
174
+ const statusFilter = urlState.filters.status as DeliveryStatusFilter;
175
+ const hasErrorFilter = urlState.filters.hasError as HasErrorFilter;
176
+ const deliveryFilter = urlState.filters.delivery as DeliveryOutcomeFilter;
177
+ const createdAtFrom = urlState.filters.createdAtFrom;
178
+ const createdAtTo = urlState.filters.createdAtTo;
144
179
  const [viewMode, setViewMode] = useState<ViewMode>('cards');
145
- const debouncedSearch = useDebounce(searchTerm);
180
+
181
+ // O e-mail do destinatário é campo de texto: o input responde na hora e só
182
+ // o valor estabilizado vai para a URL, pra não gravar uma entrada de
183
+ // histórico por tecla digitada.
184
+ const [recipientEmail, setRecipientEmail] = useState(
185
+ () => urlState.filters.recipient
186
+ );
146
187
  const debouncedRecipientEmail = useDebounce(recipientEmail);
147
188
  const { request, getSettingValue } = useApp();
148
189
 
@@ -176,13 +217,25 @@ export default function MailLogPage() {
176
217
  }
177
218
  }, [generalSettings]);
178
219
 
179
- const [page, setPage] = useState(1);
180
220
  const [pageSize, setPageSize] = usePersistedPageSize({
181
221
  storageKey: 'pagination:global:pageSize',
182
222
  defaultValue: 12,
183
223
  allowedValues: pageSizeOptions,
184
224
  });
185
225
 
226
+ useEffect(() => {
227
+ if (debouncedRecipientEmail !== urlState.filters.recipient) {
228
+ urlState.setFilter('recipient', debouncedRecipientEmail);
229
+ }
230
+ // eslint-disable-next-line react-hooks/exhaustive-deps
231
+ }, [debouncedRecipientEmail]);
232
+
233
+ const sort = useTableSort<MailSentSortField>({
234
+ columns: SORT_COLUMNS,
235
+ defaultSort: { field: 'created_at', order: 'desc' },
236
+ onSortChange: () => setPage(1),
237
+ });
238
+
186
239
  const {
187
240
  data: logsResult,
188
241
  refetch: refetchLogs,
@@ -199,6 +252,8 @@ export default function MailLogPage() {
199
252
  createdAtTo,
200
253
  page,
201
254
  pageSize,
255
+ sort.sortField,
256
+ sort.sortOrder,
202
257
  ],
203
258
  queryFn: async () => {
204
259
  const response = await request({
@@ -213,6 +268,8 @@ export default function MailLogPage() {
213
268
  createdAtTo: createdAtTo || undefined,
214
269
  page,
215
270
  pageSize,
271
+ sortField: sort.sortField,
272
+ sortOrder: sort.sortOrder,
216
273
  },
217
274
  });
218
275
  return response.data as PaginationResult<MailSent>;
@@ -225,14 +282,8 @@ export default function MailLogPage() {
225
282
  setIsDetailSheetOpen(true);
226
283
  };
227
284
 
228
- const handleSearchChange = (value: string): void => {
229
- setSearchTerm(value);
230
- setPage(1);
231
- };
232
-
233
285
  const handleRecipientEmailChange = (value: string): void => {
234
286
  setRecipientEmail(value);
235
- setPage(1);
236
287
  };
237
288
 
238
289
  const hasActiveFilters =
@@ -246,11 +297,12 @@ export default function MailLogPage() {
246
297
  const clearFilters = (): void => {
247
298
  setSearchTerm('');
248
299
  setRecipientEmail('');
249
- setStatusFilter('all');
250
- setHasErrorFilter('all');
251
- setCreatedAtFrom('');
252
- setCreatedAtTo('');
253
- setPage(1);
300
+ urlState.setFilter('recipient', '');
301
+ urlState.setFilter('status', 'all');
302
+ urlState.setFilter('hasError', 'all');
303
+ urlState.setFilter('delivery', 'all');
304
+ urlState.setFilter('createdAtFrom', '');
305
+ urlState.setFilter('createdAtTo', '');
254
306
  };
255
307
 
256
308
  const searchControls = useMemo<SearchBarControl[]>(
@@ -259,10 +311,7 @@ export default function MailLogPage() {
259
311
  id: 'status',
260
312
  type: 'select',
261
313
  value: statusFilter,
262
- onChange: (value) => {
263
- setStatusFilter(value as DeliveryStatusFilter);
264
- setPage(1);
265
- },
314
+ onChange: (value) => urlState.setFilter('status', value),
266
315
  placeholder: t('filterByStatus'),
267
316
  options: [
268
317
  { value: 'all', label: t('statusAll') },
@@ -275,10 +324,7 @@ export default function MailLogPage() {
275
324
  id: 'has-error',
276
325
  type: 'select',
277
326
  value: hasErrorFilter,
278
- onChange: (value) => {
279
- setHasErrorFilter(value as HasErrorFilter);
280
- setPage(1);
281
- },
327
+ onChange: (value) => urlState.setFilter('hasError', value),
282
328
  placeholder: t('filterByError'),
283
329
  options: [
284
330
  { value: 'all', label: t('errorAll') },
@@ -290,10 +336,7 @@ export default function MailLogPage() {
290
336
  id: 'delivery-status',
291
337
  type: 'select',
292
338
  value: deliveryFilter,
293
- onChange: (value) => {
294
- setDeliveryFilter(value as DeliveryOutcomeFilter);
295
- setPage(1);
296
- },
339
+ onChange: (value) => urlState.setFilter('delivery', value),
297
340
  placeholder: t('filterByDelivery'),
298
341
  options: [
299
342
  { value: 'all', label: t('deliveryAll') },
@@ -304,28 +347,9 @@ export default function MailLogPage() {
304
347
  { value: 'rejected', label: t('deliveryRejected') },
305
348
  ],
306
349
  },
307
- {
308
- id: 'created-at-from',
309
- type: 'date',
310
- value: createdAtFrom,
311
- onChange: (value) => {
312
- setCreatedAtFrom(value);
313
- setPage(1);
314
- },
315
- max: createdAtTo || undefined,
316
- },
317
- {
318
- id: 'created-at-to',
319
- type: 'date',
320
- value: createdAtTo,
321
- onChange: (value) => {
322
- setCreatedAtTo(value);
323
- setPage(1);
324
- },
325
- min: createdAtFrom || undefined,
326
- },
327
350
  ],
328
- [createdAtFrom, createdAtTo, deliveryFilter, hasErrorFilter, statusFilter, t]
351
+ // eslint-disable-next-line react-hooks/exhaustive-deps
352
+ [deliveryFilter, hasErrorFilter, statusFilter, t]
329
353
  );
330
354
 
331
355
  const summary = useMemo(() => {
@@ -506,7 +530,7 @@ export default function MailLogPage() {
506
530
  <div className="flex-1">
507
531
  <SearchBar
508
532
  searchQuery={searchTerm}
509
- onSearchChange={handleSearchChange}
533
+ onSearchChange={setSearchTerm}
510
534
  onSearch={() => setPage(1)}
511
535
  placeholder={t('searchPlaceholder')}
512
536
  controls={searchControls}
@@ -514,6 +538,15 @@ export default function MailLogPage() {
514
538
  </div>
515
539
 
516
540
  <div className="flex flex-col gap-2 sm:flex-row sm:flex-wrap xl:justify-end">
541
+ <DateRangePicker
542
+ fromDate={createdAtFrom}
543
+ toDate={createdAtTo}
544
+ onFromDateChange={(value) =>
545
+ urlState.setFilter('createdAtFrom', value)
546
+ }
547
+ onToDateChange={(value) => urlState.setFilter('createdAtTo', value)}
548
+ />
549
+
517
550
  <Input
518
551
  value={recipientEmail}
519
552
  onChange={(event) => handleRecipientEmailChange(event.target.value)}
@@ -597,12 +630,27 @@ export default function MailLogPage() {
597
630
  <Table>
598
631
  <TableHeader>
599
632
  <TableRow>
600
- <TableHead>#{t('id')}</TableHead>
601
- <TableHead>{t('subject')}</TableHead>
602
- <TableHead>{t('from')}</TableHead>
603
- <TableHead>{t('to')}</TableHead>
633
+ <SortableTableHead
634
+ label={`#${t('id')}`}
635
+ {...sort.getSortProps('id')}
636
+ />
637
+ <SortableTableHead
638
+ label={t('subject')}
639
+ {...sort.getSortProps('subject')}
640
+ />
641
+ <SortableTableHead
642
+ label={t('from')}
643
+ {...sort.getSortProps('from')}
644
+ />
645
+ <SortableTableHead
646
+ label={t('to')}
647
+ {...sort.getSortProps('to')}
648
+ />
604
649
  <TableHead>{t('delivery')}</TableHead>
605
- <TableHead>{t('createdAt')}</TableHead>
650
+ <SortableTableHead
651
+ label={t('createdAt')}
652
+ {...sort.getSortProps('created_at')}
653
+ />
606
654
  <TableHead className="w-24 text-right">
607
655
  {t('actions')}
608
656
  </TableHead>
@@ -8,7 +8,9 @@ import {
8
8
  PageHeader,
9
9
  PaginationFooter,
10
10
  SearchBar,
11
+ SortableTableHead,
11
12
  } from '@/components/entity-list';
13
+ import type { SortableColumn } from '@/hooks/use-table-sort';
12
14
  import {
13
15
  HtmlContentEditor,
14
16
  isFullHtmlDocument,
@@ -23,7 +25,7 @@ import {
23
25
  AlertDialogHeader,
24
26
  AlertDialogTitle,
25
27
  } from '@/components/ui/alert-dialog';
26
- import { Badge } from '@/components/ui/badge';
28
+ import { Badge, badgeVariants } from '@/components/ui/badge';
27
29
  import { Button } from '@/components/ui/button';
28
30
  import { Checkbox } from '@/components/ui/checkbox';
29
31
  import {
@@ -41,6 +43,11 @@ import {
41
43
  } from '@/components/ui/dropdown-menu';
42
44
  import { Input } from '@/components/ui/input';
43
45
  import { Label } from '@/components/ui/label';
46
+ import {
47
+ Popover,
48
+ PopoverContent,
49
+ PopoverTrigger,
50
+ } from '@/components/ui/popover';
44
51
  import {
45
52
  Select,
46
53
  SelectContent,
@@ -67,6 +74,7 @@ import {
67
74
  import { TagsInput } from '@/components/ui/tags-input';
68
75
  import { usePagination } from '@/hooks/use-pagination';
69
76
  import { formatDate } from '@/lib/format-date';
77
+ import { cn } from '@/lib/utils';
70
78
  import { useApp } from '@hed-hog/next-app-provider';
71
79
  import {
72
80
  AlertCircle,
@@ -104,6 +112,91 @@ interface ImportResponse {
104
112
  templates?: number[];
105
113
  }
106
114
 
115
+ /**
116
+ * Coluna Variáveis da listagem: no máximo 3 badges, sempre numa linha só (sem
117
+ * `flex-wrap`), para a altura da linha da tabela não variar de template para
118
+ * template. O restante fica atrás de um indicador "+X" que abre um popover
119
+ * com a lista completa — `PopoverTrigger` num `<button>` real dá foco e
120
+ * ativação por teclado (Enter/Espaço) de graça, e o `Popover` do Radix já
121
+ * fecha sozinho no Esc e no clique fora.
122
+ */
123
+
124
+ /**
125
+ * A allowlist de `mail` no backend tem so `id`, `slug`, `created_at` e
126
+ * `updated_at`. "Variaveis" e derivado do corpo do template — nao e coluna
127
+ * que o backend saiba ordenar, entao segue como cabecalho comum.
128
+ *
129
+ * "Assunto" mora em `mail_locale.subject` (traduzido). `mail.service.ts` chama
130
+ * `LocaleService.listModelWithLocale`, que nao passa `options.sort` ao
131
+ * `paginate()` — isso mantem ativo o fallback automatico de raw query por
132
+ * campo de locale (`paginateWithLocaleOrdering`), que cobre `subject`.
133
+ */
134
+ type MailSortField = 'slug' | 'subject' | 'updated_at';
135
+
136
+ const SORT_COLUMNS = [
137
+ 'slug',
138
+ 'subject',
139
+ { field: 'updated_at', initialOrder: 'desc' },
140
+ ] as const satisfies readonly SortableColumn<MailSortField>[];
141
+
142
+ function MailVariablesCell({
143
+ variables,
144
+ }: {
145
+ variables: { id?: number | string; name: string }[];
146
+ }) {
147
+ const t = useTranslations('core.MailPage');
148
+ const visible = variables.slice(0, 3);
149
+ const remaining = variables.length - visible.length;
150
+
151
+ return (
152
+ <div
153
+ className="flex flex-nowrap items-center gap-1"
154
+ onClick={(e) => e.stopPropagation()}
155
+ >
156
+ {visible.map((v, index) => (
157
+ <Badge
158
+ key={v.id ?? index}
159
+ variant="secondary"
160
+ className="shrink-0 text-xs"
161
+ >
162
+ {v.name}
163
+ </Badge>
164
+ ))}
165
+ {remaining > 0 && (
166
+ <Popover>
167
+ <PopoverTrigger asChild>
168
+ <button
169
+ type="button"
170
+ className={cn(
171
+ badgeVariants({ variant: 'outline' }),
172
+ 'shrink-0 cursor-pointer'
173
+ )}
174
+ >
175
+ {t('moreVariables', { count: remaining })}
176
+ </button>
177
+ </PopoverTrigger>
178
+ <PopoverContent align="start" className="w-64 p-3">
179
+ <p className="mb-2 text-xs font-medium text-muted-foreground">
180
+ {t('allVariablesTitle')}
181
+ </p>
182
+ <div className="flex flex-wrap gap-1.5">
183
+ {variables.map((v, index) => (
184
+ <Badge
185
+ key={v.id ?? index}
186
+ variant="secondary"
187
+ className="text-xs"
188
+ >
189
+ {v.name}
190
+ </Badge>
191
+ ))}
192
+ </div>
193
+ </PopoverContent>
194
+ </Popover>
195
+ )}
196
+ </div>
197
+ );
198
+ }
199
+
107
200
  /**
108
201
  * Renderiza o preview no servidor, pelo mesmo caminho do envio real
109
202
  * (interpolação Handlebars + layout base), com debounce para não disparar uma
@@ -181,7 +274,13 @@ export default function EmailTemplatesPage() {
181
274
  totalItems,
182
275
  search,
183
276
  setSearch,
184
- } = usePagination({ url: '/mail' });
277
+ sort,
278
+ } = usePagination<MailSortField>({
279
+ url: '/mail',
280
+ orderField: 'slug',
281
+ orderDirection: 'asc',
282
+ sortColumns: SORT_COLUMNS,
283
+ });
185
284
  const [templates, setTemplates] = useState<Mail[]>([]);
186
285
  const [isDialogOpen, setIsDialogOpen] = useState(false);
187
286
  const [isDeleteDialogOpen, setIsDeleteDialogOpen] = useState(false);
@@ -836,10 +935,19 @@ export default function EmailTemplatesPage() {
836
935
  onCheckedChange={handleToggleAll}
837
936
  />
838
937
  </TableHead>
839
- <TableHead>{t('tableSlug')}</TableHead>
840
- <TableHead>{t('tableSubject')}</TableHead>
938
+ <SortableTableHead
939
+ label={t('tableSlug')}
940
+ {...sort.getSortProps('slug')}
941
+ />
942
+ <SortableTableHead
943
+ label={t('tableSubject')}
944
+ {...sort.getSortProps('subject')}
945
+ />
841
946
  <TableHead>{t('tableVariables')}</TableHead>
842
- <TableHead>{t('tableUpdated')}</TableHead>
947
+ <SortableTableHead
948
+ label={t('tableUpdated')}
949
+ {...sort.getSortProps('updated_at')}
950
+ />
843
951
  <TableHead className="text-right">
844
952
  {t('tableActions')}
845
953
  </TableHead>
@@ -867,17 +975,7 @@ export default function EmailTemplatesPage() {
867
975
  </TableCell>
868
976
  <TableCell>{template.subject}</TableCell>
869
977
  <TableCell>
870
- <div className="flex flex-wrap gap-1">
871
- {template.mail_var.map((v, index) => (
872
- <Badge
873
- key={`${template.id}-${v.id}-${index}`}
874
- variant="secondary"
875
- className="text-xs"
876
- >
877
- {v.name}
878
- </Badge>
879
- ))}
880
- </div>
978
+ <MailVariablesCell variables={template.mail_var} />
881
979
  </TableCell>
882
980
  <TableCell className="text-muted-foreground">
883
981
  {formatDate(
@@ -895,7 +993,7 @@ export default function EmailTemplatesPage() {
895
993
  e.stopPropagation();
896
994
  handleDownloadHTML(template);
897
995
  }}
898
- title={t('downloadHTML')}
996
+ tooltip={t('downloadHTML')}
899
997
  >
900
998
  <FileDown className="h-4 w-4" />
901
999
  </Button>
@@ -906,6 +1004,7 @@ export default function EmailTemplatesPage() {
906
1004
  e.stopPropagation();
907
1005
  handleEdit(template);
908
1006
  }}
1007
+ tooltip={t('editTemplate')}
909
1008
  >
910
1009
  <Pencil className="h-4 w-4" />
911
1010
  </Button>
@@ -916,6 +1015,7 @@ export default function EmailTemplatesPage() {
916
1015
  e.stopPropagation();
917
1016
  handleDelete(Number(template.mail_id || template.id));
918
1017
  }}
1018
+ tooltip={t('delete')}
919
1019
  >
920
1020
  <Trash2 className="h-4 w-4 text-destructive" />
921
1021
  </Button>
@@ -966,7 +1066,10 @@ export default function EmailTemplatesPage() {
966
1066
  </div>
967
1067
  </SheetHeader>
968
1068
 
969
- <form onSubmit={handleSubmit} className="flex min-h-0 flex-1 flex-col">
1069
+ <form
1070
+ onSubmit={handleSubmit}
1071
+ className="flex min-h-0 flex-1 flex-col"
1072
+ >
970
1073
  <div className="grid min-h-0 flex-1 grid-cols-1 overflow-y-auto lg:grid-cols-[minmax(260px,320px)_1fr] lg:overflow-hidden">
971
1074
  <div className="space-y-5 border-b px-4 py-4 sm:px-6 lg:min-h-0 lg:overflow-y-auto lg:border-b-0 lg:border-r">
972
1075
  <section className="space-y-3">
@@ -1086,7 +1189,9 @@ export default function EmailTemplatesPage() {
1086
1189
  <HtmlContentEditor
1087
1190
  key={selectedLocaleCode}
1088
1191
  value={formData.body}
1089
- onChange={(value) => setFormData({ ...formData, body: value })}
1192
+ onChange={(value) =>
1193
+ setFormData({ ...formData, body: value })
1194
+ }
1090
1195
  variables={editorVariables}
1091
1196
  previewHtml={previewHtml}
1092
1197
  previewLoading={previewLoading}
@@ -1205,10 +1310,7 @@ export default function EmailTemplatesPage() {
1205
1310
  <div className="space-y-2">
1206
1311
  {formData.variables.map((v, idx) => (
1207
1312
  <div key={idx} className="flex items-center gap-2">
1208
- <Badge
1209
- variant="outline"
1210
- className="font-mono min-w-30"
1211
- >
1313
+ <Badge variant="outline" className="font-mono min-w-30">
1212
1314
  {'{{' + v + '}}'}
1213
1315
  </Badge>
1214
1316
  <Input
@@ -2,7 +2,6 @@
2
2
 
3
3
  import { Button } from '@/components/ui/button';
4
4
  import { ScrollArea } from '@/components/ui/scroll-area';
5
- import { Spinner } from '@/components/ui/spinner';
6
5
  import { Textarea } from '@/components/ui/textarea';
7
6
  import { AnimatePresence, motion } from 'framer-motion';
8
7
  import {
@@ -10,7 +9,6 @@ import {
10
9
  Bot,
11
10
  ChevronDown,
12
11
  ChevronRight,
13
- Loader2,
14
12
  MessageSquare,
15
13
  Paperclip,
16
14
  Plus,
@@ -18,6 +16,7 @@ import {
18
16
  Wrench,
19
17
  X,
20
18
  } from 'lucide-react';
19
+ import { useTranslations } from 'next-intl';
21
20
  import { RefObject, useEffect, useRef, useState } from 'react';
22
21
  import ReactMarkdown from 'react-markdown';
23
22
  import remarkGfm from 'remark-gfm';
@@ -252,6 +251,8 @@ export function ConversationList({
252
251
  onSelect,
253
252
  onDelete,
254
253
  }: ConversationListProps) {
254
+ const t = useTranslations('core.McpChatPage');
255
+
255
256
  if (isLoading) {
256
257
  return (
257
258
  <div className="space-y-2 pt-2 px-2">
@@ -306,6 +307,7 @@ export function ConversationList({
306
307
  e.stopPropagation();
307
308
  onDelete(conv);
308
309
  }}
310
+ tooltip={t('deleteConversation')}
309
311
  >
310
312
  <Trash2 className="h-3 w-3" />
311
313
  </Button>
@@ -456,15 +458,12 @@ export function ChatInput({
456
458
  size="icon"
457
459
  variant="ghost"
458
460
  className="shrink-0 h-10 w-10 rounded-full cursor-pointer border border-border/60 bg-background/85 hover:bg-background"
459
- aria-label={attachLabel}
461
+ tooltip={attachLabel}
460
462
  onClick={handleOpenFilePicker}
461
463
  disabled={disabled || isSending || isUploadingFile}
464
+ loading={isUploadingFile}
462
465
  >
463
- {isUploadingFile ? (
464
- <Loader2 className="h-4 w-4 animate-spin" />
465
- ) : (
466
- <Plus className="h-4 w-4" />
467
- )}
466
+ <Plus className="h-4 w-4" />
468
467
  </Button>
469
468
 
470
469
  <Textarea
@@ -486,15 +485,14 @@ export function ChatInput({
486
485
  <Button
487
486
  size="icon"
488
487
  className="shrink-0 h-10 w-10 rounded-full cursor-pointer"
489
- aria-label={isSending ? sendingLabel : sendLabel}
490
- disabled={disabled || isSending || (!input.trim() && attachments.length === 0)}
488
+ tooltip={isSending ? sendingLabel : sendLabel}
489
+ disabled={
490
+ disabled || isSending || (!input.trim() && attachments.length === 0)
491
+ }
491
492
  onClick={onSend}
493
+ loading={isSending}
492
494
  >
493
- {isSending ? (
494
- <Spinner className="h-4 w-4" aria-label={sendingLabel} />
495
- ) : (
496
- <ArrowUp className="h-4 w-4" />
497
- )}
495
+ <ArrowUp className="h-4 w-4" />
498
496
  </Button>
499
497
  </div>
500
498