@hed-hog/core 0.0.328 → 0.0.330

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 (206) hide show
  1. package/dist/ai/ai.service.d.ts +1 -1
  2. package/dist/auth/auth.controller.d.ts +23 -23
  3. package/dist/auth/auth.service.d.ts +41 -41
  4. package/dist/challenge/challenge.service.d.ts +14 -14
  5. package/dist/core/system.controller.d.ts +1 -1
  6. package/dist/core/system.service.d.ts +1 -1
  7. package/dist/core.module.d.ts.map +1 -1
  8. package/dist/core.module.js +9 -2
  9. package/dist/core.module.js.map +1 -1
  10. package/dist/dashboard/dashboard/dashboard.controller.d.ts +84 -84
  11. package/dist/dashboard/dashboard/dashboard.service.d.ts +84 -84
  12. package/dist/dashboard/dashboard-component/dashboard-component.controller.d.ts +29 -29
  13. package/dist/dashboard/dashboard-component/dashboard-component.service.d.ts +29 -29
  14. package/dist/dashboard/dashboard-component-role/dashboard-component-role.controller.d.ts +42 -42
  15. package/dist/dashboard/dashboard-component-role/dashboard-component-role.service.d.ts +42 -42
  16. package/dist/dashboard/dashboard-core/dashboard-core.controller.d.ts +11 -11
  17. package/dist/dashboard/dashboard-core/dashboard-core.service.d.ts +11 -11
  18. package/dist/dashboard/dashboard-item/dashboard-item.controller.d.ts +6 -6
  19. package/dist/dashboard/dashboard-item/dashboard-item.service.d.ts +6 -6
  20. package/dist/dashboard/dashboard-role/dashboard-role.controller.d.ts +33 -33
  21. package/dist/dashboard/dashboard-role/dashboard-role.service.d.ts +33 -33
  22. package/dist/dashboard/dashboard-user/dashboard-user.controller.d.ts +3 -3
  23. package/dist/dashboard/dashboard-user/dashboard-user.service.d.ts +3 -3
  24. package/dist/file/file.controller.d.ts +10 -10
  25. package/dist/file/file.service.d.ts +22 -22
  26. package/dist/index.d.ts +11 -4
  27. package/dist/index.d.ts.map +1 -1
  28. package/dist/index.js +12 -4
  29. package/dist/index.js.map +1 -1
  30. package/dist/mail/mail.controller.d.ts +15 -15
  31. package/dist/mail/mail.service.d.ts +15 -15
  32. package/dist/mail-profile/mail-profile.controller.d.ts +9 -9
  33. package/dist/mail-profile/mail-profile.service.d.ts +9 -9
  34. package/dist/mail-sent/mail-sent.controller.d.ts +17 -17
  35. package/dist/mail-sent/mail-sent.service.d.ts +17 -17
  36. package/dist/mcp/decorators/mcp-tool.decorator.d.ts +4 -0
  37. package/dist/mcp/decorators/mcp-tool.decorator.d.ts.map +1 -0
  38. package/dist/mcp/decorators/mcp-tool.decorator.js +8 -0
  39. package/dist/mcp/decorators/mcp-tool.decorator.js.map +1 -0
  40. package/dist/mcp/guards/mcp-auth.guard.d.ts +9 -0
  41. package/dist/mcp/guards/mcp-auth.guard.d.ts.map +1 -0
  42. package/dist/mcp/guards/mcp-auth.guard.js +41 -0
  43. package/dist/mcp/guards/mcp-auth.guard.js.map +1 -0
  44. package/dist/mcp/guards/mcp-permission.guard.d.ts +8 -0
  45. package/dist/mcp/guards/mcp-permission.guard.d.ts.map +1 -0
  46. package/dist/mcp/guards/mcp-permission.guard.js +57 -0
  47. package/dist/mcp/guards/mcp-permission.guard.js.map +1 -0
  48. package/dist/mcp/interfaces/mcp-tool-definition.interface.d.ts +7 -0
  49. package/dist/mcp/interfaces/mcp-tool-definition.interface.d.ts.map +1 -0
  50. package/dist/mcp/interfaces/mcp-tool-definition.interface.js +3 -0
  51. package/dist/mcp/interfaces/mcp-tool-definition.interface.js.map +1 -0
  52. package/dist/mcp/mcp-audit.service.d.ts +17 -0
  53. package/dist/mcp/mcp-audit.service.d.ts.map +1 -0
  54. package/dist/mcp/mcp-audit.service.js +46 -0
  55. package/dist/mcp/mcp-audit.service.js.map +1 -0
  56. package/dist/mcp/mcp-registry.service.d.ts +21 -0
  57. package/dist/mcp/mcp-registry.service.d.ts.map +1 -0
  58. package/dist/mcp/mcp-registry.service.js +69 -0
  59. package/dist/mcp/mcp-registry.service.js.map +1 -0
  60. package/dist/mcp/mcp-server.service.d.ts +12 -0
  61. package/dist/mcp/mcp-server.service.d.ts.map +1 -0
  62. package/dist/mcp/mcp-server.service.js +94 -0
  63. package/dist/mcp/mcp-server.service.js.map +1 -0
  64. package/dist/mcp/mcp.controller.d.ts +8 -0
  65. package/dist/mcp/mcp.controller.d.ts.map +1 -0
  66. package/dist/mcp/mcp.controller.js +54 -0
  67. package/dist/mcp/mcp.controller.js.map +1 -0
  68. package/dist/mcp/mcp.module.d.ts +3 -0
  69. package/dist/mcp/mcp.module.d.ts.map +1 -0
  70. package/dist/mcp/mcp.module.js +49 -0
  71. package/dist/mcp/mcp.module.js.map +1 -0
  72. package/dist/mcp/tools/core-settings.mcp-tools.d.ts +12 -0
  73. package/dist/mcp/tools/core-settings.mcp-tools.d.ts.map +1 -0
  74. package/dist/mcp/tools/core-settings.mcp-tools.js +66 -0
  75. package/dist/mcp/tools/core-settings.mcp-tools.js.map +1 -0
  76. package/dist/mcp/tools/core-users.mcp-tools.d.ts +55 -0
  77. package/dist/mcp/tools/core-users.mcp-tools.d.ts.map +1 -0
  78. package/dist/mcp/tools/core-users.mcp-tools.js +295 -0
  79. package/dist/mcp/tools/core-users.mcp-tools.js.map +1 -0
  80. package/dist/mcp/types/mcp-context.type.d.ts +7 -0
  81. package/dist/mcp/types/mcp-context.type.d.ts.map +1 -0
  82. package/dist/mcp/types/mcp-context.type.js +3 -0
  83. package/dist/mcp/types/mcp-context.type.js.map +1 -0
  84. package/dist/mcp-chat/dto/create-conversation.dto.d.ts +4 -0
  85. package/dist/mcp-chat/dto/create-conversation.dto.d.ts.map +1 -0
  86. package/dist/mcp-chat/dto/create-conversation.dto.js +22 -0
  87. package/dist/mcp-chat/dto/create-conversation.dto.js.map +1 -0
  88. package/dist/mcp-chat/dto/send-message.dto.d.ts +4 -0
  89. package/dist/mcp-chat/dto/send-message.dto.d.ts.map +1 -0
  90. package/dist/mcp-chat/dto/send-message.dto.js +22 -0
  91. package/dist/mcp-chat/dto/send-message.dto.js.map +1 -0
  92. package/dist/mcp-chat/mcp-chat.controller.d.ts +55 -0
  93. package/dist/mcp-chat/mcp-chat.controller.d.ts.map +1 -0
  94. package/dist/mcp-chat/mcp-chat.controller.js +90 -0
  95. package/dist/mcp-chat/mcp-chat.controller.js.map +1 -0
  96. package/dist/mcp-chat/mcp-chat.module.d.ts +3 -0
  97. package/dist/mcp-chat/mcp-chat.module.d.ts.map +1 -0
  98. package/dist/mcp-chat/mcp-chat.module.js +30 -0
  99. package/dist/mcp-chat/mcp-chat.module.js.map +1 -0
  100. package/dist/mcp-chat/mcp-chat.service.d.ts +50 -0
  101. package/dist/mcp-chat/mcp-chat.service.d.ts.map +1 -0
  102. package/dist/mcp-chat/mcp-chat.service.js +290 -0
  103. package/dist/mcp-chat/mcp-chat.service.js.map +1 -0
  104. package/dist/menu/menu.controller.d.ts +8 -8
  105. package/dist/menu/menu.service.d.ts +8 -8
  106. package/dist/oauth/oauth.service.js +1 -1
  107. package/dist/oauth/oauth.service.js.map +1 -1
  108. package/dist/pdf/components/index.d.ts +57 -0
  109. package/dist/pdf/components/index.d.ts.map +1 -0
  110. package/dist/pdf/components/index.js +258 -0
  111. package/dist/pdf/components/index.js.map +1 -0
  112. package/dist/pdf/dto/generate-pdf.dto.d.ts +5 -0
  113. package/dist/pdf/dto/generate-pdf.dto.d.ts.map +1 -0
  114. package/dist/pdf/dto/generate-pdf.dto.js +27 -0
  115. package/dist/pdf/dto/generate-pdf.dto.js.map +1 -0
  116. package/dist/pdf/interfaces/pdf-theme-config.interface.d.ts +10 -0
  117. package/dist/pdf/interfaces/pdf-theme-config.interface.d.ts.map +1 -0
  118. package/dist/pdf/interfaces/pdf-theme-config.interface.js +3 -0
  119. package/dist/pdf/interfaces/pdf-theme-config.interface.js.map +1 -0
  120. package/dist/pdf/pdf.controller.d.ts +16 -0
  121. package/dist/pdf/pdf.controller.d.ts.map +1 -0
  122. package/dist/pdf/pdf.controller.js +100 -0
  123. package/dist/pdf/pdf.controller.js.map +1 -0
  124. package/dist/pdf/pdf.module.d.ts +3 -0
  125. package/dist/pdf/pdf.module.d.ts.map +1 -0
  126. package/dist/pdf/pdf.module.js +29 -0
  127. package/dist/pdf/pdf.module.js.map +1 -0
  128. package/dist/pdf/pdf.service.d.ts +44 -0
  129. package/dist/pdf/pdf.service.d.ts.map +1 -0
  130. package/dist/pdf/pdf.service.js +185 -0
  131. package/dist/pdf/pdf.service.js.map +1 -0
  132. package/dist/pdf/templates/hcode-institutional.template.d.ts +36 -0
  133. package/dist/pdf/templates/hcode-institutional.template.d.ts.map +1 -0
  134. package/dist/pdf/templates/hcode-institutional.template.js +67 -0
  135. package/dist/pdf/templates/hcode-institutional.template.js.map +1 -0
  136. package/dist/pdf/themes/hcode.theme.d.ts +25 -0
  137. package/dist/pdf/themes/hcode.theme.d.ts.map +1 -0
  138. package/dist/pdf/themes/hcode.theme.js +504 -0
  139. package/dist/pdf/themes/hcode.theme.js.map +1 -0
  140. package/dist/profile/profile.controller.d.ts +16 -16
  141. package/dist/profile/profile.service.d.ts +16 -16
  142. package/dist/role/role.controller.d.ts +12 -12
  143. package/dist/role/role.service.d.ts +12 -12
  144. package/dist/route/dto/create.dto.d.ts +6 -2
  145. package/dist/route/dto/create.dto.d.ts.map +1 -1
  146. package/dist/route/dto/create.dto.js +19 -1
  147. package/dist/route/dto/create.dto.js.map +1 -1
  148. package/dist/route/dto/update.dto.d.ts +4 -0
  149. package/dist/route/dto/update.dto.d.ts.map +1 -1
  150. package/dist/route/dto/update.dto.js +19 -3
  151. package/dist/route/dto/update.dto.js.map +1 -1
  152. package/dist/route/route.service.d.ts +1 -1
  153. package/dist/route/route.service.d.ts.map +1 -1
  154. package/dist/route/route.service.js +18 -11
  155. package/dist/route/route.service.js.map +1 -1
  156. package/dist/screen/screen.controller.d.ts +3 -3
  157. package/dist/screen/screen.service.d.ts +3 -3
  158. package/dist/session/session.controller.d.ts +4 -4
  159. package/dist/session/session.service.d.ts +12 -12
  160. package/dist/setting/setting.controller.d.ts +13 -13
  161. package/dist/setting/setting.service.d.ts +13 -13
  162. package/dist/user/user.controller.d.ts +24 -24
  163. package/dist/user/user.service.d.ts +55 -55
  164. package/hedhog/data/menu.yaml +40 -26
  165. package/hedhog/data/route.yaml +583 -152
  166. package/hedhog/data/setting_group.yaml +60 -0
  167. package/hedhog/frontend/app/mcp_chat/page.tsx.ejs +574 -0
  168. package/hedhog/frontend/app/users/user-sheet.tsx.ejs +5 -9
  169. package/hedhog/frontend/messages/en.json +19 -0
  170. package/hedhog/frontend/messages/pt.json +19 -0
  171. package/hedhog/table/mcp_conversation.yaml +12 -0
  172. package/hedhog/table/mcp_conversation_message.yaml +23 -0
  173. package/hedhog/table/mcp_tool_call_log.yaml +22 -0
  174. package/hedhog/table/route.yaml +33 -22
  175. package/package.json +7 -6
  176. package/src/core.module.ts +18 -11
  177. package/src/index.ts +22 -12
  178. package/src/mcp/decorators/mcp-tool.decorator.ts +7 -0
  179. package/src/mcp/guards/mcp-auth.guard.ts +32 -0
  180. package/src/mcp/guards/mcp-permission.guard.ts +51 -0
  181. package/src/mcp/interfaces/mcp-tool-definition.interface.ts +6 -0
  182. package/src/mcp/mcp-audit.service.ts +36 -0
  183. package/src/mcp/mcp-registry.service.ts +69 -0
  184. package/src/mcp/mcp-server.service.ts +87 -0
  185. package/src/mcp/mcp.controller.ts +30 -0
  186. package/src/mcp/mcp.module.ts +36 -0
  187. package/src/mcp/tools/core-settings.mcp-tools.ts +53 -0
  188. package/src/mcp/tools/core-users.mcp-tools.ts +267 -0
  189. package/src/mcp/types/mcp-context.type.ts +6 -0
  190. package/src/mcp-chat/dto/create-conversation.dto.ts +7 -0
  191. package/src/mcp-chat/dto/send-message.dto.ts +7 -0
  192. package/src/mcp-chat/mcp-chat.controller.ts +60 -0
  193. package/src/mcp-chat/mcp-chat.module.ts +17 -0
  194. package/src/mcp-chat/mcp-chat.service.ts +332 -0
  195. package/src/oauth/oauth.service.ts +12 -12
  196. package/src/pdf/components/index.ts +316 -0
  197. package/src/pdf/dto/generate-pdf.dto.ts +11 -0
  198. package/src/pdf/interfaces/pdf-theme-config.interface.ts +10 -0
  199. package/src/pdf/pdf.controller.ts +86 -0
  200. package/src/pdf/pdf.module.ts +17 -0
  201. package/src/pdf/pdf.service.ts +229 -0
  202. package/src/pdf/templates/hcode-institutional.template.ts +122 -0
  203. package/src/pdf/themes/hcode.theme.ts +515 -0
  204. package/src/route/dto/create.dto.ts +32 -14
  205. package/src/route/dto/update.dto.ts +31 -16
  206. package/src/route/route.service.ts +23 -12
