@solidxai/core 0.1.10-beta.0 → 0.1.10-beta.11

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 (269) hide show
  1. package/.claude/settings.local.json +15 -0
  2. package/CLAUDE.md +18 -0
  3. package/CURRENT_PROMPT +6 -0
  4. package/dist/commands/refresh-model.command.d.ts +0 -4
  5. package/dist/commands/refresh-model.command.d.ts.map +1 -1
  6. package/dist/commands/refresh-model.command.js +0 -32
  7. package/dist/commands/refresh-model.command.js.map +1 -1
  8. package/dist/commands/run-tests.command.d.ts +2 -0
  9. package/dist/commands/run-tests.command.d.ts.map +1 -1
  10. package/dist/commands/run-tests.command.js +49 -17
  11. package/dist/commands/run-tests.command.js.map +1 -1
  12. package/dist/controllers/action-metadata.controller.js +1 -1
  13. package/dist/controllers/action-metadata.controller.js.map +1 -1
  14. package/dist/controllers/facebook-authentication.controller.js +1 -1
  15. package/dist/controllers/facebook-authentication.controller.js.map +1 -1
  16. package/dist/controllers/google-authentication.controller.js +1 -1
  17. package/dist/controllers/google-authentication.controller.js.map +1 -1
  18. package/dist/controllers/mcp-audit-log.controller.d.ts +35 -0
  19. package/dist/controllers/mcp-audit-log.controller.d.ts.map +1 -0
  20. package/dist/controllers/mcp-audit-log.controller.js +147 -0
  21. package/dist/controllers/mcp-audit-log.controller.js.map +1 -0
  22. package/dist/controllers/menu-item-metadata.controller.js +1 -1
  23. package/dist/controllers/menu-item-metadata.controller.js.map +1 -1
  24. package/dist/controllers/microsoft-authentication.controller.js +1 -1
  25. package/dist/controllers/microsoft-authentication.controller.js.map +1 -1
  26. package/dist/controllers/model-metadata.controller.d.ts +1 -1
  27. package/dist/controllers/model-metadata.controller.js +2 -2
  28. package/dist/controllers/model-metadata.controller.js.map +1 -1
  29. package/dist/controllers/module-metadata.controller.js +1 -1
  30. package/dist/controllers/module-metadata.controller.js.map +1 -1
  31. package/dist/controllers/mq-message-queue.controller.js +1 -1
  32. package/dist/controllers/mq-message-queue.controller.js.map +1 -1
  33. package/dist/controllers/mq-message.controller.js +1 -1
  34. package/dist/controllers/mq-message.controller.js.map +1 -1
  35. package/dist/controllers/user.controller.d.ts.map +1 -1
  36. package/dist/controllers/user.controller.js.map +1 -1
  37. package/dist/controllers/view-metadata.controller.js +1 -1
  38. package/dist/controllers/view-metadata.controller.js.map +1 -1
  39. package/dist/dtos/create-mcp-audit-log.dto.d.ts +19 -0
  40. package/dist/dtos/create-mcp-audit-log.dto.d.ts.map +1 -0
  41. package/dist/dtos/create-mcp-audit-log.dto.js +118 -0
  42. package/dist/dtos/create-mcp-audit-log.dto.js.map +1 -0
  43. package/dist/dtos/update-mcp-audit-log.dto.d.ts +19 -0
  44. package/dist/dtos/update-mcp-audit-log.dto.d.ts.map +1 -0
  45. package/dist/dtos/update-mcp-audit-log.dto.js +117 -0
  46. package/dist/dtos/update-mcp-audit-log.dto.js.map +1 -0
  47. package/dist/dtos/update-user.dto.d.ts +1 -0
  48. package/dist/dtos/update-user.dto.d.ts.map +1 -1
  49. package/dist/dtos/update-user.dto.js +7 -1
  50. package/dist/dtos/update-user.dto.js.map +1 -1
  51. package/dist/entities/chatter-message-details.entity.d.ts.map +1 -1
  52. package/dist/entities/chatter-message-details.entity.js +0 -1
  53. package/dist/entities/chatter-message-details.entity.js.map +1 -1
  54. package/dist/entities/mcp-audit-log.entity.d.ts +19 -0
  55. package/dist/entities/mcp-audit-log.entity.d.ts.map +1 -0
  56. package/dist/entities/mcp-audit-log.entity.js +90 -0
  57. package/dist/entities/mcp-audit-log.entity.js.map +1 -0
  58. package/dist/entities/user.entity.js +1 -0
  59. package/dist/entities/user.entity.js.map +1 -1
  60. package/dist/helpers/bootstrap.helper.d.ts.map +1 -1
  61. package/dist/helpers/bootstrap.helper.js +2 -0
  62. package/dist/helpers/bootstrap.helper.js.map +1 -1
  63. package/dist/helpers/command.service.d.ts +1 -0
  64. package/dist/helpers/command.service.d.ts.map +1 -1
  65. package/dist/helpers/command.service.js +1 -0
  66. package/dist/helpers/command.service.js.map +1 -1
  67. package/dist/helpers/field-crud-managers/BigIntFieldCrudManager.js.map +1 -1
  68. package/dist/helpers/field-crud-managers/SelectionDynamicFieldCrudManager.js.map +1 -1
  69. package/dist/helpers/module-metadata-helper.service.js.map +1 -1
  70. package/dist/index.d.ts +4 -0
  71. package/dist/index.d.ts.map +1 -1
  72. package/dist/index.js +4 -0
  73. package/dist/index.js.map +1 -1
  74. package/dist/interfaces.d.ts +0 -2
  75. package/dist/interfaces.d.ts.map +1 -1
  76. package/dist/interfaces.js.map +1 -1
  77. package/dist/jobs/database/chatter-queue-subscriber-database.service.d.ts.map +1 -1
  78. package/dist/jobs/database/chatter-queue-subscriber-database.service.js +3 -3
  79. package/dist/jobs/database/chatter-queue-subscriber-database.service.js.map +1 -1
  80. package/dist/jobs/database/trigger-mcp-client-subscriber-database.service.js.map +1 -1
  81. package/dist/jobs/rabbitmq/chatter-queue-subscriber.service.d.ts.map +1 -1
  82. package/dist/jobs/rabbitmq/chatter-queue-subscriber.service.js +3 -3
  83. package/dist/jobs/rabbitmq/chatter-queue-subscriber.service.js.map +1 -1
  84. package/dist/jobs/redis/chatter-queue-subscriber-redis.service.d.ts.map +1 -1
  85. package/dist/jobs/redis/chatter-queue-subscriber-redis.service.js +3 -3
  86. package/dist/jobs/redis/chatter-queue-subscriber-redis.service.js.map +1 -1
  87. package/dist/repository/mcp-audit-log.repository.d.ts +12 -0
  88. package/dist/repository/mcp-audit-log.repository.d.ts.map +1 -0
  89. package/dist/repository/mcp-audit-log.repository.js +34 -0
  90. package/dist/repository/mcp-audit-log.repository.js.map +1 -0
  91. package/dist/repository/security-rule.repository.js.map +1 -1
  92. package/dist/seeders/module-metadata-seeder.service.js.map +1 -1
  93. package/dist/seeders/module-test-data.service.d.ts +7 -0
  94. package/dist/seeders/module-test-data.service.d.ts.map +1 -1
  95. package/dist/seeders/module-test-data.service.js +94 -18
  96. package/dist/seeders/module-test-data.service.js.map +1 -1
  97. package/dist/seeders/permission-metadata-seeder.service.js.map +1 -1
  98. package/dist/seeders/seed-data/solid-core-metadata.json +380 -2
  99. package/dist/services/authentication.service.d.ts.map +1 -1
  100. package/dist/services/authentication.service.js +5 -5
  101. package/dist/services/authentication.service.js.map +1 -1
  102. package/dist/services/chatter-message.service.d.ts +6 -3
  103. package/dist/services/chatter-message.service.d.ts.map +1 -1
  104. package/dist/services/chatter-message.service.js +23 -35
  105. package/dist/services/chatter-message.service.js.map +1 -1
  106. package/dist/services/crud.service.js.map +1 -1
  107. package/dist/services/csv.service.js.map +1 -1
  108. package/dist/services/dashboard.service.js.map +1 -1
  109. package/dist/services/database/database-bootstrap.service.js.map +1 -1
  110. package/dist/services/excel.service.js.map +1 -1
  111. package/dist/services/export-transaction.service.js.map +1 -1
  112. package/dist/services/field-metadata.service.js +2 -2
  113. package/dist/services/field-metadata.service.js.map +1 -1
  114. package/dist/services/fixtures.service.js.map +1 -1
  115. package/dist/services/import-transaction.service.js.map +1 -1
  116. package/dist/services/list-of-values.service.js.map +1 -1
  117. package/dist/services/mcp-audit-log.service.d.ts +12 -0
  118. package/dist/services/mcp-audit-log.service.d.ts.map +1 -0
  119. package/dist/services/mcp-audit-log.service.js +38 -0
  120. package/dist/services/mcp-audit-log.service.js.map +1 -0
  121. package/dist/services/model-metadata.service.d.ts +4 -1
  122. package/dist/services/model-metadata.service.d.ts.map +1 -1
  123. package/dist/services/model-metadata.service.js +23 -24
  124. package/dist/services/model-metadata.service.js.map +1 -1
  125. package/dist/services/module-metadata.service.d.ts +4 -1
  126. package/dist/services/module-metadata.service.d.ts.map +1 -1
  127. package/dist/services/module-metadata.service.js +18 -2
  128. package/dist/services/module-metadata.service.js.map +1 -1
  129. package/dist/services/queues/database-publisher.service.js +3 -3
  130. package/dist/services/queues/database-publisher.service.js.map +1 -1
  131. package/dist/services/queues/database-subscriber.service.js +3 -3
  132. package/dist/services/queues/database-subscriber.service.js.map +1 -1
  133. package/dist/services/queues/rabbitmq-publisher.service.js +3 -3
  134. package/dist/services/queues/rabbitmq-publisher.service.js.map +1 -1
  135. package/dist/services/queues/rabbitmq-subscriber.service.js +4 -4
  136. package/dist/services/queues/rabbitmq-subscriber.service.js.map +1 -1
  137. package/dist/services/queues/redis-publisher.service.d.ts.map +1 -1
  138. package/dist/services/queues/redis-publisher.service.js +4 -1
  139. package/dist/services/queues/redis-publisher.service.js.map +1 -1
  140. package/dist/services/queues/redis-subscriber.service.d.ts.map +1 -1
  141. package/dist/services/queues/redis-subscriber.service.js +4 -1
  142. package/dist/services/queues/redis-subscriber.service.js.map +1 -1
  143. package/dist/services/role-metadata.service.js.map +1 -1
  144. package/dist/services/scheduled-jobs/scheduler.service.js.map +1 -1
  145. package/dist/services/settings/default-settings-provider.service.d.ts +58 -8
  146. package/dist/services/settings/default-settings-provider.service.d.ts.map +1 -1
  147. package/dist/services/settings/default-settings-provider.service.js +21 -4
  148. package/dist/services/settings/default-settings-provider.service.js.map +1 -1
  149. package/dist/services/sms/TwilioSMSService.js.map +1 -1
  150. package/dist/services/solid-introspect.service.js.map +1 -1
  151. package/dist/services/user-activity-history.service.js.map +1 -1
  152. package/dist/services/view-metadata.service.d.ts.map +1 -1
  153. package/dist/services/view-metadata.service.js +17 -2
  154. package/dist/services/view-metadata.service.js.map +1 -1
  155. package/dist/solid-core.module.d.ts +1 -0
  156. package/dist/solid-core.module.d.ts.map +1 -1
  157. package/dist/solid-core.module.js +9 -0
  158. package/dist/solid-core.module.js.map +1 -1
  159. package/dist/subscribers/computed-entity-field.subscriber.js.map +1 -1
  160. package/dist/subscribers/security-rule.subscriber.d.ts.map +1 -1
  161. package/dist/subscribers/security-rule.subscriber.js.map +1 -1
  162. package/dist/subscribers/view-metadata.subscriber.js.map +1 -1
  163. package/dist/testing/core/testing-engine.js.map +1 -1
  164. package/dist/testing/reporter/console-reporter.d.ts +10 -0
  165. package/dist/testing/reporter/console-reporter.d.ts.map +1 -1
  166. package/dist/testing/reporter/console-reporter.js +21 -0
  167. package/dist/testing/reporter/console-reporter.js.map +1 -1
  168. package/dist/testing/reporter/reporter.types.d.ts +7 -0
  169. package/dist/testing/reporter/reporter.types.d.ts.map +1 -1
  170. package/dist/testing/reporter/reporter.types.js.map +1 -1
  171. package/dist/testing/reporter/webhook-reporter.d.ts +54 -0
  172. package/dist/testing/reporter/webhook-reporter.d.ts.map +1 -0
  173. package/dist/testing/reporter/webhook-reporter.js +74 -0
  174. package/dist/testing/reporter/webhook-reporter.js.map +1 -0
  175. package/dist/testing/runner/run-from-metadata.d.ts.map +1 -1
  176. package/dist/testing/runner/run-from-metadata.js +20 -1
  177. package/dist/testing/runner/run-from-metadata.js.map +1 -1
  178. package/package.json +8 -8
  179. package/src/commands/refresh-model.command.ts +1 -32
  180. package/src/commands/run-tests.command.ts +45 -17
  181. package/src/controllers/action-metadata.controller.ts +1 -1
  182. package/src/controllers/facebook-authentication.controller.ts +1 -1
  183. package/src/controllers/google-authentication.controller.ts +1 -1
  184. package/src/controllers/mcp-audit-log.controller.ts +70 -0
  185. package/src/controllers/menu-item-metadata.controller.ts +1 -1
  186. package/src/controllers/microsoft-authentication.controller.ts +1 -1
  187. package/src/controllers/model-metadata.controller.ts +1 -1
  188. package/src/controllers/module-metadata.controller.ts +1 -1
  189. package/src/controllers/mq-message-queue.controller.ts +1 -1
  190. package/src/controllers/mq-message.controller.ts +1 -1
  191. package/src/controllers/user.controller.ts +16 -16
  192. package/src/controllers/view-metadata.controller.ts +1 -1
  193. package/src/dtos/create-mcp-audit-log.dto.ts +84 -0
  194. package/src/dtos/update-mcp-audit-log.dto.ts +83 -0
  195. package/src/dtos/update-user.dto.ts +4 -0
  196. package/src/entities/chatter-message-details.entity.ts +1 -2
  197. package/src/entities/mcp-audit-log.entity.ts +55 -0
  198. package/src/entities/user.entity.ts +1 -1
  199. package/src/helpers/bootstrap.helper.ts +3 -0
  200. package/src/helpers/command.service.ts +2 -0
  201. package/src/helpers/field-crud-managers/BigIntFieldCrudManager.ts +1 -1
  202. package/src/helpers/field-crud-managers/SelectionDynamicFieldCrudManager.ts +1 -1
  203. package/src/helpers/module-metadata-helper.service.ts +1 -1
  204. package/src/index.ts +4 -0
  205. package/src/interfaces.ts +0 -2
  206. package/src/jobs/database/chatter-queue-subscriber-database.service.ts +4 -2
  207. package/src/jobs/database/trigger-mcp-client-subscriber-database.service.ts +1 -1
  208. package/src/jobs/rabbitmq/chatter-queue-subscriber.service.ts +4 -2
  209. package/src/jobs/redis/chatter-queue-subscriber-redis.service.ts +10 -3
  210. package/src/repository/mcp-audit-log.repository.ts +17 -0
  211. package/src/repository/security-rule.repository.ts +1 -1
  212. package/src/seeders/module-metadata-seeder.service.ts +4 -4
  213. package/src/seeders/module-test-data.service.ts +107 -15
  214. package/src/seeders/permission-metadata-seeder.service.ts +1 -1
  215. package/src/seeders/seed-data/solid-core-metadata.json +380 -2
  216. package/src/services/1.js +6 -0
  217. package/src/services/authentication.service.ts +19 -31
  218. package/src/services/chatter-message.service.ts +28 -38
  219. package/src/services/crud.service.ts +3 -3
  220. package/src/services/csv.service.ts +1 -1
  221. package/src/services/dashboard.service.ts +1 -1
  222. package/src/services/database/database-bootstrap.service.ts +1 -1
  223. package/src/services/excel.service.ts +1 -1
  224. package/src/services/export-transaction.service.ts +2 -2
  225. package/src/services/field-metadata.service.ts +3 -3
  226. package/src/services/fixtures.service.ts +2 -2
  227. package/src/services/import-transaction.service.ts +2 -2
  228. package/src/services/list-of-values.service.ts +1 -1
  229. package/src/services/mcp-audit-log.service.ts +19 -0
  230. package/src/services/model-metadata.service.ts +35 -34
  231. package/src/services/module-metadata.service.ts +18 -7
  232. package/src/services/queues/database-publisher.service.ts +4 -4
  233. package/src/services/queues/database-subscriber.service.ts +7 -7
  234. package/src/services/queues/rabbitmq-publisher.service.ts +7 -7
  235. package/src/services/queues/rabbitmq-subscriber.service.ts +13 -13
  236. package/src/services/queues/redis-publisher.service.ts +7 -4
  237. package/src/services/queues/redis-subscriber.service.ts +9 -6
  238. package/src/services/role-metadata.service.ts +1 -1
  239. package/src/services/scheduled-jobs/scheduler.service.ts +5 -5
  240. package/src/services/settings/default-settings-provider.service.ts +21 -4
  241. package/src/services/sms/TwilioSMSService.ts +2 -2
  242. package/src/services/solid-introspect.service.ts +2 -2
  243. package/src/services/user-activity-history.service.ts +1 -1
  244. package/src/services/view-metadata.service.ts +25 -8
  245. package/src/solid-core.module.ts +9 -0
  246. package/src/subscribers/computed-entity-field.subscriber.ts +1 -1
  247. package/src/subscribers/security-rule.subscriber.ts +8 -8
  248. package/src/subscribers/view-metadata.subscriber.ts +1 -1
  249. package/src/testing/core/testing-engine.ts +2 -2
  250. package/src/testing/reporter/console-reporter.ts +27 -0
  251. package/src/testing/reporter/reporter.types.ts +7 -0
  252. package/src/testing/reporter/webhook-reporter.ts +116 -0
  253. package/src/testing/runner/run-from-metadata.ts +19 -1
  254. package/dist-tests/api/authenticate.spec.js +0 -119
  255. package/dist-tests/api/authenticate.spec.js.map +0 -1
  256. package/dist-tests/api/crud-service.findOne.cityMaster.spec.js +0 -97
  257. package/dist-tests/api/crud-service.findOne.cityMaster.spec.js.map +0 -1
  258. package/dist-tests/api/ping.spec.js +0 -21
  259. package/dist-tests/api/ping.spec.js.map +0 -1
  260. package/dist-tests/helpers/auth.js +0 -41
  261. package/dist-tests/helpers/auth.js.map +0 -1
  262. package/dist-tests/helpers/env.js +0 -11
  263. package/dist-tests/helpers/env.js.map +0 -1
  264. package/docs/grouping-enhancements.md +0 -89
  265. package/docs/java-spring/README.md +0 -3
  266. package/docs/java-spring/solid-core-module-deep-dive-report.md +0 -1317
  267. package/docs/seed-changes.md +0 -65
  268. package/docs/test-data-workflow.md +0 -200
  269. package/docs/type-declaration-import-issue.md +0 -24
