@hed-hog/core 0.0.350 → 0.0.351

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 (284) hide show
  1. package/dist/access-log/access-log.controller.d.ts +16 -0
  2. package/dist/access-log/access-log.controller.d.ts.map +1 -0
  3. package/dist/access-log/access-log.controller.js +44 -0
  4. package/dist/access-log/access-log.controller.js.map +1 -0
  5. package/dist/access-log/access-log.interceptor.d.ts +9 -0
  6. package/dist/access-log/access-log.interceptor.d.ts.map +1 -0
  7. package/dist/access-log/access-log.interceptor.js +46 -0
  8. package/dist/access-log/access-log.interceptor.js.map +1 -0
  9. package/dist/access-log/access-log.module.d.ts +3 -0
  10. package/dist/access-log/access-log.module.d.ts.map +1 -0
  11. package/dist/access-log/access-log.module.js +29 -0
  12. package/dist/access-log/access-log.module.js.map +1 -0
  13. package/dist/access-log/access-log.service.d.ts +47 -0
  14. package/dist/access-log/access-log.service.d.ts.map +1 -0
  15. package/dist/access-log/access-log.service.js +113 -0
  16. package/dist/access-log/access-log.service.js.map +1 -0
  17. package/dist/access-log/dto/query-access-log.dto.d.ts +8 -0
  18. package/dist/access-log/dto/query-access-log.dto.d.ts.map +1 -0
  19. package/dist/access-log/dto/query-access-log.dto.js +42 -0
  20. package/dist/access-log/dto/query-access-log.dto.js.map +1 -0
  21. package/dist/auth/auth.controller.d.ts +9 -9
  22. package/dist/auth/auth.service.d.ts +19 -19
  23. package/dist/auth/auth.service.d.ts.map +1 -1
  24. package/dist/auth/auth.service.js +0 -4
  25. package/dist/auth/auth.service.js.map +1 -1
  26. package/dist/challenge/challenge.service.d.ts +2 -2
  27. package/dist/challenge/challenge.service.d.ts.map +1 -1
  28. package/dist/challenge/challenge.service.js +0 -1
  29. package/dist/challenge/challenge.service.js.map +1 -1
  30. package/dist/core/system.module.d.ts.map +1 -1
  31. package/dist/core/system.module.js +1 -0
  32. package/dist/core/system.module.js.map +1 -1
  33. package/dist/core.module.d.ts.map +1 -1
  34. package/dist/core.module.js +12 -0
  35. package/dist/core.module.js.map +1 -1
  36. package/dist/dashboard/dashboard-user/dashboard-user.controller.d.ts +3 -3
  37. package/dist/dashboard/dashboard-user/dashboard-user.service.d.ts +3 -3
  38. package/dist/dashboard/dashboard.module.d.ts.map +1 -1
  39. package/dist/dashboard/dashboard.module.js +4 -1
  40. package/dist/dashboard/dashboard.module.js.map +1 -1
  41. package/dist/file/file.controller.js +0 -1
  42. package/dist/file/file.controller.js.map +1 -1
  43. package/dist/file/file.service.d.ts +65 -0
  44. package/dist/file/file.service.d.ts.map +1 -1
  45. package/dist/file/file.service.js +151 -3
  46. package/dist/file/file.service.js.map +1 -1
  47. package/dist/file/provider/abstract.provider.d.ts +8 -0
  48. package/dist/file/provider/abstract.provider.d.ts.map +1 -1
  49. package/dist/file/provider/abstract.provider.js.map +1 -1
  50. package/dist/file/provider/azure.provider.d.ts +4 -0
  51. package/dist/file/provider/azure.provider.d.ts.map +1 -1
  52. package/dist/file/provider/azure.provider.js +14 -0
  53. package/dist/file/provider/azure.provider.js.map +1 -1
  54. package/dist/file/provider/gcs.provider.d.ts +4 -0
  55. package/dist/file/provider/gcs.provider.d.ts.map +1 -1
  56. package/dist/file/provider/gcs.provider.js +14 -0
  57. package/dist/file/provider/gcs.provider.js.map +1 -1
  58. package/dist/file/provider/local.provider.d.ts +4 -0
  59. package/dist/file/provider/local.provider.d.ts.map +1 -1
  60. package/dist/file/provider/local.provider.js +19 -0
  61. package/dist/file/provider/local.provider.js.map +1 -1
  62. package/dist/file/provider/provider.factory.d.ts.map +1 -1
  63. package/dist/file/provider/provider.factory.js +3 -0
  64. package/dist/file/provider/provider.factory.js.map +1 -1
  65. package/dist/file/provider/s3.provider.d.ts +4 -0
  66. package/dist/file/provider/s3.provider.d.ts.map +1 -1
  67. package/dist/file/provider/s3.provider.js +17 -0
  68. package/dist/file/provider/s3.provider.js.map +1 -1
  69. package/dist/mcp/mcp-audit.service.d.ts +3 -1
  70. package/dist/mcp/mcp-audit.service.d.ts.map +1 -1
  71. package/dist/mcp/mcp-audit.service.js +14 -2
  72. package/dist/mcp/mcp-audit.service.js.map +1 -1
  73. package/dist/mcp/mcp.controller.d.ts +3 -1
  74. package/dist/mcp/mcp.controller.d.ts.map +1 -1
  75. package/dist/mcp/mcp.controller.js +10 -2
  76. package/dist/mcp/mcp.controller.js.map +1 -1
  77. package/dist/mcp/mcp.module.d.ts.map +1 -1
  78. package/dist/mcp/mcp.module.js +72 -0
  79. package/dist/mcp/mcp.module.js.map +1 -1
  80. package/dist/mcp/tools/core-ai.mcp-tools.d.ts +45 -0
  81. package/dist/mcp/tools/core-ai.mcp-tools.d.ts.map +1 -0
  82. package/dist/mcp/tools/core-ai.mcp-tools.js +214 -0
  83. package/dist/mcp/tools/core-ai.mcp-tools.js.map +1 -0
  84. package/dist/mcp/tools/core-dashboard-items.mcp-tools.d.ts +21 -0
  85. package/dist/mcp/tools/core-dashboard-items.mcp-tools.d.ts.map +1 -0
  86. package/dist/mcp/tools/core-dashboard-items.mcp-tools.js +89 -0
  87. package/dist/mcp/tools/core-dashboard-items.mcp-tools.js.map +1 -0
  88. package/dist/mcp/tools/core-dashboard.mcp-tools.d.ts +29 -0
  89. package/dist/mcp/tools/core-dashboard.mcp-tools.d.ts.map +1 -0
  90. package/dist/mcp/tools/core-dashboard.mcp-tools.js +149 -0
  91. package/dist/mcp/tools/core-dashboard.mcp-tools.js.map +1 -0
  92. package/dist/mcp/tools/core-event-webhooks.mcp-tools.d.ts +30 -0
  93. package/dist/mcp/tools/core-event-webhooks.mcp-tools.d.ts.map +1 -0
  94. package/dist/mcp/tools/core-event-webhooks.mcp-tools.js +185 -0
  95. package/dist/mcp/tools/core-event-webhooks.mcp-tools.js.map +1 -0
  96. package/dist/mcp/tools/core-files.mcp-tools.d.ts +26 -0
  97. package/dist/mcp/tools/core-files.mcp-tools.d.ts.map +1 -0
  98. package/dist/mcp/tools/core-files.mcp-tools.js +140 -0
  99. package/dist/mcp/tools/core-files.mcp-tools.js.map +1 -0
  100. package/dist/mcp/tools/core-integration-events.mcp-tools.d.ts +26 -0
  101. package/dist/mcp/tools/core-integration-events.mcp-tools.d.ts.map +1 -0
  102. package/dist/mcp/tools/core-integration-events.mcp-tools.js +168 -0
  103. package/dist/mcp/tools/core-integration-events.mcp-tools.js.map +1 -0
  104. package/dist/mcp/tools/core-mail-profile.mcp-tools.d.ts +32 -0
  105. package/dist/mcp/tools/core-mail-profile.mcp-tools.d.ts.map +1 -0
  106. package/dist/mcp/tools/core-mail-profile.mcp-tools.js +178 -0
  107. package/dist/mcp/tools/core-mail-profile.mcp-tools.js.map +1 -0
  108. package/dist/mcp/tools/core-mail-sent.mcp-tools.d.ts +14 -0
  109. package/dist/mcp/tools/core-mail-sent.mcp-tools.d.ts.map +1 -0
  110. package/dist/mcp/tools/core-mail-sent.mcp-tools.js +106 -0
  111. package/dist/mcp/tools/core-mail-sent.mcp-tools.js.map +1 -0
  112. package/dist/mcp/tools/core-mail.mcp-tools.d.ts +36 -0
  113. package/dist/mcp/tools/core-mail.mcp-tools.d.ts.map +1 -0
  114. package/dist/mcp/tools/core-mail.mcp-tools.js +184 -0
  115. package/dist/mcp/tools/core-mail.mcp-tools.js.map +1 -0
  116. package/dist/mcp/tools/core-mcp-chat.mcp-tools.d.ts +21 -0
  117. package/dist/mcp/tools/core-mcp-chat.mcp-tools.d.ts.map +1 -0
  118. package/dist/mcp/tools/core-mcp-chat.mcp-tools.js +118 -0
  119. package/dist/mcp/tools/core-mcp-chat.mcp-tools.js.map +1 -0
  120. package/dist/mcp/tools/core-menus.mcp-tools.d.ts +40 -0
  121. package/dist/mcp/tools/core-menus.mcp-tools.d.ts.map +1 -0
  122. package/dist/mcp/tools/core-menus.mcp-tools.js +268 -0
  123. package/dist/mcp/tools/core-menus.mcp-tools.js.map +1 -0
  124. package/dist/mcp/tools/core-notifications.mcp-tools.d.ts +31 -0
  125. package/dist/mcp/tools/core-notifications.mcp-tools.d.ts.map +1 -0
  126. package/dist/mcp/tools/core-notifications.mcp-tools.js +178 -0
  127. package/dist/mcp/tools/core-notifications.mcp-tools.js.map +1 -0
  128. package/dist/mcp/tools/core-profile.mcp-tools.d.ts +20 -0
  129. package/dist/mcp/tools/core-profile.mcp-tools.d.ts.map +1 -0
  130. package/dist/mcp/tools/core-profile.mcp-tools.js +111 -0
  131. package/dist/mcp/tools/core-profile.mcp-tools.js.map +1 -0
  132. package/dist/mcp/tools/core-roles.mcp-tools.d.ts +70 -0
  133. package/dist/mcp/tools/core-roles.mcp-tools.d.ts.map +1 -0
  134. package/dist/mcp/tools/core-roles.mcp-tools.js +355 -0
  135. package/dist/mcp/tools/core-roles.mcp-tools.js.map +1 -0
  136. package/dist/mcp/tools/core-routes.mcp-tools.d.ts +52 -0
  137. package/dist/mcp/tools/core-routes.mcp-tools.d.ts.map +1 -0
  138. package/dist/mcp/tools/core-routes.mcp-tools.js +254 -0
  139. package/dist/mcp/tools/core-routes.mcp-tools.js.map +1 -0
  140. package/dist/mcp/tools/core-screens.mcp-tools.d.ts +47 -0
  141. package/dist/mcp/tools/core-screens.mcp-tools.d.ts.map +1 -0
  142. package/dist/mcp/tools/core-screens.mcp-tools.js +250 -0
  143. package/dist/mcp/tools/core-screens.mcp-tools.js.map +1 -0
  144. package/dist/mcp/tools/core-sessions.mcp-tools.d.ts +20 -0
  145. package/dist/mcp/tools/core-sessions.mcp-tools.d.ts.map +1 -0
  146. package/dist/mcp/tools/core-sessions.mcp-tools.js +128 -0
  147. package/dist/mcp/tools/core-sessions.mcp-tools.js.map +1 -0
  148. package/dist/mcp/tools/core-settings.mcp-tools.d.ts +25 -0
  149. package/dist/mcp/tools/core-settings.mcp-tools.d.ts.map +1 -1
  150. package/dist/mcp/tools/core-settings.mcp-tools.js +138 -0
  151. package/dist/mcp/tools/core-settings.mcp-tools.js.map +1 -1
  152. package/dist/mcp/tools/core-system.mcp-tools.d.ts +8 -0
  153. package/dist/mcp/tools/core-system.mcp-tools.d.ts.map +1 -0
  154. package/dist/mcp/tools/core-system.mcp-tools.js +40 -0
  155. package/dist/mcp/tools/core-system.mcp-tools.js.map +1 -0
  156. package/dist/mcp/tools/core-webhooks.mcp-tools.d.ts +46 -0
  157. package/dist/mcp/tools/core-webhooks.mcp-tools.d.ts.map +1 -0
  158. package/dist/mcp/tools/core-webhooks.mcp-tools.js +266 -0
  159. package/dist/mcp/tools/core-webhooks.mcp-tools.js.map +1 -0
  160. package/dist/mcp-chat/mcp-chat.controller.d.ts +1 -1
  161. package/dist/mcp-chat/mcp-chat.service.d.ts +25 -2
  162. package/dist/mcp-chat/mcp-chat.service.d.ts.map +1 -1
  163. package/dist/mcp-chat/mcp-chat.service.js +666 -36
  164. package/dist/mcp-chat/mcp-chat.service.js.map +1 -1
  165. package/dist/notification/notification.controller.d.ts +8 -4
  166. package/dist/notification/notification.controller.d.ts.map +1 -1
  167. package/dist/notification/notification.controller.js +12 -0
  168. package/dist/notification/notification.controller.js.map +1 -1
  169. package/dist/notification/notification.service.d.ts +19 -5
  170. package/dist/notification/notification.service.d.ts.map +1 -1
  171. package/dist/notification/notification.service.js +155 -9
  172. package/dist/notification/notification.service.js.map +1 -1
  173. package/dist/pdf/pdf.service.js +1 -1
  174. package/dist/pdf/pdf.service.js.map +1 -1
  175. package/dist/profile/profile.controller.d.ts +3 -3
  176. package/dist/profile/profile.controller.js +0 -1
  177. package/dist/profile/profile.controller.js.map +1 -1
  178. package/dist/profile/profile.module.d.ts.map +1 -1
  179. package/dist/profile/profile.module.js +1 -0
  180. package/dist/profile/profile.module.js.map +1 -1
  181. package/dist/profile/profile.service.d.ts +3 -3
  182. package/dist/session/session.controller.d.ts +2 -2
  183. package/dist/session/session.service.d.ts +6 -6
  184. package/dist/setting/setting.controller.d.ts +1 -1
  185. package/dist/setting/setting.service.d.ts +1 -1
  186. package/dist/setting/setting.service.d.ts.map +1 -1
  187. package/dist/setting/setting.service.js +1 -4
  188. package/dist/setting/setting.service.js.map +1 -1
  189. package/dist/task/task.service.d.ts +1 -0
  190. package/dist/task/task.service.d.ts.map +1 -1
  191. package/dist/task/task.service.js +25 -0
  192. package/dist/task/task.service.js.map +1 -1
  193. package/dist/token/token.service.d.ts.map +1 -1
  194. package/dist/token/token.service.js +0 -1
  195. package/dist/token/token.service.js.map +1 -1
  196. package/dist/user/user.controller.d.ts +9 -9
  197. package/dist/user/user.service.d.ts +21 -21
  198. package/dist/webhook-integration/dto/webhook-action.dto.d.ts +22 -0
  199. package/dist/webhook-integration/dto/webhook-action.dto.d.ts.map +1 -0
  200. package/dist/webhook-integration/dto/webhook-action.dto.js +120 -0
  201. package/dist/webhook-integration/dto/webhook-action.dto.js.map +1 -0
  202. package/dist/webhook-integration/webhook-integration.controller.d.ts +7 -5
  203. package/dist/webhook-integration/webhook-integration.controller.d.ts.map +1 -1
  204. package/dist/webhook-integration/webhook-integration.controller.js +18 -5
  205. package/dist/webhook-integration/webhook-integration.controller.js.map +1 -1
  206. package/dist/webhook-integration/webhook-integration.service.d.ts +14 -5
  207. package/dist/webhook-integration/webhook-integration.service.d.ts.map +1 -1
  208. package/dist/webhook-integration/webhook-integration.service.js +174 -41
  209. package/dist/webhook-integration/webhook-integration.service.js.map +1 -1
  210. package/hedhog/data/menu.yaml +15 -0
  211. package/hedhog/data/route.yaml +1304 -0
  212. package/hedhog/data/setting_group.yaml +67 -0
  213. package/hedhog/data/setting_subgroup.yaml +16 -0
  214. package/hedhog/frontend/app/access-log/page.tsx.ejs +772 -0
  215. package/hedhog/frontend/app/ai_agent/page.tsx.ejs +10 -3
  216. package/hedhog/frontend/app/dashboard/dashboard-home-tabs.tsx.ejs +33 -13
  217. package/hedhog/frontend/app/dashboard/management/tabs/components-tab.tsx.ejs +12 -5
  218. package/hedhog/frontend/app/dashboard/management/tabs/dashboards-tab.tsx.ejs +12 -5
  219. package/hedhog/frontend/app/integrations-webhooks/page.tsx.ejs +1817 -356
  220. package/hedhog/frontend/app/mcp_chat/chat-components.tsx.ejs +43 -5
  221. package/hedhog/frontend/app/mcp_chat/page.tsx.ejs +35 -7
  222. package/hedhog/frontend/app/menu/page.tsx.ejs +9 -3
  223. package/hedhog/frontend/app/roles/page.tsx.ejs +18 -6
  224. package/hedhog/frontend/app/routes/page.tsx.ejs +9 -3
  225. package/hedhog/frontend/app/setting-list/page.tsx.ejs +344 -171
  226. package/hedhog/frontend/app/users/user-access-sheet.tsx.ejs +310 -304
  227. package/hedhog/frontend/app/users/user-sheet.tsx.ejs +25 -7
  228. package/hedhog/frontend/messages/en.json +104 -3
  229. package/hedhog/frontend/messages/pt.json +104 -3
  230. package/hedhog/table/access_log.yaml +31 -0
  231. package/package.json +5 -4
  232. package/src/access-log/access-log.controller.ts +29 -0
  233. package/src/access-log/access-log.interceptor.ts +38 -0
  234. package/src/access-log/access-log.module.ts +16 -0
  235. package/src/access-log/access-log.service.ts +129 -0
  236. package/src/access-log/dto/query-access-log.dto.ts +23 -0
  237. package/src/auth/auth.service.ts +0 -7
  238. package/src/challenge/challenge.service.ts +0 -2
  239. package/src/core/system.module.ts +1 -0
  240. package/src/core.module.ts +12 -0
  241. package/src/dashboard/dashboard.module.ts +4 -1
  242. package/src/file/file.controller.ts +14 -14
  243. package/src/file/file.service.ts +198 -4
  244. package/src/file/provider/abstract.provider.ts +10 -0
  245. package/src/file/provider/azure.provider.ts +24 -0
  246. package/src/file/provider/gcs.provider.ts +20 -0
  247. package/src/file/provider/local.provider.ts +30 -2
  248. package/src/file/provider/provider.factory.ts +3 -0
  249. package/src/file/provider/s3.provider.ts +22 -0
  250. package/src/mcp/mcp-audit.service.ts +47 -36
  251. package/src/mcp/mcp.controller.ts +40 -30
  252. package/src/mcp/mcp.module.ts +72 -0
  253. package/src/mcp/tools/core-ai.mcp-tools.ts +156 -0
  254. package/src/mcp/tools/core-dashboard-items.mcp-tools.ts +63 -0
  255. package/src/mcp/tools/core-dashboard.mcp-tools.ts +103 -0
  256. package/src/mcp/tools/core-event-webhooks.mcp-tools.ts +134 -0
  257. package/src/mcp/tools/core-files.mcp-tools.ts +105 -0
  258. package/src/mcp/tools/core-integration-events.mcp-tools.ts +118 -0
  259. package/src/mcp/tools/core-mail-profile.mcp-tools.ts +128 -0
  260. package/src/mcp/tools/core-mail-sent.mcp-tools.ts +76 -0
  261. package/src/mcp/tools/core-mail.mcp-tools.ts +130 -0
  262. package/src/mcp/tools/core-mcp-chat.mcp-tools.ts +81 -0
  263. package/src/mcp/tools/core-menus.mcp-tools.ts +197 -0
  264. package/src/mcp/tools/core-notifications.mcp-tools.ts +128 -0
  265. package/src/mcp/tools/core-profile.mcp-tools.ts +74 -0
  266. package/src/mcp/tools/core-roles.mcp-tools.ts +288 -0
  267. package/src/mcp/tools/core-routes.mcp-tools.ts +196 -0
  268. package/src/mcp/tools/core-screens.mcp-tools.ts +186 -0
  269. package/src/mcp/tools/core-sessions.mcp-tools.ts +97 -0
  270. package/src/mcp/tools/core-settings.mcp-tools.ts +171 -53
  271. package/src/mcp/tools/core-system.mcp-tools.ts +19 -0
  272. package/src/mcp/tools/core-webhooks.mcp-tools.ts +199 -0
  273. package/src/mcp-chat/mcp-chat.service.ts +887 -38
  274. package/src/notification/notification.controller.ts +20 -8
  275. package/src/notification/notification.service.ts +209 -9
  276. package/src/pdf/pdf.service.ts +1 -1
  277. package/src/profile/profile.controller.ts +1 -1
  278. package/src/profile/profile.module.ts +1 -0
  279. package/src/setting/setting.service.ts +8 -11
  280. package/src/task/task.service.ts +31 -0
  281. package/src/token/token.service.ts +0 -2
  282. package/src/webhook-integration/dto/webhook-action.dto.ts +96 -0
  283. package/src/webhook-integration/webhook-integration.controller.ts +124 -103
  284. package/src/webhook-integration/webhook-integration.service.ts +267 -64
