@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
@@ -0,0 +1,196 @@
1
+ import { Injectable } from '@nestjs/common';
2
+ import { PageOrderDirection } from '@hed-hog/api-pagination';
3
+ import { RouteService } from '../../route/route.service';
4
+ import { McpTool } from '../decorators/mcp-tool.decorator';
5
+ import { McpContext } from '../types/mcp-context.type';
6
+
7
+ @Injectable()
8
+ export class CoreRoutesMcpTools {
9
+ constructor(private readonly routeService: RouteService) {}
10
+
11
+ @McpTool({
12
+ name: 'core.routes.list',
13
+ description: 'Lists all routes with optional pagination and search. Admin only.',
14
+ inputSchema: {
15
+ type: 'object',
16
+ properties: {
17
+ page: { type: 'number', description: 'Page number (default: 1)' },
18
+ pageSize: { type: 'number', description: 'Items per page (default: 20)' },
19
+ search: { type: 'string', description: 'Search term' },
20
+ sortField: { type: 'string', description: 'Field to sort by' },
21
+ sortOrder: { type: 'string', enum: ['asc', 'desc'], description: 'Sort direction' },
22
+ },
23
+ },
24
+ readOnly: true,
25
+ })
26
+ async listRoutes(
27
+ args: { page?: number; pageSize?: number; search?: string; sortField?: string; sortOrder?: string },
28
+ _context: McpContext,
29
+ ): Promise<any> {
30
+ return this.routeService.list({
31
+ page: args.page ?? 1,
32
+ pageSize: args.pageSize ?? 20,
33
+ search: args.search ?? '',
34
+ sortField: args.sortField ?? 'id',
35
+ sortOrder: (args.sortOrder as any) ?? 'asc',
36
+ fields: '',
37
+ });
38
+ }
39
+
40
+ @McpTool({
41
+ name: 'core.routes.get',
42
+ description: 'Returns a single route by ID. Admin only.',
43
+ inputSchema: {
44
+ type: 'object',
45
+ properties: {
46
+ routeId: { type: 'number', description: 'Route ID' },
47
+ },
48
+ required: ['routeId'],
49
+ },
50
+ readOnly: true,
51
+ })
52
+ async getRoute(args: { routeId: number }, context: McpContext): Promise<any> {
53
+ return this.routeService.get(args.routeId, context.locale);
54
+ }
55
+
56
+ @McpTool({
57
+ name: 'core.routes.create',
58
+ description: 'Creates a new HTTP or MCP route. Admin only.',
59
+ inputSchema: {
60
+ type: 'object',
61
+ properties: {
62
+ url: { type: 'string', description: 'Route URL (for HTTP routes)' },
63
+ method: { type: 'string', description: 'HTTP method (GET, POST, PATCH, DELETE, PUT)' },
64
+ type: { type: 'string', enum: ['HTTP', 'MCP'], description: 'Route type (default: HTTP)' },
65
+ tool_name: { type: 'string', description: 'MCP tool name (for MCP routes)' },
66
+ name: { type: 'string', description: 'Display name' },
67
+ },
68
+ },
69
+ })
70
+ async createRoute(
71
+ args: { url?: string; method?: string; type?: string; tool_name?: string; name?: string },
72
+ context: McpContext,
73
+ ): Promise<any> {
74
+ return this.routeService.create(args as any, context.locale);
75
+ }
76
+
77
+ @McpTool({
78
+ name: 'core.routes.update',
79
+ description: 'Updates an existing route by ID. Admin only.',
80
+ inputSchema: {
81
+ type: 'object',
82
+ properties: {
83
+ routeId: { type: 'number', description: 'Route ID' },
84
+ url: { type: 'string', description: 'New URL' },
85
+ method: { type: 'string', description: 'New HTTP method' },
86
+ tool_name: { type: 'string', description: 'New MCP tool name' },
87
+ name: { type: 'string', description: 'New display name' },
88
+ },
89
+ required: ['routeId'],
90
+ },
91
+ })
92
+ async updateRoute(
93
+ args: { routeId: number; url?: string; method?: string; tool_name?: string; name?: string },
94
+ context: McpContext,
95
+ ): Promise<any> {
96
+ const { routeId, ...data } = args;
97
+ return this.routeService.update({ id: routeId, data: data as any }, context.locale);
98
+ }
99
+
100
+ @McpTool({
101
+ name: 'core.routes.delete',
102
+ description: 'Deletes one or more routes by their IDs. Admin only.',
103
+ inputSchema: {
104
+ type: 'object',
105
+ properties: {
106
+ ids: { type: 'array', items: { type: 'number' }, description: 'Route IDs to delete' },
107
+ },
108
+ required: ['ids'],
109
+ },
110
+ })
111
+ async deleteRoutes(args: { ids: number[] }, context: McpContext): Promise<any> {
112
+ return this.routeService.delete({ ids: args.ids }, context.locale);
113
+ }
114
+
115
+ @McpTool({
116
+ name: 'core.routes.roles.list',
117
+ description: 'Lists roles assigned to a route. Admin only.',
118
+ inputSchema: {
119
+ type: 'object',
120
+ properties: {
121
+ routeId: { type: 'number', description: 'Route ID' },
122
+ page: { type: 'number', description: 'Page number (default: 1)' },
123
+ pageSize: { type: 'number', description: 'Items per page (default: 20)' },
124
+ },
125
+ required: ['routeId'],
126
+ },
127
+ readOnly: true,
128
+ })
129
+ async listRouteRoles(args: { routeId: number; page?: number; pageSize?: number }, context: McpContext): Promise<any> {
130
+ return this.routeService.listRoles(context.locale, args.routeId, {
131
+ page: args.page ?? 1,
132
+ pageSize: args.pageSize ?? 20,
133
+ search: '',
134
+ sortField: 'id',
135
+ sortOrder: PageOrderDirection.Asc,
136
+ fields: '',
137
+ });
138
+ }
139
+
140
+ @McpTool({
141
+ name: 'core.routes.roles.update',
142
+ description: 'Replaces all roles assigned to a route. Admin only.',
143
+ inputSchema: {
144
+ type: 'object',
145
+ properties: {
146
+ routeId: { type: 'number', description: 'Route ID' },
147
+ ids: { type: 'array', items: { type: 'number' }, description: 'Role IDs to assign' },
148
+ },
149
+ required: ['routeId', 'ids'],
150
+ },
151
+ })
152
+ async updateRouteRoles(args: { routeId: number; ids: number[] }, _context: McpContext): Promise<any> {
153
+ return this.routeService.updateRoles(args.routeId, { ids: args.ids });
154
+ }
155
+
156
+ @McpTool({
157
+ name: 'core.routes.screens.list',
158
+ description: 'Lists screens assigned to a route. Admin only.',
159
+ inputSchema: {
160
+ type: 'object',
161
+ properties: {
162
+ routeId: { type: 'number', description: 'Route ID' },
163
+ page: { type: 'number', description: 'Page number (default: 1)' },
164
+ pageSize: { type: 'number', description: 'Items per page (default: 20)' },
165
+ },
166
+ required: ['routeId'],
167
+ },
168
+ readOnly: true,
169
+ })
170
+ async listRouteScreens(args: { routeId: number; page?: number; pageSize?: number }, context: McpContext): Promise<any> {
171
+ return this.routeService.listScreens(context.locale, args.routeId, {
172
+ page: args.page ?? 1,
173
+ pageSize: args.pageSize ?? 20,
174
+ search: '',
175
+ sortField: 'id',
176
+ sortOrder: PageOrderDirection.Asc,
177
+ fields: '',
178
+ });
179
+ }
180
+
181
+ @McpTool({
182
+ name: 'core.routes.screens.update',
183
+ description: 'Replaces all screens assigned to a route. Admin only.',
184
+ inputSchema: {
185
+ type: 'object',
186
+ properties: {
187
+ routeId: { type: 'number', description: 'Route ID' },
188
+ ids: { type: 'array', items: { type: 'number' }, description: 'Screen IDs to assign' },
189
+ },
190
+ required: ['routeId', 'ids'],
191
+ },
192
+ })
193
+ async updateRouteScreens(args: { routeId: number; ids: number[] }, _context: McpContext): Promise<any> {
194
+ return this.routeService.updateScreens(args.routeId, { ids: args.ids });
195
+ }
196
+ }
@@ -0,0 +1,186 @@
1
+ import { Injectable } from '@nestjs/common';
2
+ import { PageOrderDirection } from '@hed-hog/api-pagination';
3
+ import { ScreenService } from '../../screen/screen.service';
4
+ import { McpTool } from '../decorators/mcp-tool.decorator';
5
+ import { McpContext } from '../types/mcp-context.type';
6
+
7
+ @Injectable()
8
+ export class CoreScreensMcpTools {
9
+ constructor(private readonly screenService: ScreenService) {}
10
+
11
+ @McpTool({
12
+ name: 'core.screens.list',
13
+ description: 'Lists all screens with optional pagination and search. Admin only.',
14
+ inputSchema: {
15
+ type: 'object',
16
+ properties: {
17
+ page: { type: 'number', description: 'Page number (default: 1)' },
18
+ pageSize: { type: 'number', description: 'Items per page (default: 20)' },
19
+ search: { type: 'string', description: 'Search term' },
20
+ sortField: { type: 'string', description: 'Field to sort by' },
21
+ sortOrder: { type: 'string', enum: ['asc', 'desc'], description: 'Sort direction' },
22
+ },
23
+ },
24
+ readOnly: true,
25
+ })
26
+ async listScreens(
27
+ args: { page?: number; pageSize?: number; search?: string; sortField?: string; sortOrder?: string },
28
+ context: McpContext,
29
+ ): Promise<any> {
30
+ return this.screenService.list(context.locale, {
31
+ page: args.page ?? 1,
32
+ pageSize: args.pageSize ?? 20,
33
+ search: args.search ?? '',
34
+ sortField: args.sortField ?? 'id',
35
+ sortOrder: (args.sortOrder as any) ?? 'asc',
36
+ fields: '',
37
+ });
38
+ }
39
+
40
+ @McpTool({
41
+ name: 'core.screens.get',
42
+ description: 'Returns a single screen by ID. Admin only.',
43
+ inputSchema: {
44
+ type: 'object',
45
+ properties: {
46
+ screenId: { type: 'number', description: 'Screen ID' },
47
+ },
48
+ required: ['screenId'],
49
+ },
50
+ readOnly: true,
51
+ })
52
+ async getScreen(args: { screenId: number }, _context: McpContext): Promise<any> {
53
+ return this.screenService.get(args.screenId);
54
+ }
55
+
56
+ @McpTool({
57
+ name: 'core.screens.create',
58
+ description: 'Creates a new screen. Admin only.',
59
+ inputSchema: {
60
+ type: 'object',
61
+ properties: {
62
+ slug: { type: 'string', description: 'Screen slug (unique identifier)' },
63
+ locale: { type: 'object', description: 'Locale translations, e.g. {"en": {"name": "Dashboard"}}' },
64
+ },
65
+ required: ['slug'],
66
+ },
67
+ })
68
+ async createScreen(args: { slug: string; locale?: Record<string, any> }, _context: McpContext): Promise<any> {
69
+ return this.screenService.create(args as any);
70
+ }
71
+
72
+ @McpTool({
73
+ name: 'core.screens.update',
74
+ description: 'Updates an existing screen by ID. Admin only.',
75
+ inputSchema: {
76
+ type: 'object',
77
+ properties: {
78
+ screenId: { type: 'number', description: 'Screen ID' },
79
+ slug: { type: 'string', description: 'New slug' },
80
+ locale: { type: 'object', description: 'Updated locale translations' },
81
+ },
82
+ required: ['screenId'],
83
+ },
84
+ })
85
+ async updateScreen(args: { screenId: number; slug?: string; locale?: Record<string, any> }, _context: McpContext): Promise<any> {
86
+ const { screenId, ...data } = args;
87
+ return this.screenService.update({ id: screenId, data: data as any });
88
+ }
89
+
90
+ @McpTool({
91
+ name: 'core.screens.delete',
92
+ description: 'Deletes one or more screens by their IDs. Admin only.',
93
+ inputSchema: {
94
+ type: 'object',
95
+ properties: {
96
+ ids: { type: 'array', items: { type: 'number' }, description: 'Screen IDs to delete' },
97
+ },
98
+ required: ['ids'],
99
+ },
100
+ })
101
+ async deleteScreens(args: { ids: number[] }, _context: McpContext): Promise<any> {
102
+ return this.screenService.delete({ ids: args.ids });
103
+ }
104
+
105
+ @McpTool({
106
+ name: 'core.screens.roles.list',
107
+ description: 'Lists roles assigned to a screen. Admin only.',
108
+ inputSchema: {
109
+ type: 'object',
110
+ properties: {
111
+ screenId: { type: 'number', description: 'Screen ID' },
112
+ page: { type: 'number', description: 'Page number (default: 1)' },
113
+ pageSize: { type: 'number', description: 'Items per page (default: 20)' },
114
+ },
115
+ required: ['screenId'],
116
+ },
117
+ readOnly: true,
118
+ })
119
+ async listScreenRoles(args: { screenId: number; page?: number; pageSize?: number }, context: McpContext): Promise<any> {
120
+ return this.screenService.listRoles(context.locale, args.screenId, {
121
+ page: args.page ?? 1,
122
+ pageSize: args.pageSize ?? 20,
123
+ search: '',
124
+ sortField: 'id',
125
+ sortOrder: PageOrderDirection.Asc,
126
+ fields: '',
127
+ });
128
+ }
129
+
130
+ @McpTool({
131
+ name: 'core.screens.roles.update',
132
+ description: 'Replaces all roles assigned to a screen. Admin only.',
133
+ inputSchema: {
134
+ type: 'object',
135
+ properties: {
136
+ screenId: { type: 'number', description: 'Screen ID' },
137
+ ids: { type: 'array', items: { type: 'number' }, description: 'Role IDs to assign' },
138
+ },
139
+ required: ['screenId', 'ids'],
140
+ },
141
+ })
142
+ async updateScreenRoles(args: { screenId: number; ids: number[] }, _context: McpContext): Promise<any> {
143
+ return this.screenService.updateRoles(args.screenId, { ids: args.ids });
144
+ }
145
+
146
+ @McpTool({
147
+ name: 'core.screens.routes.list',
148
+ description: 'Lists routes assigned to a screen. Admin only.',
149
+ inputSchema: {
150
+ type: 'object',
151
+ properties: {
152
+ screenId: { type: 'number', description: 'Screen ID' },
153
+ page: { type: 'number', description: 'Page number (default: 1)' },
154
+ pageSize: { type: 'number', description: 'Items per page (default: 20)' },
155
+ },
156
+ required: ['screenId'],
157
+ },
158
+ readOnly: true,
159
+ })
160
+ async listScreenRoutes(args: { screenId: number; page?: number; pageSize?: number }, _context: McpContext): Promise<any> {
161
+ return this.screenService.listRoutes(args.screenId, {
162
+ page: args.page ?? 1,
163
+ pageSize: args.pageSize ?? 20,
164
+ search: '',
165
+ sortField: 'id',
166
+ sortOrder: PageOrderDirection.Asc,
167
+ fields: '',
168
+ });
169
+ }
170
+
171
+ @McpTool({
172
+ name: 'core.screens.routes.update',
173
+ description: 'Replaces all routes assigned to a screen. Admin only.',
174
+ inputSchema: {
175
+ type: 'object',
176
+ properties: {
177
+ screenId: { type: 'number', description: 'Screen ID' },
178
+ ids: { type: 'array', items: { type: 'number' }, description: 'Route IDs to assign' },
179
+ },
180
+ required: ['screenId', 'ids'],
181
+ },
182
+ })
183
+ async updateScreenRoutes(args: { screenId: number; ids: number[] }, _context: McpContext): Promise<any> {
184
+ return this.screenService.updateRoutes(args.screenId, { ids: args.ids });
185
+ }
186
+ }
@@ -0,0 +1,97 @@
1
+ import { Injectable } from '@nestjs/common';
2
+ import { PageOrderDirection } from '@hed-hog/api-pagination';
3
+ import { SessionService } from '../../session/session.service';
4
+ import { McpTool } from '../decorators/mcp-tool.decorator';
5
+ import { McpContext } from '../types/mcp-context.type';
6
+
7
+ @Injectable()
8
+ export class CoreSessionsMcpTools {
9
+ constructor(private readonly sessionService: SessionService) {}
10
+
11
+ @McpTool({
12
+ name: 'core.sessions.active',
13
+ description: 'Returns active sessions for the authenticated user.',
14
+ inputSchema: {
15
+ type: 'object',
16
+ properties: {
17
+ page: { type: 'number', description: 'Page number (default: 1)' },
18
+ pageSize: { type: 'number', description: 'Items per page (default: 20)' },
19
+ },
20
+ },
21
+ readOnly: true,
22
+ })
23
+ async getActiveSessions(args: { page?: number; pageSize?: number }, context: McpContext): Promise<any> {
24
+ return this.sessionService.getUserSessionsActive(
25
+ {
26
+ page: args.page ?? 1,
27
+ pageSize: args.pageSize ?? 20,
28
+ search: '',
29
+ sortField: 'id',
30
+ sortOrder: PageOrderDirection.Asc,
31
+ fields: '',
32
+ },
33
+ context.userId,
34
+ context.locale,
35
+ );
36
+ }
37
+
38
+ @McpTool({
39
+ name: 'core.sessions.all',
40
+ description: 'Returns all sessions (active and revoked) for the authenticated user.',
41
+ inputSchema: {
42
+ type: 'object',
43
+ properties: {
44
+ page: { type: 'number', description: 'Page number (default: 1)' },
45
+ pageSize: { type: 'number', description: 'Items per page (default: 20)' },
46
+ },
47
+ },
48
+ readOnly: true,
49
+ })
50
+ async getAllSessions(args: { page?: number; pageSize?: number }, context: McpContext): Promise<any> {
51
+ return this.sessionService.getUserSessions(
52
+ {
53
+ page: args.page ?? 1,
54
+ pageSize: args.pageSize ?? 20,
55
+ search: '',
56
+ sortField: 'id',
57
+ sortOrder: PageOrderDirection.Asc,
58
+ fields: '',
59
+ },
60
+ context.userId,
61
+ context.locale,
62
+ );
63
+ }
64
+
65
+ @McpTool({
66
+ name: 'core.sessions.revoke',
67
+ description: 'Revokes a specific session for the authenticated user.',
68
+ inputSchema: {
69
+ type: 'object',
70
+ properties: {
71
+ sessionId: { type: 'number', description: 'Session ID to revoke' },
72
+ },
73
+ required: ['sessionId'],
74
+ },
75
+ })
76
+ async revokeSession(args: { sessionId: number }, context: McpContext): Promise<any> {
77
+ return this.sessionService.revokeUserSession(context.userId, args.sessionId, context.locale);
78
+ }
79
+
80
+ @McpTool({
81
+ name: 'core.sessions.revoke-all',
82
+ description: 'Revokes all sessions for the authenticated user.',
83
+ inputSchema: { type: 'object', properties: {} },
84
+ })
85
+ async revokeAllSessions(_args: Record<string, any>, context: McpContext): Promise<any> {
86
+ return this.sessionService.revokeAllSessions(context.userId);
87
+ }
88
+
89
+ @McpTool({
90
+ name: 'core.sessions.revoke-all-other',
91
+ description: 'Revokes all sessions except the current one for the authenticated user.',
92
+ inputSchema: { type: 'object', properties: {} },
93
+ })
94
+ async revokeAllOtherSessions(_args: Record<string, any>, context: McpContext): Promise<any> {
95
+ return this.sessionService.revokeAllOtherSessions(context.userId, Number(context.sessionId));
96
+ }
97
+ }