@@ -18,7 +18,6 @@ export class ChatterMessageDetails extends CommonEntity {
18
18
  @Column({ type: "varchar", nullable: true })
19
19
  oldValueDisplay: string;
20
20
 
21
- @Index()
22
21
  @Column({ type: "varchar", nullable: true })
23
22
  newValueDisplay: string;
24
23
 
@@ -30,4 +29,4 @@ export class ChatterMessageDetails extends CommonEntity {
30
29
 
31
30
  @Column({ type: "varchar", nullable: true })
32
31
  fieldType: string;
33
- }
32
+ }
@@ -0,0 +1,55 @@
1
+ import { Column, Entity, Index } from 'typeorm';
2
+ import { CommonEntity } from 'src/entities/common.entity';
3
+ import { getColumnType } from 'src/helpers/typeorm-db-helper';
4
+
5
+ @Entity({ name: 'ss_mcp_audit_log' })
6
+ export class McpAuditLog extends CommonEntity {
7
+ @Index()
8
+ @Column({ nullable: true })
9
+ userId: number;
10
+
11
+ @Column({ nullable: true })
12
+ apiKeyId: number;
13
+
14
+ @Column({ nullable: true, length: 128 })
15
+ username: string;
16
+
17
+ @Column({ length: 32 })
18
+ transport: string;
19
+
20
+ @Index()
21
+ @Column({ nullable: true, length: 64 })
22
+ mcpSessionId: string;
23
+
24
+ @Column({ nullable: true, length: 64 })
25
+ clientAddr: string;
26
+
27
+ @Index()
28
+ @Column({ length: 64 })
29
+ method: string;
30
+
31
+ @Column({ nullable: true, length: 64 })
32
+ requestId: string;
33
+
34
+ @Index()
35
+ @Column({ nullable: true, length: 128 })
36
+ toolName: string;
37
+
38
+ @Column({ nullable: true, ...getColumnType('longText') })
39
+ requestParams: string;
40
+
41
+ @Column({ length: 16 })
42
+ status: string;
43
+
44
+ @Column({ nullable: true, ...getColumnType('longText') })
45
+ responseResult: string;
46
+
47
+ @Column({ nullable: true })
48
+ errorCode: number;
49
+
50
+ @Column({ nullable: true, ...getColumnType('longText') })
51
+ errorMessage: string;
52
+
53
+ @Column({ nullable: true, ...getColumnType('decimal') })
54
+ durationMs: number;
55
+ }
@@ -177,7 +177,7 @@ export class User extends CommonEntity {
177
177
  @Column({ nullable: true })
178
178
  rehashedAt: Date;
179
179
 
180
- // dont send to client
180
+ @Expose()
181
181
  @Column({ type: "int", default: 0 })
182
182
  failedLoginAttempts: number = 0;
183
183
 
@@ -1,5 +1,6 @@
1
1
  import { ValidationPipe } from '@nestjs/common';
2
2
  import { NestFactory } from '@nestjs/core';
3
+ import { WsAdapter } from '@nestjs/platform-ws';
3
4
  import { DocumentBuilder, SwaggerModule } from '@nestjs/swagger';
4
5
  import { NextFunction, Request, Response } from 'express';
5
6
  import helmet from 'helmet';
@@ -178,6 +179,8 @@ export async function bootstrapSolidApp(
178
179
  const types = require('pg').types;
179
180
  types.setTypeParser(types.builtins.INT8, (val: string) => parseInt(val));
180
181
 
182
+ app.useWebSocketAdapter(new WsAdapter(app));
183
+
181
184
  await app.listen(port);
182
185
  }
183
186
 
@@ -4,6 +4,7 @@ import { spawn } from 'child_process';
4
4
  export type CommandWithArgs = {
5
5
  command: string;
6
6
  args: string[];
7
+ cwd?: string;
7
8
  };
8
9
 
9
10
  @Injectable()
@@ -43,6 +44,7 @@ export class CommandService {
43
44
  const child = spawn(command, spawnArgs, {
44
45
  shell: isWindows, // Use shell on Windows to handle .cmd files
45
46
  stdio: ['pipe', 'pipe', 'pipe'],
47
+ cwd: commandWithArgs.cwd,
46
48
  });
47
49
 
48
50
  let stdout = '';
@@ -20,7 +20,7 @@ export class BigIntFieldCrudManager implements FieldCrudManager {
20
20
  if (typeof fieldValue === 'string' || typeof fieldValue === 'number') {
21
21
  fieldValue = BigInt(fieldValue);
22
22
  }
23
- } catch (err) {
23
+ } catch (err: any) {
24
24
  return [{ field: this.options.fieldName, error: 'Invalid numeric value' }];
25
25
  }
26
26
  }
@@ -119,7 +119,7 @@ export class SelectionDynamicFieldCrudManager implements FieldCrudManager {
119
119
  }
120
120
  return false;
121
121
  }