@@ -29,9 +29,9 @@ import {
29
29
  } from '@/components/ui/form';
30
30
  import { FormActions } from '@/components/ui/form-actions';
31
31
  import { Input } from '@/components/ui/input';
32
+ import { ResizableSheetContent } from '@/components/ui/resizable-sheet-content';
32
33
  import {
33
34
  Sheet,
34
- SheetContent,
35
35
  SheetDescription,
36
36
  SheetHeader,
37
37
  SheetTitle,
@@ -246,7 +246,13 @@ function UserCreateSheet({
246
246
 
247
247
  return (
248
248
  <Sheet open={open} onOpenChange={onOpenChange}>
249
- <SheetContent className="w-full sm:max-w-lg overflow-y-auto gap-0">
249
+ <ResizableSheetContent
250
+ sheetId="core-users-create-sheet"
251
+ defaultWidth={560}
252
+ minWidth={420}
253
+ maxWidth={920}
254
+ className="w-full sm:max-w-lg overflow-y-auto gap-0"
255
+ >
250
256
  <SheetHeader>
251
257
  <SheetTitle>{t('dialogAddUserTitle')}</SheetTitle>
252
258
  <SheetDescription>{t('description')}</SheetDescription>
@@ -340,7 +346,7 @@ function UserCreateSheet({
340
346
  />
341
347
  </form>
342
348
  </Form>
343
- </SheetContent>
349
+ </ResizableSheetContent>
344
350
  </Sheet>
345
351
  );
346
352
  }
@@ -610,7 +616,13 @@ function UserEditSheet({
610
616
  if (isLoading || !editingUser) {
611
617
  return (
612
618
  <Sheet open={open} onOpenChange={handleClose}>
613
- <SheetContent className="w-full sm:max-w-4xl overflow-y-auto gap-0">
619
+ <ResizableSheetContent
620
+ sheetId="core-users-edit-sheet"
621
+ defaultWidth={960}
622
+ minWidth={700}
623
+ maxWidth={1400}
624
+ className="w-full sm:max-w-4xl overflow-y-auto gap-0"
625
+ >
614
626
  <SheetHeader>
615
627
  <SheetTitle>{t('titleEditUser')}</SheetTitle>
616
628
  <SheetDescription>{t('description')}</SheetDescription>
@@ -618,14 +630,20 @@ function UserEditSheet({
618
630
  <div className="flex items-center justify-center h-40">
619
631
  <div className="h-8 w-8 border-2 border-primary border-t-transparent rounded-full animate-spin" />
620
632
  </div>
621
- </SheetContent>
633
+ </ResizableSheetContent>
622
634
  </Sheet>
623
635
  );
624
636
  }
625
637
 
626
638
  return (
627
639
  <Sheet open={open} onOpenChange={handleClose}>
628
- <SheetContent className="w-full sm:max-w-4xl overflow-y-auto gap-0">
640
+ <ResizableSheetContent
641
+ sheetId="core-users-edit-sheet"
642
+ defaultWidth={960}
643
+ minWidth={700}
644
+ maxWidth={1400}
645
+ className="w-full sm:max-w-4xl overflow-y-auto gap-0"
646
+ >
629
647
  <SheetHeader>
630
648
  <SheetTitle>{t('titleEditUser')}</SheetTitle>
631
649
  <SheetDescription>{t('description')}</SheetDescription>
@@ -1324,7 +1342,7 @@ function UserEditSheet({
1324
1342
  />
1325
1343
  </TabsContent>
1326
1344
  </Tabs>
1327
- </SheetContent>
1345
+ </ResizableSheetContent>
1328
1346
  </Sheet>
1329
1347
  );
1330
1348
  }
@@ -146,17 +146,26 @@
146
146
  "emptyTitle": "No list settings found",
147
147
  "emptyDescriptionNoSettings": "The selected group has no list settings (combobox/checkbox) with options.",
148
148
  "emptyDescriptionFiltered": "No setting matched the current filter.",
149
- "optionsSectionTitle": "List options",
149
+ "itemCount": "{count, plural, one {# item} other {# items}}",
150
150
  "emptyOptions": "No options configured.",
151
151
  "optionPlaceholder": "Enter option value",
152
152
  "optionsSavedSuccess": "Options updated successfully.",
153
153
  "optionsSavedError": "Could not update options.",
154
+ "optionsClearedSuccess": "List cleared successfully.",
155
+ "optionsClearedError": "Could not clear the list.",
154
156
  "actions": {
157
+ "editOptions": "Edit list",
158
+ "clearOptions": "Clear list",
155
159
  "addOption": "Add option",
156
160
  "removeOption": "Remove option",
157
161
  "saveOptions": "Save options",
158
162
  "saving": "Saving..."
159
163
  },
164
+ "sheet": {
165
+ "title": "Edit list options",
166
+ "description": "Manage list items for \"{name}\".",
167
+ "descriptionFallback": "Manage items from the selected list."
168
+ },
160
169
  "sections": {
161
170
  "withoutSubgroup": "Without subgroup"
162
171
  },
@@ -1835,6 +1844,7 @@
1835
1844
  "name": "Name",
1836
1845
  "technicalName": "Technical name",
1837
1846
  "module": "Module",
1847
+ "provider": "Provider",
1838
1848
  "descriptionColumn": "Description",
1839
1849
  "status": "Status",
1840
1850
  "updatedAt": "Updated at",
@@ -1909,13 +1919,21 @@
1909
1919
  "created": "Created successfully",
1910
1920
  "updated": "Updated successfully",
1911
1921
  "deleted": "Deleted successfully",
1922
+ "loadError": "Could not load the data.",
1912
1923
  "saveError": "Could not save. Please review the data and try again.",
1913
1924
  "deleteError": "Could not delete the item.",
1914
1925
  "tokenGenerated": "Token generated successfully",
1915
1926
  "uuidRegenerated": "UUID regenerated successfully",
1916
1927
  "editEvent": "Edit event",
1917
1928
  "editIncoming": "Edit incoming webhook",
1918
- "editEventWebhook": "Edit event webhook"
1929
+ "editEventWebhook": "Edit event webhook",
1930
+ "logDate": "Date",
1931
+ "logDetailTitle": "Log details",
1932
+ "logError": "Error",
1933
+ "logPayload": "Received payload",
1934
+ "logRequest": "Request",
1935
+ "logOrderDesc": "Most recent first",
1936
+ "logOrderAsc": "Oldest first"
1919
1937
  },
1920
1938
  "McpChatPage": {
1921
1939
  "title": "MCP Chat",
@@ -1944,7 +1962,8 @@
1944
1962
  "emptyConversations": "No conversations yet",
1945
1963
  "breadcrumbDashboard": "Dashboard",
1946
1964
  "breadcrumbManagement": "Management",
1947
- "breadcrumbCurrent": "MCP Chat"
1965
+ "breadcrumbCurrent": "MCP Chat",
1966
+ "mcpDisabled": "MCP Server is disabled. Enable it in Settings → MCP."
1948
1967
  },
1949
1968
  "McpTokens": {
1950
1969
  "title": "MCP API Keys",
@@ -2008,5 +2027,87 @@
2008
2027
  "completed": "Completed",
2009
2028
  "clearAll": "Clear all notifications",
2010
2029
  "failed": "Failed"
2030
+ },
2031
+ "FfmpegParamsEditor": {
2032
+ "resolution": "Resolution",
2033
+ "customResolution": "Custom",
2034
+ "width": "Width",
2035
+ "height": "Height",
2036
+ "videoCodec": "Video Codec",
2037
+ "encodingSpeed": "Encoding Speed",
2038
+ "quality": "Quality",
2039
+ "qualityBest": "Best (larger file)",
2040
+ "qualityWorst": "Worst (smaller file)",
2041
+ "qualityPerfect": "Lossless",
2042
+ "qualityVeryHigh": "Very High",
2043
+ "qualityHigh": "High",
2044
+ "qualityMedium": "Medium",
2045
+ "qualityLow": "Low",
2046
+ "qualityVeryLow": "Very Low",
2047
+ "audioCodec": "Audio Codec",
2048
+ "audioChannels": "Audio Channels",
2049
+ "mono": "Mono (1 channel)",
2050
+ "stereo": "Stereo (2 channels)",
2051
+ "webOptimized": "Optimize for web streaming",
2052
+ "webOptimizedDescription": "Enables fast start for progressive download (recommended for online video)",
2053
+ "keepAspectRatio": "Maintain aspect ratio",
2054
+ "keepAspectRatioDescription": "Adds letterboxing/pillarboxing to preserve original proportions",
2055
+ "deinterlace": "Deinterlace",
2056
+ "deinterlaceDescription": "Removes interlacing artifacts from broadcast or camera footage",
2057
+ "presets": {
2058
+ "ultrafast": "Ultra Fast (lowest quality)",
2059
+ "superfast": "Super Fast",
2060
+ "veryfast": "Very Fast",
2061
+ "faster": "Faster",
2062
+ "fast": "Fast",
2063
+ "medium": "Medium",
2064
+ "slow": "Slow",
2065
+ "slower": "Slower (recommended)",
2066
+ "veryslow": "Very Slow (best quality)"
2067
+ }
2068
+ },
2069
+ "AccessLog": {
2070
+ "breadcrumbHome": "Home",
2071
+ "breadcrumbTitle": "Access Logs",
2072
+ "title": "Access Logs",
2073
+ "description": "Real-time record of all HTTP and MCP access to the system",
2074
+ "totalLogs": "Total Logs",
2075
+ "httpRequests": "HTTP Requests",
2076
+ "mcpCalls": "MCP Calls",
2077
+ "uniqueUsers": "Unique Users",
2078
+ "searchPlaceholder": "Search by path or tool...",
2079
+ "userPickerPlaceholder": "All users",
2080
+ "userPickerSearch": "Search users...",
2081
+ "filterByType": "Type",
2082
+ "typeAll": "All",
2083
+ "typeHttp": "HTTP",
2084
+ "typeMcp": "MCP",
2085
+ "noLogsFound": "No logs found",
2086
+ "adjustSearch": "Try adjusting your filters or date range",
2087
+ "noLogsYet": "No access logs recorded yet",
2088
+ "viewDetails": "Details",
2089
+ "logDetails": "Log Details",
2090
+ "clearFilters": "Clear Filters",
2091
+ "user": "User",
2092
+ "ip": "IP",
2093
+ "browser": "Browser",
2094
+ "method": "Method",
2095
+ "path": "Path",
2096
+ "tool": "MCP Tool",
2097
+ "prompt": "Prompt / Input",
2098
+ "createdAt": "Date / Time",
2099
+ "anonymous": "Anonymous",
2100
+ "loadingLogs": "Loading logs...",
2101
+ "viewMode": "View",
2102
+ "viewModeTable": "Table",
2103
+ "viewModeCards": "Cards",
2104
+ "refreshList": "Refresh",
2105
+ "liveMode": "Live",
2106
+ "pauseUpdates": "Pause",
2107
+ "resumeUpdates": "Resume",
2108
+ "id": "ID",
2109
+ "actions": "Actions",
2110
+ "noUserAgent": "—",
2111
+ "detailsDescription": "Full details of this access log entry"
2011
2112
  }
2012
2113
  }
@@ -146,17 +146,26 @@
146
146
  "emptyTitle": "Nenhuma setting de lista encontrada",
147
147
  "emptyDescriptionNoSettings": "O grupo selecionado não possui settings de lista (combobox/checkbox) com opções.",
148
148
  "emptyDescriptionFiltered": "Nenhuma setting encontrada para o filtro informado.",
149
- "optionsSectionTitle": "Opções da lista",
149
+ "itemCount": "{count, plural, one {# item} other {# itens}}",
150
150
  "emptyOptions": "Nenhuma opção cadastrada.",
151
151
  "optionPlaceholder": "Digite o valor da opção",
152
152
  "optionsSavedSuccess": "Opções atualizadas com sucesso.",
153
153
  "optionsSavedError": "Não foi possível atualizar as opções.",
154
+ "optionsClearedSuccess": "Lista limpa com sucesso.",
155
+ "optionsClearedError": "Não foi possível limpar a lista.",
154
156
  "actions": {
157
+ "editOptions": "Editar lista",
158
+ "clearOptions": "Limpar lista",
155
159
  "addOption": "Adicionar opção",
156
160
  "removeOption": "Remover opção",
157
161
  "saveOptions": "Salvar opções",
158
162
  "saving": "Salvando..."
159
163
  },
164
+ "sheet": {
165
+ "title": "Editar opções da lista",
166
+ "description": "Gerencie os itens da lista de \"{name}\".",
167
+ "descriptionFallback": "Gerencie os itens da lista selecionada."
168
+ },
160
169
  "sections": {
161
170
  "withoutSubgroup": "Sem subgrupo"
162
171
  },
@@ -1890,6 +1899,7 @@
1890
1899
  "name": "Nome",
1891
1900
  "technicalName": "Nome técnico",
1892
1901
  "module": "Módulo",
1902
+ "provider": "Provedor",
1893
1903
  "descriptionColumn": "Descrição",
1894
1904
  "status": "Status",
1895
1905
  "updatedAt": "Atualizado em",
@@ -1964,13 +1974,21 @@
1964
1974
  "created": "Criado com sucesso",
1965
1975
  "updated": "Atualizado com sucesso",
1966
1976
  "deleted": "Excluído com sucesso",
1977
+ "loadError": "Não foi possível carregar os dados.",
1967
1978
  "saveError": "Não foi possível salvar. Verifique os dados e tente novamente.",
1968
1979
  "deleteError": "Não foi possível excluir o item.",
1969
1980
  "tokenGenerated": "Token gerado com sucesso",
1970
1981
  "uuidRegenerated": "UUID regenerado com sucesso",
1971
1982
  "editEvent": "Editar evento",
1972
1983
  "editIncoming": "Editar webhook de entrada",
1973
- "editEventWebhook": "Editar webhook de evento"
1984
+ "editEventWebhook": "Editar webhook de evento",
1985
+ "logDate": "Data",
1986
+ "logDetailTitle": "Detalhes do log",
1987
+ "logError": "Erro",
1988
+ "logPayload": "Payload recebido",
1989
+ "logRequest": "Requisição",
1990
+ "logOrderDesc": "Mais recentes primeiro",
1991
+ "logOrderAsc": "Mais antigos primeiro"
1974
1992
  },
1975
1993
  "McpChatPage": {
1976
1994
  "title": "Chat MCP",
@@ -1999,7 +2017,8 @@
1999
2017
  "emptyConversations": "Nenhuma conversa ainda",
2000
2018
  "breadcrumbDashboard": "Painel",
2001
2019
  "breadcrumbManagement": "Gerenciamento",
2002
- "breadcrumbCurrent": "Chat MCP"
2020
+ "breadcrumbCurrent": "Chat MCP",
2021
+ "mcpDisabled": "O Servidor MCP está desabilitado. Habilite-o em Configurações → MCP."
2003
2022
  },
2004
2023
  "McpTokens": {
2005
2024
  "title": "Chaves de API MCP",
@@ -2063,5 +2082,87 @@
2063
2082
  "completed": "Concluído",
2064
2083
  "clearAll": "Limpar todas as notificações",
2065
2084
  "failed": "Falhou"
2085
+ },
2086
+ "FfmpegParamsEditor": {
2087
+ "resolution": "Resolução",
2088
+ "customResolution": "Personalizada",
2089
+ "width": "Largura",
2090
+ "height": "Altura",
2091
+ "videoCodec": "Codec de Vídeo",
2092
+ "encodingSpeed": "Velocidade de Codificação",
2093
+ "quality": "Qualidade",
2094
+ "qualityBest": "Melhor (arquivo maior)",
2095
+ "qualityWorst": "Pior (arquivo menor)",
2096
+ "qualityPerfect": "Sem perdas",
2097
+ "qualityVeryHigh": "Muito Alta",
2098
+ "qualityHigh": "Alta",
2099
+ "qualityMedium": "Média",
2100
+ "qualityLow": "Baixa",
2101
+ "qualityVeryLow": "Muito Baixa",
2102
+ "audioCodec": "Codec de Áudio",
2103
+ "audioChannels": "Canais de Áudio",
2104
+ "mono": "Mono (1 canal)",
2105
+ "stereo": "Estéreo (2 canais)",
2106
+ "webOptimized": "Otimizar para streaming web",
2107
+ "webOptimizedDescription": "Habilita início rápido para download progressivo (recomendado para vídeos online)",
2108
+ "keepAspectRatio": "Manter proporção original",
2109
+ "keepAspectRatioDescription": "Adiciona barras para preservar as proporções originais do vídeo",
2110
+ "deinterlace": "Desinterlace",
2111
+ "deinterlaceDescription": "Remove artefatos de entrelaçamento de gravações de broadcast ou câmera",
2112
+ "presets": {
2113
+ "ultrafast": "Ultra Rápida (menor qualidade)",
2114
+ "superfast": "Super Rápida",
2115
+ "veryfast": "Muito Rápida",
2116
+ "faster": "Mais Rápida",
2117
+ "fast": "Rápida",
2118
+ "medium": "Média",
2119
+ "slow": "Lenta",
2120
+ "slower": "Mais Lenta (recomendada)",
2121
+ "veryslow": "Muito Lenta (melhor qualidade)"
2122
+ }
2123
+ },
2124
+ "AccessLog": {
2125
+ "breadcrumbHome": "Início",
2126
+ "breadcrumbTitle": "Logs de Acesso",
2127
+ "title": "Logs de Acesso",
2128
+ "description": "Registro em tempo real de todos os acessos HTTP e MCP ao sistema",
2129
+ "totalLogs": "Total de Logs",
2130
+ "httpRequests": "Requisições HTTP",
2131
+ "mcpCalls": "Chamadas MCP",
2132
+ "uniqueUsers": "Usuários Únicos",
2133
+ "searchPlaceholder": "Buscar por path ou ferramenta...",
2134
+ "userPickerPlaceholder": "Todos os usuários",
2135
+ "userPickerSearch": "Buscar usuários...",
2136
+ "filterByType": "Tipo",
2137
+ "typeAll": "Todos",
2138
+ "typeHttp": "HTTP",
2139
+ "typeMcp": "MCP",
2140
+ "noLogsFound": "Nenhum log encontrado",
2141
+ "adjustSearch": "Tente ajustar os filtros ou o intervalo de datas",
2142
+ "noLogsYet": "Nenhum log de acesso registrado ainda",
2143
+ "viewDetails": "Detalhes",
2144
+ "logDetails": "Detalhes do Log",
2145
+ "clearFilters": "Limpar Filtros",
2146
+ "user": "Usuário",
2147
+ "ip": "IP",
2148
+ "browser": "Navegador",
2149
+ "method": "Método",
2150
+ "path": "Rota",
2151
+ "tool": "Ferramenta MCP",
2152
+ "prompt": "Prompt / Input",
2153
+ "createdAt": "Data / Hora",
2154
+ "anonymous": "Anônimo",
2155
+ "loadingLogs": "Carregando logs...",
2156
+ "viewMode": "Visualização",
2157
+ "viewModeTable": "Tabela",
2158
+ "viewModeCards": "Cards",
2159
+ "refreshList": "Atualizar",
2160
+ "liveMode": "Ao Vivo",
2161
+ "pauseUpdates": "Pausar",
2162
+ "resumeUpdates": "Retomar",
2163
+ "id": "ID",
2164
+ "actions": "Ações",
2165
+ "noUserAgent": "—",
2166
+ "detailsDescription": "Detalhes completos desta entrada de log de acesso"
2066
2167
  }
2067
2168
  }
@@ -0,0 +1,31 @@
1
+ columns:
2
+ - type: pk
3
+ - name: user_id
4
+ type: fk
5
+ references:
6
+ table: user
7
+ column: id
8
+ onDelete: SET NULL
9
+ isNullable: true
10
+ - name: ip
11
+ length: 45
12
+ isNullable: true
13
+ - name: user_agent
14
+ type: text
15
+ isNullable: true
16
+ - name: method
17
+ length: 10
18
+ isNullable: true
19
+ - name: path
20
+ length: 2048
21
+ isNullable: true
22
+ - name: mcp_tool
23
+ length: 255
24
+ isNullable: true
25
+ - name: mcp_prompt
26
+ type: text
27
+ isNullable: true
28
+ - type: created_at
29
+ indexes:
30
+ - fields: [user_id]
31
+ - fields: [created_at]
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hed-hog/core",
3
- "version": "0.0.350",
3
+ "version": "0.0.351",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "dependencies": {
@@ -24,6 +24,7 @@
24
24
  "multer": "^2.0.1",
25
25
  "pako": "^2.1.0",
26
26
  "pdf-parse": "^1.1.1",
27
+ "playwright": "^1.49.0",
27
28
  "png-to-ico": "^2.1.8",
28
29
  "qrcode": "^1.5.4",
29
30
  "rxjs": "^7.8.2",
@@ -31,12 +32,12 @@
31
32
  "speakeasy": "^2.0.0",
32
33
  "uuid": "^11.1.0",
33
34
  "@modelcontextprotocol/sdk": "^1.12.0",
35
+ "@hed-hog/api-types": "0.0.1",
34
36
  "@hed-hog/api-locale": "0.0.14",
35
37
  "@hed-hog/api-mail": "0.0.9",
36
- "@hed-hog/api-types": "0.0.1",
37
- "@hed-hog/api-pagination": "0.0.7",
38
+ "@hed-hog/api-prisma": "0.0.6",
38
39
  "@hed-hog/api": "0.0.8",
39
- "@hed-hog/api-prisma": "0.0.6"
40
+ "@hed-hog/api-pagination": "0.0.7"
40
41
  },
41
42
  "exports": {
42
43
  ".": {
@@ -0,0 +1,29 @@
1
+ import { Role } from '@hed-hog/api';
2
+ import { Pagination } from '@hed-hog/api-pagination';
3
+ import { Controller, Get, Inject, Query, forwardRef } from '@nestjs/common';
4
+ import { AccessLogService } from './access-log.service';
5
+ import { QueryAccessLogDto } from './dto/query-access-log.dto';
6
+
7
+ @Role()
8
+ @Controller('access-log')
9
+ export class AccessLogController {
10
+ constructor(
11
+ @Inject(forwardRef(() => AccessLogService))
12
+ private readonly accessLogService: AccessLogService,
13
+ ) {}
14
+
15
+ @Get()
16
+ async list(
17
+ @Pagination() paginationParams,
18
+ @Query() query: QueryAccessLogDto,
19
+ ) {
20
+ return this.accessLogService.list({
21
+ ...paginationParams,
22
+ userId: query.userId ? Number(query.userId) : undefined,
23
+ userSearch: query.userSearch,
24
+ createdAtFrom: query.createdAtFrom,
25
+ createdAtTo: query.createdAtTo,
26
+ type: query.type,
27
+ });
28
+ }
29
+ }
@@ -0,0 +1,38 @@
1
+ import {
2
+ CallHandler,
3
+ ExecutionContext,
4
+ Injectable,
5
+ NestInterceptor,
6
+ } from '@nestjs/common';
7
+ import { Observable, tap } from 'rxjs';
8
+ import { AccessLogService } from './access-log.service';
9
+
10
+ @Injectable()
11
+ export class AccessLogInterceptor implements NestInterceptor {
12
+ constructor(private readonly accessLogService: AccessLogService) {}
13
+
14
+ intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
15
+ if (context.getType() !== 'http') {
16
+ return next.handle();
17
+ }
18
+
19
+ const request = context.switchToHttp().getRequest();
20
+ const path: string = request.url ?? '';
21
+
22
+ if (path.startsWith('/mcp')) {
23
+ return next.handle();
24
+ }
25
+
26
+ return next.handle().pipe(
27
+ tap(() => {
28
+ const userId: number | undefined = request.auth?.sub;
29
+ const forwarded = request.headers['x-forwarded-for'] as string | undefined;
30
+ const ip: string = forwarded ? forwarded.split(',')[0].trim() : (request.ip ?? '');
31
+ const userAgent: string = (request.headers['user-agent'] as string) ?? '';
32
+ const method: string = request.method ?? '';
33
+
34
+ this.accessLogService.recordHttp({ userId, ip, userAgent, method, path });
35
+ }),
36
+ );
37
+ }
38
+ }
@@ -0,0 +1,16 @@
1
+ import { PaginationModule } from '@hed-hog/api-pagination';
2
+ import { PrismaModule } from '@hed-hog/api-prisma';
3
+ import { forwardRef, Module } from '@nestjs/common';
4
+ import { AccessLogController } from './access-log.controller';
5
+ import { AccessLogService } from './access-log.service';
6
+
7
+ @Module({
8
+ imports: [
9
+ forwardRef(() => PrismaModule),
10
+ forwardRef(() => PaginationModule),
11
+ ],
12
+ controllers: [AccessLogController],
13
+ providers: [AccessLogService],
14
+ exports: [AccessLogService],
15
+ })
16
+ export class AccessLogModule {}
@@ -0,0 +1,129 @@
1
+ import { PageOrderDirection, PaginationService } from '@hed-hog/api-pagination';
2
+ import { Prisma, PrismaService } from '@hed-hog/api-prisma';
3
+ import { forwardRef, Inject, Injectable, Logger } from '@nestjs/common';
4
+
5
+ interface RecordHttpData {
6
+ userId?: number;
7
+ ip?: string;
8
+ userAgent?: string;
9
+ method: string;
10
+ path: string;
11
+ }
12
+
13
+ interface RecordMcpData {
14
+ userId?: number;
15
+ mcpTool: string;
16
+ mcpPrompt?: string;
17
+ }
18
+
19
+ type AccessLogListParams = {
20
+ page?: number;
21
+ pageSize?: number;
22
+ search?: string;
23
+ sortField?: string;
24
+ sortOrder?: PageOrderDirection;
25
+ fields?: string;
26
+ userId?: number;
27
+ userSearch?: string;
28
+ createdAtFrom?: string;
29
+ createdAtTo?: string;
30
+ type?: 'http' | 'mcp' | 'all';
31
+ };
32
+
33
+ @Injectable()
34
+ export class AccessLogService {
35
+ private readonly logger = new Logger(AccessLogService.name);
36
+
37
+ constructor(
38
+ @Inject(forwardRef(() => PrismaService))
39
+ private readonly prisma: PrismaService,
40
+ @Inject(forwardRef(() => PaginationService))
41
+ private readonly pagination: PaginationService,
42
+ ) {}
43
+
44
+ recordHttp(data: RecordHttpData): void {
45
+ this.prisma.access_log
46
+ .create({
47
+ data: {
48
+ user_id: data.userId ?? null,
49
+ ip: data.ip ?? null,
50
+ user_agent: data.userAgent ?? null,
51
+ method: data.method,
52
+ path: data.path,
53
+ },
54
+ })
55
+ .catch((e) => this.logger.warn(`Failed to persist HTTP access log: ${e.message}`));
56
+ }
57
+
58
+ recordMcp(data: RecordMcpData): void {
59
+ this.prisma.access_log
60
+ .create({
61
+ data: {
62
+ user_id: data.userId ?? null,
63
+ mcp_tool: data.mcpTool,
64
+ mcp_prompt: data.mcpPrompt ?? null,
65
+ },
66
+ })
67
+ .catch((e) => this.logger.warn(`Failed to persist MCP access log: ${e.message}`));
68
+ }
69
+
70
+ async list(params: AccessLogListParams) {
71
+ const where: Prisma.access_logWhereInput = {};
72
+
73
+ if (params.userId) {
74
+ where.user_id = params.userId;
75
+ }
76
+
77
+ if (params.userSearch) {
78
+ where.user = {
79
+ OR: [
80
+ { name: { contains: params.userSearch, mode: 'insensitive' } },
81
+ ],
82
+ };
83
+ }
84
+
85
+ if (params.createdAtFrom || params.createdAtTo) {
86
+ where.created_at = {};
87
+ if (params.createdAtFrom) {
88
+ where.created_at.gte = new Date(params.createdAtFrom);
89
+ }
90
+ if (params.createdAtTo) {
91
+ const to = new Date(params.createdAtTo);
92
+ to.setHours(23, 59, 59, 999);
93
+ where.created_at.lte = to;
94
+ }
95
+ }
96
+
97
+ if (params.type === 'http') {
98
+ where.method = { not: null };
99
+ } else if (params.type === 'mcp') {
100
+ where.mcp_tool = { not: null };
101
+ }
102
+
103
+ return this.pagination.paginate(this.prisma.access_log, {
104
+ ...params,
105
+ fields: params.fields ?? '',
106
+ }, {
107
+ where,
108
+ orderBy: { created_at: 'desc' },
109
+ include: {
110
+ user: { select: { id: true, name: true, photo_id: true } },
111
+ },
112
+ });
113
+ }
114
+
115
+ async clearOld(retentionDays: number, batchLimit: number): Promise<void> {
116
+ await this.prisma.$executeRaw`
117
+ WITH del AS (
118
+ SELECT id
119
+ FROM access_log
120
+ WHERE created_at < (now() - ${Prisma.sql`INTERVAL '${Prisma.raw(String(retentionDays))} days'`})
121
+ ORDER BY id
122
+ LIMIT ${batchLimit}
123
+ )
124
+ DELETE FROM access_log al
125
+ USING del
126
+ WHERE al.id = del.id
127
+ `;
128
+ }
129
+ }