@@ -0,0 +1,36 @@
1
+ import { PrismaModule } from '@hed-hog/api-prisma';
2
+ import { Module, forwardRef } from '@nestjs/common';
3
+ import { DiscoveryModule } from '@nestjs/core';
4
+ import { SettingModule } from '../setting/setting.module';
5
+ import { TokenModule } from '../token/token.module';
6
+ import { UserModule } from '../user/user.module';
7
+ import { McpAuthGuard } from './guards/mcp-auth.guard';
8
+ import { McpPermissionGuard } from './guards/mcp-permission.guard';
9
+ import { McpAuditService } from './mcp-audit.service';
10
+ import { McpRegistryService } from './mcp-registry.service';
11
+ import { McpServerService } from './mcp-server.service';
12
+ import { McpController } from './mcp.controller';
13
+ import { CoreSettingsMcpTools } from './tools/core-settings.mcp-tools';
14
+ import { CoreUsersMcpTools } from './tools/core-users.mcp-tools';
15
+
16
+ @Module({
17
+ imports: [
18
+ DiscoveryModule,
19
+ forwardRef(() => PrismaModule),
20
+ forwardRef(() => TokenModule),
21
+ forwardRef(() => SettingModule),
22
+ forwardRef(() => UserModule),
23
+ ],
24
+ controllers: [McpController],
25
+ providers: [
26
+ McpRegistryService,
27
+ McpServerService,
28
+ McpAuditService,
29
+ McpAuthGuard,
30
+ McpPermissionGuard,
31
+ CoreSettingsMcpTools,
32
+ CoreUsersMcpTools,
33
+ ],
34
+ exports: [McpRegistryService, McpServerService],
35
+ })
36
+ export class McpModule {}
@@ -0,0 +1,53 @@
1
+ import { Injectable } from '@nestjs/common';
2
+ import { SettingService } from '../../setting/setting.service';
3
+ import { McpTool } from '../decorators/mcp-tool.decorator';
4
+ import { McpContext } from '../types/mcp-context.type';
5
+
6
+ @Injectable()
7
+ export class CoreSettingsMcpTools {
8
+ constructor(private readonly settingService: SettingService) {}
9
+
10
+ @McpTool({
11
+ name: 'core.settings.get',
12
+ description: 'Returns effective settings for the authenticated user',
13
+ inputSchema: { type: 'object', properties: {} },
14
+ readOnly: true,
15
+ })
16
+ async getEffectiveSettings(
17
+ _args: Record<string, any>,
18
+ context: McpContext,
19
+ ): Promise<any> {
20
+ return this.settingService.getEffectiveSettings(context.userId);
21
+ }
22
+
23
+ @McpTool({
24
+ name: 'core.settings.set',
25
+ description:
26
+ 'Updates a user-overridable setting value for the authenticated user. Only settings with user_override=true can be changed.',
27
+ inputSchema: {
28
+ type: 'object',
29
+ properties: {
30
+ slug: {
31
+ type: 'string',
32
+ description: 'The slug identifier of the setting to update',
33
+ },
34
+ value: {
35
+ type: 'string',
36
+ description: 'The new value for the setting',
37
+ },
38
+ },
39
+ required: ['slug', 'value'],
40
+ },
41
+ })
42
+ async setUserSetting(
43
+ args: { slug: string; value: string },
44
+ context: McpContext,
45
+ ): Promise<any> {
46
+ return this.settingService.setSettingUserValue(
47
+ context.locale,
48
+ context.userId,
49
+ args.slug,
50
+ args.value,
51
+ );
52
+ }
53
+ }
@@ -0,0 +1,267 @@
1
+ import { Injectable } from '@nestjs/common';
2
+ import { UserService } from '../../user/user.service';
3
+ import { McpTool } from '../decorators/mcp-tool.decorator';
4
+ import { McpContext } from '../types/mcp-context.type';
5
+
6
+ @Injectable()
7
+ export class CoreUsersMcpTools {
8
+ constructor(private readonly userService: UserService) {}
9
+
10
+ @McpTool({
11
+ name: 'core.users.me',
12
+ description: 'Returns the authenticated user profile',
13
+ inputSchema: { type: 'object', properties: {} },
14
+ readOnly: true,
15
+ })
16
+ async getMe(_args: Record<string, any>, context: McpContext): Promise<any> {
17
+ return this.userService.findUserById(context.locale, context.userId);
18
+ }
19
+
20
+ @McpTool({
21
+ name: 'core.users.list',
22
+ description: 'Lists all users with optional pagination and search. Admin only.',
23
+ inputSchema: {
24
+ type: 'object',
25
+ properties: {
26
+ page: { type: 'number', description: 'Page number (default: 1)' },
27
+ pageSize: { type: 'number', description: 'Items per page (default: 20)' },
28
+ search: { type: 'string', description: 'Search term to filter users' },
29
+ sortField: { type: 'string', description: 'Field to sort by' },
30
+ sortOrder: { type: 'string', enum: ['asc', 'desc'], description: 'Sort direction' },
31
+ },
32
+ },
33
+ readOnly: true,
34
+ })
35
+ async listUsers(
36
+ args: {
37
+ page?: number;
38
+ pageSize?: number;
39
+ search?: string;
40
+ sortField?: string;
41
+ sortOrder?: string;
42
+ },
43
+ _context: McpContext,
44
+ ): Promise<any> {
45
+ return this.userService.list({
46
+ page: args.page ?? 1,
47
+ pageSize: args.pageSize ?? 20,
48
+ search: args.search ?? '',
49
+ sortField: args.sortField ?? 'id',
50
+ sortOrder: (args.sortOrder as any) ?? 'asc',
51
+ fields: '',
52
+ });
53
+ }
54
+
55
+ @McpTool({
56
+ name: 'core.users.get',
57
+ description: 'Returns a single user by ID. Admin only.',
58
+ inputSchema: {
59
+ type: 'object',
60
+ properties: {
61
+ userId: { type: 'number', description: 'User ID' },
62
+ },
63
+ required: ['userId'],
64
+ },
65
+ readOnly: true,
66
+ })
67
+ async getUser(
68
+ args: { userId: number },
69
+ context: McpContext,
70
+ ): Promise<any> {
71
+ return this.userService.get(context.locale, args.userId);
72
+ }
73
+
74
+ @McpTool({
75
+ name: 'core.users.create',
76
+ description: 'Creates a new user with email and password. Admin only.',
77
+ inputSchema: {
78
+ type: 'object',
79
+ properties: {
80
+ email: { type: 'string', description: 'User email address' },
81
+ password: { type: 'string', description: 'User password' },
82
+ name: { type: 'string', description: 'User full name' },
83
+ },
84
+ required: ['email', 'password', 'name'],
85
+ },
86
+ })
87
+ async createUser(
88
+ args: { email: string; password: string; name: string },
89
+ context: McpContext,
90
+ ): Promise<any> {
91
+ return this.userService.createWithEmailAndPassword(context.locale, args as any);
92
+ }
93
+
94
+ @McpTool({
95
+ name: 'core.users.update',
96
+ description: 'Updates a user name by ID. Admin only.',
97
+ inputSchema: {
98
+ type: 'object',
99
+ properties: {
100
+ userId: { type: 'number', description: 'User ID' },
101
+ name: { type: 'string', description: 'New user name' },
102
+ },
103
+ required: ['userId'],
104
+ },
105
+ })
106
+ async updateUser(
107
+ args: { userId: number; name?: string },
108
+ context: McpContext,
109
+ ): Promise<any> {
110
+ return this.userService.update(context.locale, args.userId, { name: args.name } as any);
111
+ }
112
+
113
+ @McpTool({
114
+ name: 'core.users.reset-password',
115
+ description: 'Resets the password of a user by ID. Admin only.',
116
+ inputSchema: {
117
+ type: 'object',
118
+ properties: {
119
+ userId: { type: 'number', description: 'User ID' },
120
+ password: { type: 'string', description: 'New password (must meet strength requirements)' },
121
+ },
122
+ required: ['userId'],
123
+ },
124
+ })
125
+ async resetPassword(
126
+ args: { userId: number; password?: string },
127
+ context: McpContext,
128
+ ): Promise<any> {
129
+ return this.userService.resetPassword(context.locale, args.userId, { password: args.password } as any);
130
+ }
131
+
132
+ @McpTool({
133
+ name: 'core.users.delete',
134
+ description: 'Deletes one or more users by their IDs. Admin only.',
135
+ inputSchema: {
136
+ type: 'object',
137
+ properties: {
138
+ ids: {
139
+ type: 'array',
140
+ items: { type: 'number' },
141
+ description: 'Array of user IDs to delete',
142
+ },
143
+ },
144
+ required: ['ids'],
145
+ },
146
+ })
147
+ async deleteUsers(
148
+ args: { ids: number[] },
149
+ context: McpContext,
150
+ ): Promise<any> {
151
+ return this.userService.delete(context.locale, { ids: args.ids });
152
+ }
153
+
154
+ @McpTool({
155
+ name: 'core.users.roles',
156
+ description: 'Returns the roles assigned to a user. Admin only.',
157
+ inputSchema: {
158
+ type: 'object',
159
+ properties: {
160
+ userId: { type: 'number', description: 'User ID' },
161
+ },
162
+ required: ['userId'],
163
+ },
164
+ readOnly: true,
165
+ })
166
+ async getUserRoles(
167
+ args: { userId: number },
168
+ _context: McpContext,
169
+ ): Promise<any> {
170
+ return this.userService.getUserRoles(args.userId);
171
+ }
172
+
173
+ @McpTool({
174
+ name: 'core.users.menus',
175
+ description: 'Returns the menu items accessible to a user. Admin only.',
176
+ inputSchema: {
177
+ type: 'object',
178
+ properties: {
179
+ userId: { type: 'number', description: 'User ID' },
180
+ },
181
+ required: ['userId'],
182
+ },
183
+ readOnly: true,
184
+ })
185
+ async getUserMenus(
186
+ args: { userId: number },
187
+ context: McpContext,
188
+ ): Promise<any> {
189
+ return this.userService.getUserMenus(context.locale, args.userId);
190
+ }
191
+
192
+ @McpTool({
193
+ name: 'core.users.routes',
194
+ description: 'Returns the routes accessible to a user. Admin only.',
195
+ inputSchema: {
196
+ type: 'object',
197
+ properties: {
198
+ userId: { type: 'number', description: 'User ID' },
199
+ },
200
+ required: ['userId'],
201
+ },
202
+ readOnly: true,
203
+ })
204
+ async getUserRoutes(
205
+ args: { userId: number },
206
+ context: McpContext,
207
+ ): Promise<any> {
208
+ return this.userService.getUserRoutes(context.locale, args.userId);
209
+ }
210
+
211
+ @McpTool({
212
+ name: 'core.users.assign-role',
213
+ description: 'Assigns a role to a user. Admin only.',
214
+ inputSchema: {
215
+ type: 'object',
216
+ properties: {
217
+ userId: { type: 'number', description: 'User ID' },
218
+ roleId: { type: 'number', description: 'Role ID to assign' },
219
+ },
220
+ required: ['userId', 'roleId'],
221
+ },
222
+ })
223
+ async assignRole(
224
+ args: { userId: number; roleId: number },
225
+ context: McpContext,
226
+ ): Promise<any> {
227
+ return this.userService.assignRoleToUser(context.locale, args.userId, args.roleId);
228
+ }
229
+
230
+ @McpTool({
231
+ name: 'core.users.remove-role',
232
+ description: 'Removes a role from a user. Admin only.',
233
+ inputSchema: {
234
+ type: 'object',
235
+ properties: {
236
+ userId: { type: 'number', description: 'User ID' },
237
+ roleId: { type: 'number', description: 'Role ID to remove' },
238
+ },
239
+ required: ['userId', 'roleId'],
240
+ },
241
+ })
242
+ async removeRole(
243
+ args: { userId: number; roleId: number },
244
+ context: McpContext,
245
+ ): Promise<any> {
246
+ return this.userService.removeRoleFromUser(context.locale, args.userId, args.roleId);
247
+ }
248
+
249
+ @McpTool({
250
+ name: 'core.users.verify-identifier',
251
+ description: 'Verifies a user identifier (e.g. email confirmation). Admin only.',
252
+ inputSchema: {
253
+ type: 'object',
254
+ properties: {
255
+ userId: { type: 'number', description: 'User ID' },
256
+ identifierId: { type: 'number', description: 'Identifier ID to verify' },
257
+ },
258
+ required: ['userId', 'identifierId'],
259
+ },
260
+ })
261
+ async verifyIdentifier(
262
+ args: { userId: number; identifierId: number },
263
+ context: McpContext,
264
+ ): Promise<any> {
265
+ return this.userService.verifyIdentifier(context.locale, args.userId, args.identifierId);
266
+ }
267
+ }
@@ -0,0 +1,6 @@
1
+ export type McpContext = {
2
+ userId: number;
3
+ sessionId: string;
4
+ locale: string;
5
+ toolName: string;
6
+ };
@@ -0,0 +1,7 @@
1
+ import { IsOptional, IsString } from 'class-validator';
2
+
3
+ export class CreateConversationDTO {
4
+ @IsOptional()
5
+ @IsString()
6
+ title?: string;
7
+ }
@@ -0,0 +1,7 @@
1
+ import { IsNotEmpty, IsString } from 'class-validator';
2
+
3
+ export class SendMessageDTO {
4
+ @IsString()
5
+ @IsNotEmpty()
6
+ message: string;
7
+ }
@@ -0,0 +1,60 @@
1
+ import { Role, User } from '@hed-hog/api';
2
+ import { Locale } from '@hed-hog/api-locale';
3
+ import {
4
+ Body,
5
+ Controller,
6
+ Delete,
7
+ Get,
8
+ Param,
9
+ ParseIntPipe,
10
+ Post,
11
+ } from '@nestjs/common';
12
+ import { DeleteDTO } from '../dto/delete.dto';
13
+ import { CreateConversationDTO } from './dto/create-conversation.dto';
14
+ import { SendMessageDTO } from './dto/send-message.dto';
15
+ import { McpChatService } from './mcp-chat.service';
16
+
17
+ @Role()
18
+ @Controller('mcp-chat')
19
+ export class McpChatController {
20
+ constructor(private readonly service: McpChatService) {}
21
+
22
+ @Get()
23
+ listConversations(@User() { id }: { id: number }) {
24
+ return this.service.listConversations(id);
25
+ }
26
+
27
+ @Post()
28
+ createConversation(
29
+ @User() { id }: { id: number },
30
+ @Body() dto: CreateConversationDTO,
31
+ ) {
32
+ return this.service.createConversation(id, dto);
33
+ }
34
+
35
+ @Delete()
36
+ deleteConversations(
37
+ @User() { id }: { id: number },
38
+ @Body() dto: DeleteDTO,
39
+ ) {
40
+ return this.service.deleteConversations(id, dto.ids);
41
+ }
42
+
43
+ @Get(':id/messages')
44
+ getMessages(
45
+ @User() { id }: { id: number },
46
+ @Param('id', ParseIntPipe) conversationId: number,
47
+ ) {
48
+ return this.service.getMessages(conversationId, id);
49
+ }
50
+
51
+ @Post(':id/messages')
52
+ sendMessage(
53
+ @User() { id }: { id: number },
54
+ @Param('id', ParseIntPipe) conversationId: number,
55
+ @Body() dto: SendMessageDTO,
56
+ @Locale() locale: string,
57
+ ) {
58
+ return this.service.sendMessage(conversationId, id, locale, dto.message);
59
+ }
60
+ }
@@ -0,0 +1,17 @@
1
+ import { PrismaModule } from '@hed-hog/api-prisma';
2
+ import { Module, forwardRef } from '@nestjs/common';
3
+ import { McpModule } from '../mcp/mcp.module';
4
+ import { SettingModule } from '../setting/setting.module';
5
+ import { McpChatController } from './mcp-chat.controller';
6
+ import { McpChatService } from './mcp-chat.service';
7
+
8
+ @Module({
9
+ imports: [
10
+ forwardRef(() => PrismaModule),
11
+ forwardRef(() => SettingModule),
12
+ forwardRef(() => McpModule),
13
+ ],
14
+ controllers: [McpChatController],
15
+ providers: [McpChatService],
16
+ })
17
+ export class McpChatModule {}