122
- catch (error) {
122
+ catch (error: any) {
123
123
  // Use the values method as a fallback, if the value method is not implemented
124
124
  const values = await providerInstance.values('', ctxt);
125
125
  const isValid = values.some(v => v.value === fieldValue);
@@ -23,7 +23,7 @@ export class ModuleMetadataHelperService {
23
23
  const fileContent = await fs.readFile(configFilePath, 'utf8');
24
24
  return JSON.parse(fileContent);
25
25
  }
26
- catch (error) {
26
+ catch (error: any) {
27
27
  this.logger.error(`module metadata configuration non existent at: ${configFilePath}`);
28
28
  }
29
29
 
package/src/index.ts CHANGED
@@ -49,6 +49,7 @@ export * from './dtos/create-mq-message-queue.dto'
49
49
  export * from './dtos/create-mq-message.dto'
50
50
  export * from './dtos/create-agent-session.dto'
51
51
  export * from './dtos/create-agent-event.dto'
52
+ export * from './dtos/create-mcp-audit-log.dto'
52
53
  export * from './dtos/create-scheduled-job.dto'
53
54
  export * from './dtos/create-permission-metadata.dto'
54
55
  export * from './dtos/create-role-metadata.dto'
@@ -89,6 +90,7 @@ export * from './dtos/update-mq-message-queue.dto'
89
90
  export * from './dtos/update-mq-message.dto'
90
91
  export * from './dtos/update-agent-session.dto'
91
92
  export * from './dtos/update-agent-event.dto'
93
+ export * from './dtos/update-mcp-audit-log.dto'
92
94
  export * from './dtos/update-scheduled-job.dto'
93
95
  export * from './dtos/update-permission-metadata.dto'
94
96
  export * from './dtos/update-role-metadata.dto'
@@ -122,6 +124,7 @@ export * from './entities/mq-message-queue.entity'
122
124
  export * from './entities/mq-message.entity'
123
125
  export * from './entities/agent-session.entity'
124
126
  export * from './entities/agent-event.entity'
127
+ export * from './entities/mcp-audit-log.entity'
125
128
  export * from './entities/scheduled-job.entity'
126
129
  export * from './entities/permission-metadata.entity'
127
130
  export * from './entities/role-metadata.entity'
@@ -297,6 +300,7 @@ export * from './services/mq-message-queue.service'
297
300
  export * from './services/mq-message.service'
298
301
  export * from './services/agent-session.service'
299
302
  export * from './services/agent-event.service'
303
+ export * from './services/mcp-audit-log.service'
300
304
  export * from './services/scheduled-job.service'
301
305
  export * from './services/pdf.service'
302
306
  export * from './services/permission-metadata.service'
package/src/interfaces.ts CHANGED
@@ -121,8 +121,6 @@ export interface CodeGenerationOptions {
121
121
  fieldIdsForRemoval?: number[];
122
122
  fieldNamesForRemoval?: string[];
123
123
  dryRun?: boolean;
124
- fieldIdsForRefresh?: number[];
125
- fieldNamesForRefresh?: string[];
126
124
  }
127
125
 
128
126
  export interface TriggerMcpClientOptions {
@@ -35,7 +35,7 @@ export class ChatterQueueSubscriberDatabase extends DatabaseSubscriber<AuditQueu
35
35
 
36
36
  switch (p.eventType) {
37
37
  case 'insert':
38
- await this.chatterMessageService.postAuditMessageOnInsert(p.after, p.modelName);
38
+ await this.chatterMessageService.postAuditMessageOnInsert(p.after, p.modelName, false, p.userId);
39
39
  break;
40
40
  case 'update':
41
41
  await this.chatterMessageService.postAuditMessageOnUpdate(
@@ -43,10 +43,12 @@ export class ChatterQueueSubscriberDatabase extends DatabaseSubscriber<AuditQueu
43
43
  p.modelName,
44
44
  p.before,
45
45
  (p.updatedColumnNames ?? []).map(n => ({ propertyName: n })),
46
+ false,
47
+ p.userId,
46
48
  );
47
49
  break;
48
50
  case 'delete':
49
- await this.chatterMessageService.postAuditMessageOnDelete(p.modelName, p.before);
51
+ await this.chatterMessageService.postAuditMessageOnDelete(p.modelName, p.before, false, p.userId);
50
52
  break;
51
53
  }
52
54
  }
@@ -60,7 +60,7 @@ export class TriggerMcpClientSubscriberDatabase extends DatabaseSubscriber<Trigg
60
60
  // Fallback
61
61
  nestedResponse = String(raw);
62
62
  }
63
- } catch (err) {
63
+ } catch (err: any) {
64
64
  this.triggerMcpClientSubscriberLogger.error("Error processing AI response:", err);
65
65
  nestedResponse = `Error handling response: ${err?.message || String(err)}`;
66
66
  }
@@ -33,7 +33,7 @@ export class ChatterQueueSubscriberRabbitmq extends RabbitMqSubscriber<AuditQueu
33
33
 
34
34
  switch (p.eventType) {
35
35
  case 'insert':
36
- await this.chatterMessageService.postAuditMessageOnInsert(p.after, p.modelName);
36
+ await this.chatterMessageService.postAuditMessageOnInsert(p.after, p.modelName, false, p.userId);
37
37
  break;
38
38
  case 'update':
39
39
  await this.chatterMessageService.postAuditMessageOnUpdate(
@@ -41,10 +41,12 @@ export class ChatterQueueSubscriberRabbitmq extends RabbitMqSubscriber<AuditQueu
41
41
  p.modelName,
42
42
  p.before,
43
43
  (p.updatedColumnNames ?? []).map(n => ({ propertyName: n })),
44
+ false,
45
+ p.userId,
44
46
  );
45
47
  break;
46
48
  case 'delete':
47
- await this.chatterMessageService.postAuditMessageOnDelete(p.modelName, p.before);
49
+ await this.chatterMessageService.postAuditMessageOnDelete(p.modelName, p.before, false, p.userId);
48
50
  break;
49
51
  }
50
52
  }
