@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
@@ -57,17 +57,16 @@ type ApiToken = {
57
57
 
58
58
  function daysSince(
59
59
  date: string | null,
60
- t: (key: string, values?: Record<string, unknown>) => string,
60
+ t: (key: string, values?: Record<string, unknown>) => string
61
61
  ): string {
62
62
  if (!date) return t('never');
63
- const days = Math.floor(
64
- (Date.now() - new Date(date).getTime()) / 86400000,
65
- );
63
+ const days = Math.floor((Date.now() - new Date(date).getTime()) / 86400000);
66
64
  if (days === 0) return t('today');
67
65
  return t('daysAgo', { days });
68
66
  }
69
67
 
70
68
  function CopyButton({ value }: { value: string }) {
69
+ const t = useTranslations('core.Tokens');
71
70
  const [copied, setCopied] = useState(false);
72
71
  const handleCopy = () => {
73
72
  navigator.clipboard.writeText(value);
@@ -75,7 +74,13 @@ function CopyButton({ value }: { value: string }) {
75
74
  setTimeout(() => setCopied(false), 2000);
76
75
  };
77
76
  return (
78
- <Button variant="ghost" size="icon" className="size-7 shrink-0" onClick={handleCopy}>
77
+ <Button
78
+ variant="ghost"
79
+ size="icon"
80
+ className="size-7 shrink-0"
81
+ onClick={handleCopy}
82
+ tooltip={t('copy')}
83
+ >
79
84
  {copied ? (
80
85
  <Check className="size-3.5 text-green-500" />
81
86
  ) : (
@@ -150,7 +155,8 @@ export function Tokens() {
150
155
  paginationOptions: { pageSizeOptions },
151
156
  });
152
157
 
153
- const apiUrl = (getSettingValue('api-url') as string | null)?.replace(/\/$/, '') ?? '';
158
+ const apiUrl =
159
+ (getSettingValue('api-url') as string | null)?.replace(/\/$/, '') ?? '';
154
160
  const mcpUrl = apiUrl ? `${apiUrl}/mcp` : '/mcp';
155
161
 
156
162
  const handleCreate = async () => {
@@ -201,7 +207,9 @@ export function Tokens() {
201
207
  <CardHeader className="flex flex-row items-start justify-between">
202
208
  <div>
203
209
  <CardTitle>{t('title')}</CardTitle>
204
- <CardDescription className="mt-1">{t('description')}</CardDescription>
210
+ <CardDescription className="mt-1">
211
+ {t('description')}
212
+ </CardDescription>
205
213
  </div>
206
214
  <Button size="sm" onClick={() => setIsSheetOpen(true)}>
207
215
  <Plus className="size-4 mr-2" />
@@ -255,6 +263,7 @@ export function Tokens() {
255
263
  size="icon"
256
264
  className="size-8 text-destructive hover:text-destructive"
257
265
  onClick={() => setKeyToRevoke(key.id)}
266
+ tooltip={t('revoke')}
258
267
  >
259
268
  <Trash2 className="size-4" />
260
269
  </Button>
@@ -304,14 +313,19 @@ export function Tokens() {
304
313
  </AlertDialog>
305
314
 
306
315
  {/* Create token sheet */}
307
- <Sheet open={isSheetOpen} onOpenChange={(open) => !open && handleCloseSheet()}>
316
+ <Sheet
317
+ open={isSheetOpen}
318
+ onOpenChange={(open) => !open && handleCloseSheet()}
319
+ >
308
320
  <ResizableSheetContent sheetId="create-token" defaultWidth={520}>
309
321
  <SheetHeader>
310
322
  <SheetTitle>
311
323
  {createdToken ? t('tokenCreatedTitle') : t('createTokenTitle')}
312
324
  </SheetTitle>
313
325
  <SheetDescription>
314
- {createdToken ? t('tokenCreatedWarning') : t('createTokenDescription')}
326
+ {createdToken
327
+ ? t('tokenCreatedWarning')
328
+ : t('createTokenDescription')}
315
329
  </SheetDescription>
316
330
  </SheetHeader>
317
331
 
@@ -360,18 +374,24 @@ export function Tokens() {
360
374
 
361
375
  {newKeyType === 'mcp' ? (
362
376
  <div className="space-y-3">
363
- <p className="text-xs text-muted-foreground">{t('mcpUsageDesc')}</p>
377
+ <p className="text-xs text-muted-foreground">
378
+ {t('mcpUsageDesc')}
379
+ </p>
364
380
  <CodeRow label={t('serverUrlLabel')} value={mcpUrl} />
365
381
  <div className="space-y-1">
366
- <p className="text-xs text-muted-foreground">{t('mcpUsageHeader')}</p>
382
+ <p className="text-xs text-muted-foreground">
383
+ {t('mcpUsageHeader')}
384
+ </p>
367
385
  <pre className="rounded bg-muted px-3 py-2 text-xs overflow-x-auto">
368
386
  {`Authorization: Bearer <${t('yourToken')}>`}
369
387
  </pre>
370
388
  </div>
371
389
  <div className="space-y-1">
372
- <p className="text-xs text-muted-foreground">{t('mcpUsageExampleLabel')}</p>
390
+ <p className="text-xs text-muted-foreground">
391
+ {t('mcpUsageExampleLabel')}
392
+ </p>
373
393
  <pre className="rounded bg-muted px-3 py-2 text-xs overflow-x-auto whitespace-pre-wrap break-all">
374
- {`{
394
+ {`{
375
395
  "mcpServers": {
376
396
  "hub": {
377
397
  "type": "sse",
@@ -387,16 +407,25 @@ export function Tokens() {
387
407
  </div>
388
408
  ) : (
389
409
  <div className="space-y-3">
390
- <p className="text-xs text-muted-foreground">{t('apiUsageDesc')}</p>
391
- <CodeRow label={t('serverUrlLabel')} value={apiUrl || '/api'} />
410
+ <p className="text-xs text-muted-foreground">
411
+ {t('apiUsageDesc')}
412
+ </p>
413
+ <CodeRow
414
+ label={t('serverUrlLabel')}
415
+ value={apiUrl || '/api'}
416
+ />
392
417
  <div className="space-y-1">
393
- <p className="text-xs text-muted-foreground">{t('apiUsageHeader')}</p>
418
+ <p className="text-xs text-muted-foreground">
419
+ {t('apiUsageHeader')}
420
+ </p>
394
421
  <pre className="rounded bg-muted px-3 py-2 text-xs overflow-x-auto">
395
422
  {`Authorization: Bearer <${t('yourToken')}>`}
396
423
  </pre>
397
424
  </div>
398
425
  <div className="space-y-1">
399
- <p className="text-xs text-muted-foreground">{t('apiUsageExampleLabel')}</p>
426
+ <p className="text-xs text-muted-foreground">
427
+ {t('apiUsageExampleLabel')}
428
+ </p>
400
429
  <pre className="rounded bg-muted px-3 py-2 text-xs overflow-x-auto whitespace-pre-wrap break-all">
401
430
  {`curl -H "Authorization: Bearer <${t('yourToken')}>" \\\n ${apiUrl || '/api'}/users/me`}
402
431
  </pre>
@@ -421,6 +450,7 @@ export function Tokens() {
421
450
  size="icon"
422
451
  onClick={handleCopyToken}
423
452
  className="shrink-0"
453
+ tooltip={t('copyToken')}
424
454
  >
425
455
  {isCopied ? (
426
456
  <Check className="size-4 text-green-500" />
@@ -6,6 +6,7 @@ import {
6
6
  PageHeader,
7
7
  PaginationFooter,
8
8
  SearchBar,
9
+ SortableTableHead,
9
10
  } from '@/components/entity-list';
10
11
  import {
11
12
  AlertDialog,
@@ -55,6 +56,7 @@ import { Textarea } from '@/components/ui/textarea';
55
56
  import { useDebounce } from '@/hooks/use-debounce';
56
57
  import { useFormDraft } from '@/hooks/use-form-draft';
57
58
  import { usePersistedPageSize } from '@/hooks/use-persisted-page-size';
59
+ import { useTableSort, type SortableColumn } from '@/hooks/use-table-sort';
58
60
  import { formatDateTime } from '@/lib/format-date';
59
61
  import { useApp, useQuery } from '@hed-hog/next-app-provider';
60
62
  import { zodResolver } from '@hookform/resolvers/zod';
@@ -126,6 +128,17 @@ function getErrorMessage(error: unknown, fallback: string) {
126
128
 
127
129
  const DEFAULT_PAGE_SIZES = [6, 12, 24, 48, 96] as const;
128
130
 
131
+ type AiAgentSortField = 'slug' | 'provider' | 'model' | 'external_agent_id';
132
+
133
+ const SORT_COLUMNS: readonly SortableColumn<AiAgentSortField>[] = [
134
+ 'slug',
135
+ 'provider',
136
+ 'model',
137
+ 'external_agent_id',
138
+ ];
139
+
140
+ const DEFAULT_SORT = { field: 'slug', order: 'asc' } as const;
141
+
129
142
  export default function AiAgentPage() {
130
143
  const { request, currentLocaleCode, getSettingValue } = useApp();
131
144
  const t = useTranslations('core.AiAgentPage');
@@ -173,6 +186,11 @@ export default function AiAgentPage() {
173
186
  });
174
187
  const [searchQuery, setSearchQuery] = useState('');
175
188
  const debouncedSearch = useDebounce(searchQuery, 400);
189
+ const sort = useTableSort<AiAgentSortField>({
190
+ columns: SORT_COLUMNS,
191
+ defaultSort: DEFAULT_SORT,
192
+ onSortChange: () => setPage(1),
193
+ });
176
194
 
177
195
  const [isDialogOpen, setIsDialogOpen] = useState(false);
178
196
  const [editingAgent, setEditingAgent] = useState<Agent | null>(null);
@@ -245,11 +263,20 @@ export default function AiAgentPage() {
245
263
  }, [draftSavedAt, currentLocaleCode, getSettingValue, hasDraft]);
246
264
 
247
265
  const { data, isLoading, refetch } = useQuery<PaginatedResponse<Agent>>({
248
- queryKey: ['ai-agents', page, pageSize, debouncedSearch],
266
+ queryKey: [
267
+ 'ai-agents',
268
+ page,
269
+ pageSize,
270
+ debouncedSearch,
271
+ sort.sortField,
272
+ sort.sortOrder,
273
+ ],
249
274
  queryFn: async () => {
250
275
  const params = new URLSearchParams();
251
276
  params.set('page', String(page));
252
277
  params.set('pageSize', String(pageSize));
278
+ params.set('sortField', sort.sortField);
279
+ params.set('sortOrder', sort.sortOrder);
253
280
  if (debouncedSearch) params.set('search', debouncedSearch);
254
281
 
255
282
  const response = await request<PaginatedResponse<Agent>>({
@@ -405,10 +432,22 @@ export default function AiAgentPage() {
405
432
  <Table>
406
433
  <TableHeader>
407
434
  <TableRow>
408
- <TableHead>Slug</TableHead>
409
- <TableHead>{t('columnProvider')}</TableHead>
410
- <TableHead>{t('columnModel')}</TableHead>
411
- <TableHead>{t('columnExternalId')}</TableHead>
435
+ <SortableTableHead
436
+ label="Slug"
437
+ {...sort.getSortProps('slug')}
438
+ />
439
+ <SortableTableHead
440
+ label={t('columnProvider')}
441
+ {...sort.getSortProps('provider')}
442
+ />
443
+ <SortableTableHead
444
+ label={t('columnModel')}
445
+ {...sort.getSortProps('model')}
446
+ />
447
+ <SortableTableHead
448
+ label={t('columnExternalId')}
449
+ {...sort.getSortProps('external_agent_id')}
450
+ />
412
451
  <TableHead className="text-right">
413
452
  {t('columnActions')}
414
453
  </TableHead>
@@ -434,6 +473,7 @@ export default function AiAgentPage() {
434
473
  variant="outline"
435
474
  size="icon"
436
475
  onClick={() => handleOpenEdit(agent)}
476
+ tooltip={t('editTitle')}
437
477
  >
438
478
  <Pencil className="h-4 w-4" />
439
479
  </Button>
@@ -441,6 +481,7 @@ export default function AiAgentPage() {
441
481
  variant="destructive"
442
482
  size="icon"
443
483
  onClick={() => setAgentToDelete(agent)}
484
+ tooltip={t('delete')}
444
485
  >
445
486
  <Trash2 className="h-4 w-4" />
446
487
  </Button>
@@ -28,7 +28,13 @@ import { Textarea } from '@/components/ui/textarea';
28
28
  import { useFormDraft } from '@/hooks/use-form-draft';
29
29
  import { cn } from '@/lib/utils';
30
30
  import { useApp } from '@hed-hog/next-app-provider';
31
- import { AlertTriangle, Copy, Lock, RotateCcw, ShieldAlert } from 'lucide-react';
31
+ import {
32
+ AlertTriangle,
33
+ Copy,
34
+ Lock,
35
+ RotateCcw,
36
+ ShieldAlert,
37
+ } from 'lucide-react';
32
38
  import { useTranslations } from 'next-intl';
33
39
  import { useEffect, useMemo, useState } from 'react';
34
40
  import { toast } from 'sonner';
@@ -75,8 +81,10 @@ function toFormState(instruction: AiInstruction): FormState {
75
81
  locale: instruction.locale,
76
82
  is_active: instruction.is_active,
77
83
  model: instruction.model ?? '',
78
- temperature: instruction.temperature === null ? '' : String(instruction.temperature),
79
- max_tokens: instruction.max_tokens === null ? '' : String(instruction.max_tokens),
84
+ temperature:
85
+ instruction.temperature === null ? '' : String(instruction.temperature),
86
+ max_tokens:
87
+ instruction.max_tokens === null ? '' : String(instruction.max_tokens),
80
88
  change_note: '',
81
89
  };
82
90
  }
@@ -106,7 +114,10 @@ export function AiInstructionForm({
106
114
  const contentChanged = state.content !== instruction.content;
107
115
  const readOnly = instruction.is_locked && !isUnlocked;
108
116
 
109
- const { clearDraft, loadDraft } = useFormDraft<{ id: number; values: FormState }>({
117
+ const { clearDraft, loadDraft } = useFormDraft<{
118
+ id: number;
119
+ values: FormState;
120
+ }>({
110
121
  storageKey: DRAFT_STORAGE_KEY,
111
122
  value: { id: instruction.id, values: state },
112
123
  hasData: isDirty,
@@ -139,7 +150,10 @@ export function AiInstructionForm({
139
150
  [state.content]
140
151
  );
141
152
 
142
- const declaredNames = useMemo(() => new Set(Object.keys(variables)), [variables]);
153
+ const declaredNames = useMemo(
154
+ () => new Set(Object.keys(variables)),
155
+ [variables]
156
+ );
143
157
 
144
158
  const missingPhrases = useMemo(() => {
145
159
  const phrases = registryEntry?.required_phrases ?? [];
@@ -169,8 +183,10 @@ export function AiInstructionForm({
169
183
  is_active: state.is_active,
170
184
  // Empty means "inherit from the profile / code default".
171
185
  model: state.model.trim() || null,
172
- temperature: state.temperature.trim() === '' ? null : Number(state.temperature),
173
- max_tokens: state.max_tokens.trim() === '' ? null : Number(state.max_tokens),
186
+ temperature:
187
+ state.temperature.trim() === '' ? null : Number(state.temperature),
188
+ max_tokens:
189
+ state.max_tokens.trim() === '' ? null : Number(state.max_tokens),
174
190
  change_note: state.change_note.trim() || undefined,
175
191
  allow_missing_variables: allowMissingVariables || undefined,
176
192
  acknowledge_security_review: instruction.is_locked ? true : undefined,
@@ -204,7 +220,11 @@ export function AiInstructionForm({
204
220
  {registryEntry.required_phrases.map((phrase) => (
205
221
  <Badge
206
222
  key={phrase}
207
- variant={missingPhrases.includes(phrase) ? 'destructive' : 'secondary'}
223
+ variant={
224
+ missingPhrases.includes(phrase)
225
+ ? 'destructive'
226
+ : 'secondary'
227
+ }
208
228
  >
209
229
  {phrase}
210
230
  </Badge>
@@ -246,12 +266,16 @@ export function AiInstructionForm({
246
266
  <div className="space-y-1 sm:col-span-2">
247
267
  <Label>{t('fieldSlug')}</Label>
248
268
  <div className="flex gap-2">
249
- <Input readOnly value={instruction.slug} className="font-mono text-xs" />
269
+ <Input
270
+ readOnly
271
+ value={instruction.slug}
272
+ className="font-mono text-xs"
273
+ />
250
274
  <Button
251
275
  type="button"
252
276
  variant="outline"
253
277
  size="icon"
254
- title={t('copySlug')}
278
+ tooltip={t('copySlug')}
255
279
  onClick={() => {
256
280
  navigator.clipboard?.writeText(instruction.slug);
257
281
  toast.success(t('slugCopied'));
@@ -260,7 +284,9 @@ export function AiInstructionForm({
260
284
  <Copy className="h-4 w-4" />
261
285
  </Button>
262
286
  </div>
263
- <p className="text-xs text-muted-foreground">{t('slugImmutable')}</p>
287
+ <p className="text-xs text-muted-foreground">
288
+ {t('slugImmutable')}
289
+ </p>
264
290
  </div>
265
291
 
266
292
  <div className="space-y-1">
@@ -270,7 +296,10 @@ export function AiInstructionForm({
270
296
  maxLength={200}
271
297
  readOnly={readOnly}
272
298
  onChange={(event) =>
273
- setState((current) => ({ ...current, name: event.target.value }))
299
+ setState((current) => ({
300
+ ...current,
301
+ name: event.target.value,
302
+ }))
274
303
  }
275
304
  />
276
305
  </div>
@@ -280,7 +309,9 @@ export function AiInstructionForm({
280
309
  <Select
281
310
  value={state.locale}
282
311
  disabled={readOnly}
283
- onValueChange={(value) => setState((current) => ({ ...current, locale: value }))}
312
+ onValueChange={(value) =>
313
+ setState((current) => ({ ...current, locale: value }))
314
+ }
284
315
  >
285
316
  <SelectTrigger>
286
317
  <SelectValue />
@@ -301,7 +332,9 @@ export function AiInstructionForm({
301
332
  }
302
333
  />
303
334
  <Label>{t('fieldIsActive')}</Label>
304
- <span className="text-xs text-muted-foreground">{t('isActiveHint')}</span>
335
+ <span className="text-xs text-muted-foreground">
336
+ {t('isActiveHint')}
337
+ </span>
305
338
  </div>
306
339
  </div>
307
340
 
@@ -328,7 +361,10 @@ export function AiInstructionForm({
328
361
  readOnly={readOnly}
329
362
  className="font-mono text-xs leading-relaxed"
330
363
  onChange={(event) =>
331
- setState((current) => ({ ...current, content: event.target.value }))
364
+ setState((current) => ({
365
+ ...current,
366
+ content: event.target.value,
367
+ }))
332
368
  }
333
369
  />
334
370
 
@@ -346,7 +382,9 @@ export function AiInstructionForm({
346
382
  .map((name) => (
347
383
  <Badge
348
384
  key={name}
349
- variant={declaredNames.has(name) ? 'secondary' : 'destructive'}
385
+ variant={
386
+ declaredNames.has(name) ? 'secondary' : 'destructive'
387
+ }
350
388
  className="font-mono text-xs"
351
389
  >
352
390
  {`{{${name}}}`}
@@ -381,15 +419,21 @@ export function AiInstructionForm({
381
419
  <Alert>
382
420
  <AlertTriangle className="h-4 w-4" />
383
421
  <AlertDescription>
384
- {t('missingPhrasesWarning', { phrases: missingPhrases.join(', ') })}
422
+ {t('missingPhrasesWarning', {
423
+ phrases: missingPhrases.join(', '),
424
+ })}
385
425
  </AlertDescription>
386
426
  </Alert>
387
427
  ) : null}
388
428
  </div>
389
429
 
390
430
  <div className="space-y-2 rounded-md border p-3">
391
- <Label className="text-sm font-medium">{t('modelParamsTitle')}</Label>
392
- <p className="text-xs text-muted-foreground">{t('modelParamsHint')}</p>
431
+ <Label className="text-sm font-medium">
432
+ {t('modelParamsTitle')}
433
+ </Label>
434
+ <p className="text-xs text-muted-foreground">
435
+ {t('modelParamsHint')}
436
+ </p>
393
437
 
394
438
  <div className="grid gap-3 sm:grid-cols-3">
395
439
  <div className="space-y-1">
@@ -397,9 +441,14 @@ export function AiInstructionForm({
397
441
  <Input
398
442
  value={state.model}
399
443
  readOnly={readOnly}
400
- placeholder={registryEntry?.defaults?.model || t('inheritPlaceholder')}
444
+ placeholder={
445
+ registryEntry?.defaults?.model || t('inheritPlaceholder')
446
+ }
401
447
  onChange={(event) =>
402
- setState((current) => ({ ...current, model: event.target.value }))
448
+ setState((current) => ({
449
+ ...current,
450
+ model: event.target.value,
451
+ }))
403
452
  }
404
453
  />
405
454
  </div>
@@ -418,7 +467,10 @@ export function AiInstructionForm({
418
467
  : t('inheritPlaceholder')
419
468
  }
420
469
  onChange={(event) =>
421
- setState((current) => ({ ...current, temperature: event.target.value }))
470
+ setState((current) => ({
471
+ ...current,
472
+ temperature: event.target.value,
473
+ }))
422
474
  }
423
475
  />
424
476
  </div>
@@ -435,7 +487,10 @@ export function AiInstructionForm({
435
487
  : t('inheritPlaceholder')
436
488
  }
437
489
  onChange={(event) =>
438
- setState((current) => ({ ...current, max_tokens: event.target.value }))
490
+ setState((current) => ({
491
+ ...current,
492
+ max_tokens: event.target.value,
493
+ }))
439
494
  }
440
495
  />
441
496
  </div>
@@ -450,7 +505,10 @@ export function AiInstructionForm({
450
505
  maxLength={500}
451
506
  placeholder={t('changeNotePlaceholder')}
452
507
  onChange={(event) =>
453
- setState((current) => ({ ...current, change_note: event.target.value }))
508
+ setState((current) => ({
509
+ ...current,
510
+ change_note: event.target.value,
511
+ }))
454
512
  }
455
513
  />
456
514
  </div>
@@ -469,7 +527,9 @@ export function AiInstructionForm({
469
527
  </Button>
470
528
  <Button
471
529
  type="button"
472
- disabled={isSaving || readOnly || validation.unbalancedBlocks.length > 0}
530
+ disabled={
531
+ isSaving || readOnly || validation.unbalancedBlocks.length > 0
532
+ }
473
533
  onClick={() => handleSave(validation.missingRequired.length > 0)}
474
534
  >
475
535
  {isSaving ? t('saving') : t('save')}
@@ -479,11 +539,15 @@ export function AiInstructionForm({
479
539
 
480
540
  <TabsContent value="variables" className="space-y-3 pt-4">
481
541
  {Object.keys(variables).length === 0 ? (
482
- <p className="text-sm text-muted-foreground">{t('variablesEmpty')}</p>
542
+ <p className="text-sm text-muted-foreground">
543
+ {t('variablesEmpty')}
544
+ </p>
483
545
  ) : (
484
546
  <>
485
547
  {registryEntry ? (
486
- <p className="text-xs text-muted-foreground">{t('variablesFromCode')}</p>
548
+ <p className="text-xs text-muted-foreground">
549
+ {t('variablesFromCode')}
550
+ </p>
487
551
  ) : null}
488
552
  <div className="overflow-x-auto">
489
553
  <table className="w-full text-sm">
@@ -502,7 +566,9 @@ export function AiInstructionForm({
502
566
  <td className="p-2">{spec.type}</td>
503
567
  <td className="p-2">
504
568
  {spec.required ? (
505
- <Badge variant="secondary">{t('variableRequired')}</Badge>
569
+ <Badge variant="secondary">
570
+ {t('variableRequired')}
571
+ </Badge>
506
572
  ) : (
507
573
  '—'
508
574
  )}
@@ -533,7 +599,10 @@ export function AiInstructionForm({
533
599
  </TabsContent>
534
600
 
535
601
  <TabsContent value="history" className="pt-4">
536
- <AiInstructionVersions instruction={instruction} onRestored={onSaved} />
602
+ <AiInstructionVersions
603
+ instruction={instruction}
604
+ onRestored={onSaved}
605
+ />
537
606
  </TabsContent>
538
607
  </Tabs>
539
608
 
@@ -547,7 +616,9 @@ export function AiInstructionForm({
547
616
  <AlertDialogContent>
548
617
  <AlertDialogHeader>
549
618
  <AlertDialogTitle>{t('unlockDialogTitle')}</AlertDialogTitle>
550
- <AlertDialogDescription>{t('unlockDialogDescription')}</AlertDialogDescription>
619
+ <AlertDialogDescription>
620
+ {t('unlockDialogDescription')}
621
+ </AlertDialogDescription>
551
622
  </AlertDialogHeader>
552
623
 
553
624
  <div className="space-y-1">
@@ -28,7 +28,11 @@ import { useTranslations } from 'next-intl';
28
28
  import { useState } from 'react';
29
29
  import { toast } from 'sonner';
30
30
 
31
- import { getErrorMessage, type AiInstruction, type AiInstructionVersion } from '../_lib/types';
31
+ import {
32
+ getErrorMessage,
33
+ type AiInstruction,
34
+ type AiInstructionVersion,
35
+ } from '../_lib/types';
32
36
  import { PromptDiff } from './prompt-diff';
33
37
 
34
38
  type AiInstructionVersionsProps = {
@@ -44,7 +48,8 @@ export function AiInstructionVersions({
44
48
  const t = useTranslations('core.AiInstructionPage');
45
49
 
46
50
  const [selected, setSelected] = useState<AiInstructionVersion | null>(null);
47
- const [versionToRestore, setVersionToRestore] = useState<AiInstructionVersion | null>(null);
51
+ const [versionToRestore, setVersionToRestore] =
52
+ useState<AiInstructionVersion | null>(null);
48
53
  const [isRestoring, setIsRestoring] = useState(false);
49
54
 
50
55
  const { data, isLoading, refetch } = useQuery<AiInstructionVersion[]>({
@@ -103,7 +108,9 @@ export function AiInstructionVersions({
103
108
  <TableHead>{t('columnVersionDate')}</TableHead>
104
109
  <TableHead>{t('columnVersionAuthor')}</TableHead>
105
110
  <TableHead>{t('columnVersionNote')}</TableHead>
106
- <TableHead className="text-right">{t('columnVersionSize')}</TableHead>
111
+ <TableHead className="text-right">
112
+ {t('columnVersionSize')}
113
+ </TableHead>
107
114
  <TableHead className="w-12" />
108
115
  </TableRow>
109
116
  </TableHeader>
@@ -136,7 +143,10 @@ export function AiInstructionVersions({
136
143
  )}
137
144
  </TableCell>
138
145
  <TableCell>{version.created_by_name || '—'}</TableCell>
139
- <TableCell className="max-w-60 truncate" title={version.change_note || ''}>
146
+ <TableCell
147
+ className="max-w-60 truncate"
148
+ title={version.change_note || ''}
149
+ >
140
150
  {version.change_note || '—'}
141
151
  </TableCell>
142
152
  <TableCell className="text-right font-mono text-xs">
@@ -147,7 +157,7 @@ export function AiInstructionVersions({
147
157
  <Button
148
158
  variant="outline"
149
159
  size="icon"
150
- title={t('restoreVersion')}
160
+ tooltip={t('restoreVersion')}
151
161
  onClick={(event) => {
152
162
  event.stopPropagation();
153
163
  setVersionToRestore(version);
@@ -172,7 +182,9 @@ export function AiInstructionVersions({
172
182
  emptyLabel={t('diffIdentical')}
173
183
  />
174
184
  ) : (
175
- <p className="text-sm text-muted-foreground">{t('versionsSelectHint')}</p>
185
+ <p className="text-sm text-muted-foreground">
186
+ {t('versionsSelectHint')}
187
+ </p>
176
188
  )}
177
189
 
178
190
  <AlertDialog
@@ -183,11 +195,15 @@ export function AiInstructionVersions({
183
195
  <AlertDialogHeader>
184
196
  <AlertDialogTitle>{t('restoreDialogTitle')}</AlertDialogTitle>
185
197
  <AlertDialogDescription>
186
- {t('restoreDialogDescription', { version: versionToRestore?.version ?? 0 })}
198
+ {t('restoreDialogDescription', {
199
+ version: versionToRestore?.version ?? 0,
200
+ })}
187
201
  </AlertDialogDescription>
188
202
  </AlertDialogHeader>
189
203
  <AlertDialogFooter>
190
- <AlertDialogCancel disabled={isRestoring}>{t('cancel')}</AlertDialogCancel>
204
+ <AlertDialogCancel disabled={isRestoring}>
205
+ {t('cancel')}
206
+ </AlertDialogCancel>
191
207
  <AlertDialogAction onClick={handleRestore} disabled={isRestoring}>
192
208
  {isRestoring ? t('restoring') : t('restoreVersion')}
193
209
  </AlertDialogAction>