@@ -33,13 +33,20 @@ export class ChatterQueueSubscriberRedis extends RedisSubscriber<any> {
33
33
 
34
34
  switch (p.eventType) {
35
35
  case 'insert':
36
- await this.chatterMessageService.postAuditMessageOnInsert(p.after, { name: p.modelName } as any);
36
+ await this.chatterMessageService.postAuditMessageOnInsert(p.after, p.modelName, false, p.userId);
37
37
  break;
38
38
  case 'update':
39
- await this.chatterMessageService.postAuditMessageOnUpdate(p.after, { name: p.modelName } as any, p.before, (p.updatedColumnNames || []).map(n => ({ propertyName: n })));
39
+ await this.chatterMessageService.postAuditMessageOnUpdate(
40
+ p.after,
41
+ p.modelName,
42
+ p.before,
43
+ (p.updatedColumnNames || []).map(n => ({ propertyName: n })),
44
+ false,
45
+ p.userId,
46
+ );
40
47
  break;
41
48
  case 'delete':
42
- await this.chatterMessageService.postAuditMessageOnDelete(p.before, { name: p.modelName } as any, p.before);
49
+ await this.chatterMessageService.postAuditMessageOnDelete(p.modelName, p.before, false, p.userId);
43
50
  break;
44
51
  }
45
52
  }
@@ -0,0 +1,17 @@
1
+ import { Injectable } from '@nestjs/common';
2
+ import { McpAuditLog } from 'src/entities/mcp-audit-log.entity';
3
+ import { RequestContextService } from 'src/services/request-context.service';
4
+ import { DataSource } from 'typeorm';
5
+ import { SecurityRuleRepository } from './security-rule.repository';
6
+ import { SolidBaseRepository } from './solid-base.repository';
7
+
8
+ @Injectable()
9
+ export class McpAuditLogRepository extends SolidBaseRepository<McpAuditLog> {
10
+ constructor(
11
+ readonly dataSource: DataSource,
12
+ readonly requestContextService: RequestContextService,
13
+ readonly securityRuleRepository: SecurityRuleRepository,
14
+ ) {
15
+ super(McpAuditLog, dataSource, requestContextService, securityRuleRepository);
16
+ }
17
+ }
@@ -56,7 +56,7 @@ export class SecurityRuleRepository extends SolidBaseRepository<SecurityRule> {
56
56
 
57
57
  evaluatedRules.push(evaluatedRule);
58
58
 
59
- } catch (error) {
59
+ } catch (error: any) {
60
60
  this.logger.error(`Error parsing security rule: ${rule.securityRuleConfig}`, error);
61
61
  this.logger.error(error.stack);
62
62
  throw error;
@@ -238,7 +238,7 @@ export class ModuleMetadataSeederService {
238
238
 
239
239
  //FIXME: Handle displaying the created users credentials in a better way.
240
240
  // this.logger.log(`Newly created username is: ${usersDetail?.length > 0 ? usersDetail[0]?.username : ''} and password is ${usersDetail?.length > 0 ? usersDetail[0]?.password : ''}`);
241
- } catch (error) {
241
+ } catch (error: any) {
242
242
  this.logSeedFailureForCli(error, {
243
243
  moduleName: currentModule,
244
244
  step: currentStep,
@@ -463,7 +463,7 @@ export class ModuleMetadataSeederService {
463
463
  await this.createPermissionIfNotExists(permissionName);
464
464
  }
465
465
 
466
- } catch (error) {
466
+ } catch (error: any) {
467
467
  this.logger.error(error);
468
468
  }
469
469
  }
@@ -544,7 +544,7 @@ export class ModuleMetadataSeederService {
544
544
  moduleRoot = path.dirname(
545
545
  require.resolve('@solidxai/core/package.json'),
546
546
  );
547
- } catch (err) {
547
+ } catch (err: any) {
548
548
  this.logger.debug(
549
549
  'Could not resolve @solidxai/core from node_modules, assuming local execution',
550
550
  );
@@ -610,7 +610,7 @@ export class ModuleMetadataSeederService {
610
610
  moduleRoot = path.dirname(
611
611
  require.resolve('@solidxai/core/package.json'),
612
612
  );
613
- } catch (err) {
613
+ } catch (err: any) {
614
614
  this.logger.debug(
615
615
  'Could not resolve @solidxai/core from node_modules, assuming local execution',
616
616
  );
@@ -24,6 +24,7 @@ import { TestingRoleSpec, TestingUserSpec } from 'src/testing/contracts/testing-
24
24
  @Injectable()
25
25
  export class ModuleTestDataService {
26
26
  private readonly logger = new Logger(ModuleTestDataService.name);
27
+ private static readonly TEARDOWN_RETRY_ATTEMPTS = 5;
27
28
 
28
29
  constructor(
29
30
  private readonly moduleRef: ModuleRef,
@@ -665,31 +666,122 @@ export class ModuleTestDataService {
665
666
  private async dropTestDatabaseObjects(databases: Record<string, string>): Promise<void> {
666
667
  const entries = Object.entries(databases);
667
668
  for (const [dsName, dbName] of entries) {
668
- const dataSource = this.resolveDataSourceByName(dsName);
669
- if (!dataSource.isInitialized) {
670
- await dataSource.initialize();
671
- }
669
+ await this.dropTestDatabaseObjectsWithRetry(dsName, dbName);
670
+ }
671
+ }
672
672
 
673
- console.log(`Dropping test database/schema "${dbName}" on datasource "${dsName}"...`);
673
+ private async dropTestDatabaseObjectsWithRetry(dsName: string, dbName: string): Promise<void> {
674
+ let lastError: unknown;
675
+
676
+ for (let attempt = 1; attempt <= ModuleTestDataService.TEARDOWN_RETRY_ATTEMPTS; attempt += 1) {
677
+ console.log(`Attempting to tear down "${dbName}" on datasource "${dsName}" (${attempt}/${ModuleTestDataService.TEARDOWN_RETRY_ATTEMPTS})...`);
674
678
 
675
- const queryRunner = dataSource.createQueryRunner();
676
679
  try {
677
- const type = dataSource.options.type;
678
- if (type === 'postgres') {
679
- await queryRunner.query(`DROP DATABASE IF EXISTS "${dbName}"`);
680
- } else if (type === 'mssql') {
681
- await this.dropMssqlSchema(queryRunner, dbName);
682
- } else if (type === 'mysql' || type === 'mariadb') {
683
- await queryRunner.query(`DROP DATABASE IF EXISTS \`${dbName}\``);
684
- } else {
685
- throw new Error(`Unsupported database type for test data deletion: ${type}`);
680
+ await this.dropSingleTestDatabaseObject(dsName, dbName);
681
+ return;
682
+ } catch (error) {
683
+ lastError = error;
684
+ if (attempt >= ModuleTestDataService.TEARDOWN_RETRY_ATTEMPTS) {
685
+ throw error;
686
686
  }
687
+
688
+ await this.sleep(this.teardownRetryDelayMs(attempt));
689
+ }
690
+ }
691
+
692
+ throw lastError instanceof Error ? lastError : new Error(String(lastError));
693
+ }
694
+
695
+ private teardownRetryDelayMs(attempt: number): number {
696
+ const baseMs = 500;
697
+ const incrementMs = 350;
698
+ const jitterMs = Math.floor(Math.random() * 250);
699
+ return baseMs + ((attempt - 1) * incrementMs) + jitterMs;
700
+ }
701
+
702
+ private async sleep(ms: number): Promise<void> {
703
+ await new Promise((resolve) => setTimeout(resolve, ms));
704
+ }
705
+
706
+ private async dropSingleTestDatabaseObject(dsName: string, dbName: string): Promise<void> {
707
+ const dataSource = this.resolveDataSourceByName(dsName);
708
+
709
+ if (dataSource.options.type === 'postgres') {
710
+ await this.dropPostgresDatabase(dataSource, dbName);
711
+ return;
712
+ }
713
+
714
+ if (!dataSource.isInitialized) {
715
+ await dataSource.initialize();
716
+ }
717
+
718
+ const queryRunner = dataSource.createQueryRunner();
719
+ try {
720
+ const type = dataSource.options.type;
721
+ if (type === 'mssql') {
722
+ await this.dropMssqlSchema(queryRunner, dbName);
723
+ } else if (type === 'mysql' || type === 'mariadb') {
724
+ await queryRunner.query(`DROP DATABASE IF EXISTS \`${dbName}\``);
725
+ } else {
726
+ throw new Error(`Unsupported database type for test data deletion: ${type}`);
727
+ }
728
+ } finally {
729
+ await queryRunner.release();
730
+ }
731
+ }
732
+
733
+ private async dropPostgresDatabase(dataSource: DataSource, dbName: string): Promise<void> {
734
+ if (dataSource.isInitialized) {
735
+ await dataSource.destroy();
736
+ }
737
+
738
+ const adminDataSource = new DataSource({
739
+ ...(dataSource.options as any),
740
+ database: this.resolvePostgresMaintenanceDatabase(dataSource),
741
+ name: `${String(dataSource.name ?? 'default')}_teardown_admin_${Date.now()}`,
742
+ synchronize: false,
743
+ migrationsRun: false,
744
+ entities: [],
745
+ subscribers: [],
746
+ migrations: [],
747
+ });
748
+
749
+ try {
750
+ await adminDataSource.initialize();
751
+ const queryRunner = adminDataSource.createQueryRunner();
752
+ try {
753
+ await queryRunner.query(
754
+ `SELECT pg_terminate_backend(pid)
755
+ FROM pg_stat_activity
756
+ WHERE datname = $1
757
+ AND pid <> pg_backend_pid()`,
758
+ [dbName],
759
+ );
760
+ await queryRunner.query(`DROP DATABASE IF EXISTS "${dbName}"`);
687
761
  } finally {
688
762
  await queryRunner.release();
689
763
  }
764
+ } finally {
765
+ if (adminDataSource.isInitialized) {
766
+ await adminDataSource.destroy();
767
+ }
690
768
  }
691
769
  }
692
770
 
771
+ private resolvePostgresMaintenanceDatabase(dataSource: DataSource): string {
772
+ const configured = process.env.POSTGRES_MAINTENANCE_DATABASE?.trim();
773
+ if (configured) {
774
+ return configured;
775
+ }
776
+
777
+ const currentDb = String((dataSource.options as any)?.database ?? '').trim();
778
+ if (currentDb && currentDb !== 'postgres') {
779
+ return 'postgres';
780
+ }
781
+
782
+ return 'template1';
783
+ }
784
+
693
785
  private async dropMssqlSchema(queryRunner: ReturnType<DataSource['createQueryRunner']>, schemaName: string): Promise<void> {
694
786
  const foreignKeys: Array<{ fk_name: string; table_name: string }> = await queryRunner.query(
695
787
  `SELECT fk.name AS fk_name, t.name AS table_name
@@ -52,7 +52,7 @@ export class PermissionMetadataSeederService {
52
52
  }
53
53
  }
54
54
 
55
- } catch (error) {
55
+ } catch (error: any) {
56
56
  this.logger.error(error);
57
57
  }
58
58
  }