@solidstarters/solid-core 1.2.180 → 1.2.183

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 (156) hide show
  1. package/dev-grooming-docs/ozzy-prompts.txt +28 -3
  2. package/dist/config/iam.config.d.ts.map +1 -1
  3. package/dist/config/iam.config.js +2 -1
  4. package/dist/config/iam.config.js.map +1 -1
  5. package/dist/controllers/service.controller.d.ts.map +1 -1
  6. package/dist/controllers/service.controller.js +0 -1
  7. package/dist/controllers/service.controller.js.map +1 -1
  8. package/dist/decorators/active-user.decorator.d.ts +1 -1
  9. package/dist/dtos/create-menu-item-metadata.dto.d.ts +3 -0
  10. package/dist/dtos/create-menu-item-metadata.dto.d.ts.map +1 -1
  11. package/dist/dtos/create-menu-item-metadata.dto.js +4 -1
  12. package/dist/dtos/create-menu-item-metadata.dto.js.map +1 -1
  13. package/dist/dtos/create-role-metadata.dto.d.ts +4 -0
  14. package/dist/dtos/create-role-metadata.dto.d.ts.map +1 -1
  15. package/dist/dtos/create-role-metadata.dto.js +45 -1
  16. package/dist/dtos/create-role-metadata.dto.js.map +1 -1
  17. package/dist/interfaces.d.ts +20 -0
  18. package/dist/interfaces.d.ts.map +1 -1
  19. package/dist/interfaces.js.map +1 -1
  20. package/dist/jobs/database/trigger-mcp-client-subscriber-database.service.d.ts +7 -1
  21. package/dist/jobs/database/trigger-mcp-client-subscriber-database.service.d.ts.map +1 -1
  22. package/dist/jobs/database/trigger-mcp-client-subscriber-database.service.js +70 -9
  23. package/dist/jobs/database/trigger-mcp-client-subscriber-database.service.js.map +1 -1
  24. package/dist/repository/view-metadata.repository.d.ts +1 -0
  25. package/dist/repository/view-metadata.repository.d.ts.map +1 -1
  26. package/dist/repository/view-metadata.repository.js +14 -0
  27. package/dist/repository/view-metadata.repository.js.map +1 -1
  28. package/dist/seeders/module-metadata-seeder.service.d.ts +52 -42
  29. package/dist/seeders/module-metadata-seeder.service.d.ts.map +1 -1
  30. package/dist/seeders/module-metadata-seeder.service.js +259 -202
  31. package/dist/seeders/module-metadata-seeder.service.js.map +1 -1
  32. package/dist/seeders/permission-metadata-seeder.service.js +0 -1
  33. package/dist/seeders/permission-metadata-seeder.service.js.map +1 -1
  34. package/dist/seeders/seed-data/solid-core-metadata.json +2 -3
  35. package/dist/services/ai-interaction.service.d.ts +3 -3
  36. package/dist/services/ai-interaction.service.d.ts.map +1 -1
  37. package/dist/services/ai-interaction.service.js +5 -5
  38. package/dist/services/ai-interaction.service.js.map +1 -1
  39. package/dist/services/genai/ingest-metadata.service.d.ts.map +1 -1
  40. package/dist/services/genai/ingest-metadata.service.js +46 -35
  41. package/dist/services/genai/ingest-metadata.service.js.map +1 -1
  42. package/dist/services/{mcp-tool-response-handlers/mcp-tool-response-handler-factory.service.d.ts → genai/mcp-handlers/mcp-handler-factory.service.d.ts} +3 -3
  43. package/dist/services/genai/mcp-handlers/mcp-handler-factory.service.d.ts.map +1 -0
  44. package/dist/services/{mcp-tool-response-handlers/mcp-tool-response-handler-factory.service.js → genai/mcp-handlers/mcp-handler-factory.service.js} +10 -10
  45. package/dist/services/genai/mcp-handlers/mcp-handler-factory.service.js.map +1 -0
  46. package/dist/services/genai/mcp-handlers/solid-add-fields-to-model-mcp-handler.service.d.ts +12 -0
  47. package/dist/services/genai/mcp-handlers/solid-add-fields-to-model-mcp-handler.service.d.ts.map +1 -0
  48. package/dist/services/{mcp-tool-response-handlers/solid-add-field-mcp-tool-response-handler.service.js → genai/mcp-handlers/solid-add-fields-to-model-mcp-handler.service.js} +19 -20
  49. package/dist/services/genai/mcp-handlers/solid-add-fields-to-model-mcp-handler.service.js.map +1 -0
  50. package/dist/services/genai/mcp-handlers/solid-create-computed-provider-mcp-handler.service.d.ts +16 -0
  51. package/dist/services/genai/mcp-handlers/solid-create-computed-provider-mcp-handler.service.d.ts.map +1 -0
  52. package/dist/services/genai/mcp-handlers/solid-create-computed-provider-mcp-handler.service.js +75 -0
  53. package/dist/services/genai/mcp-handlers/solid-create-computed-provider-mcp-handler.service.js.map +1 -0
  54. package/dist/services/{mcp-tool-response-handlers/solid-create-dashboard-mcp-tool-response-handler.service.d.ts → genai/mcp-handlers/solid-create-dashboard-mcp-handler.service.d.ts} +9 -9
  55. package/dist/services/genai/mcp-handlers/solid-create-dashboard-mcp-handler.service.d.ts.map +1 -0
  56. package/dist/services/{mcp-tool-response-handlers/solid-create-dashboard-mcp-tool-response-handler.service.js → genai/mcp-handlers/solid-create-dashboard-mcp-handler.service.js} +13 -13
  57. package/dist/services/genai/mcp-handlers/solid-create-dashboard-mcp-handler.service.js.map +1 -0
  58. package/dist/services/genai/mcp-handlers/solid-create-dashboard-question-mcp-handler.service.d.ts +12 -0
  59. package/dist/services/genai/mcp-handlers/solid-create-dashboard-question-mcp-handler.service.d.ts.map +1 -0
  60. package/dist/services/{mcp-tool-response-handlers/solid-create-dashboard-question-mcp-tool-response-handler.service.js → genai/mcp-handlers/solid-create-dashboard-question-mcp-handler.service.js} +8 -8
  61. package/dist/services/genai/mcp-handlers/solid-create-dashboard-question-mcp-handler.service.js.map +1 -0
  62. package/dist/services/{mcp-tool-response-handlers/solid-create-dashboard-question-sql-dataset-config-mcp-tool-response-handler.service.d.ts → genai/mcp-handlers/solid-create-dashboard-question-sql-dataset-config-mcp-handler.service.d.ts} +4 -4
  63. package/dist/services/genai/mcp-handlers/solid-create-dashboard-question-sql-dataset-config-mcp-handler.service.d.ts.map +1 -0
  64. package/dist/services/{mcp-tool-response-handlers/solid-create-dashboard-question-sql-dataset-config-mcp-tool-response-handler.service.js → genai/mcp-handlers/solid-create-dashboard-question-sql-dataset-config-mcp-handler.service.js} +8 -8
  65. package/dist/services/genai/mcp-handlers/solid-create-dashboard-question-sql-dataset-config-mcp-handler.service.js.map +1 -0
  66. package/dist/services/genai/mcp-handlers/solid-create-dashboard-widget-mcp-handler.service.d.ts +12 -0
  67. package/dist/services/genai/mcp-handlers/solid-create-dashboard-widget-mcp-handler.service.d.ts.map +1 -0
  68. package/dist/services/{mcp-tool-response-handlers/solid-create-dashboard-widget-mcp-tool-response-handler.service.js → genai/mcp-handlers/solid-create-dashboard-widget-mcp-handler.service.js} +8 -8
  69. package/dist/services/genai/mcp-handlers/solid-create-dashboard-widget-mcp-handler.service.js.map +1 -0
  70. package/dist/services/genai/mcp-handlers/solid-create-model-with-fields-mcp-handler.service.d.ts +14 -0
  71. package/dist/services/genai/mcp-handlers/solid-create-model-with-fields-mcp-handler.service.d.ts.map +1 -0
  72. package/dist/services/{mcp-tool-response-handlers/solid-create-model-with-fields-mcp-tool-response-handler.service.js → genai/mcp-handlers/solid-create-model-with-fields-mcp-handler.service.js} +14 -16
  73. package/dist/services/genai/mcp-handlers/solid-create-model-with-fields-mcp-handler.service.js.map +1 -0
  74. package/dist/services/{mcp-tool-response-handlers/solid-create-module-mcp-tool-response-handler.service.d.ts → genai/mcp-handlers/solid-create-module-mcp-handler.service.d.ts} +4 -4
  75. package/dist/services/genai/mcp-handlers/solid-create-module-mcp-handler.service.d.ts.map +1 -0
  76. package/dist/services/{mcp-tool-response-handlers/solid-create-module-mcp-tool-response-handler.service.js → genai/mcp-handlers/solid-create-module-mcp-handler.service.js} +13 -10
  77. package/dist/services/genai/mcp-handlers/solid-create-module-mcp-handler.service.js.map +1 -0
  78. package/dist/services/{mcp-tool-response-handlers/solid-save-model-layout-mcp-tool-response-handler.service.d.ts → genai/mcp-handlers/solid-update-layout-mcp-handler.service.d.ts} +3 -3
  79. package/dist/services/genai/mcp-handlers/solid-update-layout-mcp-handler.service.d.ts.map +1 -0
  80. package/dist/services/{mcp-tool-response-handlers/solid-save-model-layout-mcp-tool-response-handler.service.js → genai/mcp-handlers/solid-update-layout-mcp-handler.service.js} +12 -10
  81. package/dist/services/genai/mcp-handlers/solid-update-layout-mcp-handler.service.js.map +1 -0
  82. package/dist/services/import-transaction.service.js +2 -2
  83. package/dist/services/import-transaction.service.js.map +1 -1
  84. package/dist/services/menu-item-metadata.service.d.ts.map +1 -1
  85. package/dist/services/menu-item-metadata.service.js +0 -2
  86. package/dist/services/menu-item-metadata.service.js.map +1 -1
  87. package/dist/services/model-metadata.service.d.ts.map +1 -1
  88. package/dist/services/model-metadata.service.js.map +1 -1
  89. package/dist/services/module-metadata.service.d.ts.map +1 -1
  90. package/dist/services/module-metadata.service.js +1 -1
  91. package/dist/services/module-metadata.service.js.map +1 -1
  92. package/dist/services/role-metadata.service.d.ts.map +1 -1
  93. package/dist/services/role-metadata.service.js +1 -7
  94. package/dist/services/role-metadata.service.js.map +1 -1
  95. package/dist/services/solid-ts-morph.service.d.ts +28 -0
  96. package/dist/services/solid-ts-morph.service.d.ts.map +1 -0
  97. package/dist/services/solid-ts-morph.service.js +222 -0
  98. package/dist/services/solid-ts-morph.service.js.map +1 -0
  99. package/dist/solid-core.module.d.ts.map +1 -1
  100. package/dist/solid-core.module.js +22 -18
  101. package/dist/solid-core.module.js.map +1 -1
  102. package/dist/tsconfig.tsbuildinfo +1 -1
  103. package/package.json +6 -4
  104. package/solid_seed_fixes.ts.txt +93 -0
  105. package/src/config/iam.config.ts +2 -1
  106. package/src/controllers/service.controller.ts +4 -1
  107. package/src/dtos/create-menu-item-metadata.dto.ts +5 -1
  108. package/src/dtos/create-role-metadata.dto.ts +60 -1
  109. package/src/interfaces.ts +29 -2
  110. package/src/jobs/database/trigger-mcp-client-subscriber-database.service.ts +74 -8
  111. package/src/repository/view-metadata.repository.ts +15 -0
  112. package/src/seeders/module-metadata-seeder.service.ts +355 -282
  113. package/src/seeders/permission-metadata-seeder.service.ts +1 -1
  114. package/src/seeders/seed-data/solid-core-metadata.json +3 -5
  115. package/src/services/ai-interaction.service.ts +3 -5
  116. package/src/services/genai/ingest-metadata.service.ts +115 -39
  117. package/src/services/{mcp-tool-response-handlers/mcp-tool-response-handler-factory.service.ts → genai/mcp-handlers/mcp-handler-factory.service.ts} +5 -5
  118. package/src/services/genai/mcp-handlers/solid-add-fields-to-model-mcp-handler.service.ts +68 -0
  119. package/src/services/genai/mcp-handlers/solid-create-computed-provider-mcp-handler.service.ts +71 -0
  120. package/src/services/{mcp-tool-response-handlers/solid-create-dashboard-mcp-tool-response-handler.service.ts → genai/mcp-handlers/solid-create-dashboard-mcp-handler.service.ts} +8 -8
  121. package/src/services/{mcp-tool-response-handlers/solid-create-dashboard-question-mcp-tool-response-handler.service.ts → genai/mcp-handlers/solid-create-dashboard-question-mcp-handler.service.ts} +3 -3
  122. package/src/services/{mcp-tool-response-handlers/solid-create-dashboard-question-sql-dataset-config-mcp-tool-response-handler.service.ts → genai/mcp-handlers/solid-create-dashboard-question-sql-dataset-config-mcp-handler.service.ts} +3 -3
  123. package/src/services/{mcp-tool-response-handlers/solid-create-dashboard-widget-mcp-tool-response-handler.service.ts → genai/mcp-handlers/solid-create-dashboard-widget-mcp-handler.service.ts} +3 -3
  124. package/src/services/{mcp-tool-response-handlers/solid-create-model-with-fields-mcp-tool-response-handler.service.ts → genai/mcp-handlers/solid-create-model-with-fields-mcp-handler.service.ts} +8 -10
  125. package/src/services/{mcp-tool-response-handlers/solid-create-module-mcp-tool-response-handler.service.ts → genai/mcp-handlers/solid-create-module-mcp-handler.service.ts} +8 -5
  126. package/src/services/{mcp-tool-response-handlers/solid-save-model-layout-mcp-tool-response-handler.service.ts → genai/mcp-handlers/solid-update-layout-mcp-handler.service.ts} +11 -5
  127. package/src/services/import-transaction.service.ts +2 -2
  128. package/src/services/menu-item-metadata.service.ts +3 -7
  129. package/src/services/model-metadata.service.ts +0 -3
  130. package/src/services/module-metadata.service.ts +2 -3
  131. package/src/services/role-metadata.service.ts +22 -8
  132. package/src/services/solid-ts-morph.service.ts +263 -0
  133. package/src/solid-core.module.ts +25 -19
  134. package/dist/services/mcp-tool-response-handlers/mcp-tool-response-handler-factory.service.d.ts.map +0 -1
  135. package/dist/services/mcp-tool-response-handlers/mcp-tool-response-handler-factory.service.js.map +0 -1
  136. package/dist/services/mcp-tool-response-handlers/solid-add-field-mcp-tool-response-handler.service.d.ts +0 -16
  137. package/dist/services/mcp-tool-response-handlers/solid-add-field-mcp-tool-response-handler.service.d.ts.map +0 -1
  138. package/dist/services/mcp-tool-response-handlers/solid-add-field-mcp-tool-response-handler.service.js.map +0 -1
  139. package/dist/services/mcp-tool-response-handlers/solid-create-dashboard-mcp-tool-response-handler.service.d.ts.map +0 -1
  140. package/dist/services/mcp-tool-response-handlers/solid-create-dashboard-mcp-tool-response-handler.service.js.map +0 -1
  141. package/dist/services/mcp-tool-response-handlers/solid-create-dashboard-question-mcp-tool-response-handler.service.d.ts +0 -12
  142. package/dist/services/mcp-tool-response-handlers/solid-create-dashboard-question-mcp-tool-response-handler.service.d.ts.map +0 -1
  143. package/dist/services/mcp-tool-response-handlers/solid-create-dashboard-question-mcp-tool-response-handler.service.js.map +0 -1
  144. package/dist/services/mcp-tool-response-handlers/solid-create-dashboard-question-sql-dataset-config-mcp-tool-response-handler.service.d.ts.map +0 -1
  145. package/dist/services/mcp-tool-response-handlers/solid-create-dashboard-question-sql-dataset-config-mcp-tool-response-handler.service.js.map +0 -1
  146. package/dist/services/mcp-tool-response-handlers/solid-create-dashboard-widget-mcp-tool-response-handler.service.d.ts +0 -12
  147. package/dist/services/mcp-tool-response-handlers/solid-create-dashboard-widget-mcp-tool-response-handler.service.d.ts.map +0 -1
  148. package/dist/services/mcp-tool-response-handlers/solid-create-dashboard-widget-mcp-tool-response-handler.service.js.map +0 -1
  149. package/dist/services/mcp-tool-response-handlers/solid-create-model-with-fields-mcp-tool-response-handler.service.d.ts +0 -16
  150. package/dist/services/mcp-tool-response-handlers/solid-create-model-with-fields-mcp-tool-response-handler.service.d.ts.map +0 -1
  151. package/dist/services/mcp-tool-response-handlers/solid-create-model-with-fields-mcp-tool-response-handler.service.js.map +0 -1
  152. package/dist/services/mcp-tool-response-handlers/solid-create-module-mcp-tool-response-handler.service.d.ts.map +0 -1
  153. package/dist/services/mcp-tool-response-handlers/solid-create-module-mcp-tool-response-handler.service.js.map +0 -1
  154. package/dist/services/mcp-tool-response-handlers/solid-save-model-layout-mcp-tool-response-handler.service.d.ts.map +0 -1
  155. package/dist/services/mcp-tool-response-handlers/solid-save-model-layout-mcp-tool-response-handler.service.js.map +0 -1
  156. package/src/services/mcp-tool-response-handlers/solid-add-field-mcp-tool-response-handler.service.ts +0 -56
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@solidstarters/solid-core",
3
- "version": "1.2.180",
3
+ "version": "1.2.183",
4
4
  "description": "This module is a NestJS module containing all the required core providers required by a Solid application",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -70,9 +70,9 @@
70
70
  "pluralize": "^8.0.0",
71
71
  "puppeteer": "^23.2.0",
72
72
  "r2r-js": "^0.4.43",
73
- "reflect-metadata": "^0.2.2",
74
73
  "rxjs": "^7.8.1",
75
74
  "swagger-ui-express": "^5.0.0",
75
+ "ts-morph": "^27.0.2",
76
76
  "twilio": "^5.8.0",
77
77
  "uuid": "^9.0.1",
78
78
  "xlsx": "^0.18.5"
@@ -97,7 +97,8 @@
97
97
  "nestjs-cls": "^5.4.3",
98
98
  "typeorm": "^0.3.20",
99
99
  "typeorm-naming-strategies": "^4.1.0",
100
- "winston": "^3.17.0"
100
+ "winston": "^3.17.0",
101
+ "reflect-metadata": "^0.2.2"
101
102
  },
102
103
  "devDependencies": {
103
104
  "@angular-devkit/schematics": "^19.2.6",
@@ -152,7 +153,8 @@
152
153
  "typeorm": "^0.3.20",
153
154
  "typeorm-naming-strategies": "^4.1.0",
154
155
  "typescript": "^5.1.3",
155
- "winston": "^3.17.0"
156
+ "winston": "^3.17.0",
157
+ "reflect-metadata": "^0.2.2"
156
158
  },
157
159
  "jest": {
158
160
  "moduleFileExtensions": [
@@ -0,0 +1,93 @@
1
+ import { In } from "typeorm";
2
+ import { MenuItemMetadata } from "src/entities/menu-item-metadata.entity";
3
+ import { RoleMetadata } from "src/entities/role-metadata.entity";
4
+ import { ActionMetadata } from "src/entities/action-metadata.entity";
5
+ import { ModuleMetadata } from "src/entities/module-metadata.entity";
6
+
7
+ const JOIN_TABLE = "ss_menu_item_metadata_roles_role_metadata"; // <-- your actual join table
8
+ const MENU_COL = "menuItemId"; // <-- actual column name in the join table
9
+ const ROLE_COL = "roleId"; // <-- actual column name in the join table
10
+
11
+ await this.dataSource.transaction(async (trx) => {
12
+ const menuRepo = trx.getRepository(MenuItemMetadata);
13
+ const roleRepo = trx.getRepository(RoleMetadata);
14
+ const actionRepo = trx.getRepository(ActionMetadata);
15
+ const moduleRepo = trx.getRepository(ModuleMetadata);
16
+
17
+ // 1) Upsert menus WITHOUT roles
18
+ for (const m of menus) {
19
+ const entity = menuRepo.create({
20
+ name: m.name,
21
+ displayName: m.displayName,
22
+ action: m.actionUserKey
23
+ ? await actionRepo.findOne({ where: { userKey: m.actionUserKey }, select: ["id"] })
24
+ : null,
25
+ module: m.moduleUserKey
26
+ ? await moduleRepo.findOne({ where: { userKey: m.moduleUserKey }, select: ["id"] })
27
+ : null,
28
+ parentMenuItem: m.parentMenuItemUserKey
29
+ ? await menuRepo.findOne({ where: { userKey: m.parentMenuItemUserKey }, select: ["id"] })
30
+ : null,
31
+ });
32
+ await menuRepo.upsert(entity, ["name"]); // or ["userKey"]
33
+ }
34
+
35
+ // 2) Fetch ids for batching
36
+ const seeded = await menuRepo.find({
37
+ where: { name: In(menus.map(m => m.name)) },
38
+ select: ["id", "name"],
39
+ });
40
+ const idByName = new Map(seeded.map(s => [s.name, s.id]));
41
+
42
+ // 3) Build desired join rows once
43
+ const admin = await roleRepo.findOne({ where: { name: ADMIN_ROLE_NAME }, select: ["id","name"] });
44
+ const allRoleNames = new Set<string>();
45
+ for (const m of menus) (m.roles ?? []).forEach((r: string) => allRoleNames.add(r));
46
+ if (admin) allRoleNames.add(admin.name);
47
+
48
+ const roles = await roleRepo.find({
49
+ where: { name: In([...allRoleNames]) },
50
+ select: ["id","name"],
51
+ });
52
+ const roleByName = new Map(roles.map(r => [r.name, r]));
53
+
54
+ const joinRows: Array<{ menuId: number; roleId: number }> = [];
55
+ for (const m of menus) {
56
+ const menuId = idByName.get(m.name)!;
57
+ const roleNames = new Set<string>([...(m.roles ?? []), admin?.name].filter(Boolean) as string[]);
58
+ for (const rn of roleNames) {
59
+ const role = roleByName.get(rn);
60
+ if (role) joinRows.push({ menuId, roleId: role.id });
61
+ }
62
+ }
63
+
64
+ // 4) Replace in bulk — QueryBuilder version
65
+
66
+ // 4a) delete existing for affected menus
67
+ const menuIds = [...new Set(joinRows.map(r => r.menuId))];
68
+ if (menuIds.length) {
69
+ await trx
70
+ .createQueryBuilder()
71
+ .delete()
72
+ .from(JOIN_TABLE) // string table name is fine
73
+ .where(`${MENU_COL} IN (:...ids)`, { ids: menuIds })
74
+ .execute();
75
+ }
76
+
77
+ // 4b) bulk insert all pairs
78
+ if (joinRows.length) {
79
+ // Build objects with the exact column names used by the join table
80
+ const values = joinRows.map(r => ({
81
+ [MENU_COL]: r.menuId,
82
+ [ROLE_COL]: r.roleId,
83
+ }));
84
+
85
+ await trx
86
+ .createQueryBuilder()
87
+ .insert()
88
+ .into(JOIN_TABLE) // string table name
89
+ .values(values)
90
+ .orIgnore() // optional if you have a UNIQUE(menuItemId, roleId) and want to skip dups
91
+ .execute();
92
+ }
93
+ });
@@ -1,4 +1,5 @@
1
1
  import { registerAs } from '@nestjs/config';
2
+ import { Environment } from 'src';
2
3
 
3
4
  export const iamConfig = registerAs('iam', () => {
4
5
  return {
@@ -32,7 +33,7 @@ export const jwtConfig = registerAs('jwt', () => {
32
33
  secret: process.env.IAM_JWT_SECRET,
33
34
  audience: process.env.IAM_JWT_TOKEN_AUDIENCE,
34
35
  issuer: process.env.IAM_JWT_TOKEN_ISSUER,
35
- accessTokenTtl: parseInt(process.env.IAM_JWT_ACCESS_TOKEN_TTL ?? '1200', 10), // 20 minutes
36
+ accessTokenTtl: parseInt(process.env.IAM_JWT_ACCESS_TOKEN_TTL ?? (process.env.ENV as Environment) === Environment.Production ? '1200' : '86400', 10), // 20 minutes in prod, 1 day otherwise
36
37
  refreshTokenTtl: parseInt(process.env.IAM_JWT_REFRESH_TOKEN_TTL ?? '604800', 10), // 7 days
37
38
  };
38
39
  });
@@ -136,7 +136,10 @@ export class ServiceController {
136
136
  // Run the Solid ingestion command
137
137
  if (config.runSolidIngestion) {
138
138
  this.logger.debug(`Running the Solid ingestion command as part of post-process code generation`);
139
- await this.ingestMetadataService.ingest();
139
+
140
+ // TODO: disabled this till we figure out a way to make this stable...
141
+ // This keeps failing for a variety of reasons...
142
+ // await this.ingestMetadataService.ingest();
140
143
  }
141
144
  }
142
145
 
@@ -65,4 +65,8 @@ export class CreateMenuItemMetadataDto {
65
65
  @ApiProperty()
66
66
  iconName: string;
67
67
 
68
- }
68
+ }
69
+
70
+ export const MENU_ROLE_JOIN_TABLE_NAME = "ss_menu_item_metadata_roles_ss_role_metadata"; // <-- your actual join table
71
+ export const MENU_ROLE_JOIN_TABLE_NAME_MENU_COL = "ss_menu_item_metadata_id"; // <-- actual column name in the join table
72
+ export const MENU_ROLE_JOIN_TABLE_NAME_ROLE_COL = "ss_role_metadata_id"; // <-- actual column name in the join table
@@ -53,4 +53,63 @@ export class CreateRoleMetadataDto {
53
53
  @IsOptional()
54
54
  @ApiProperty()
55
55
  menuItemsCommand: string;
56
- }
56
+ }
57
+ export const ADMIN_ROLE_NAME = 'Admin';
58
+ export const INTERNAL_ROLE_NAME = 'Internal User';
59
+ export const PUBLIC_ROLE_NAME = 'Public';
60
+ export const INTERNAL_ROLE_PERMISSIONS = [
61
+ // User permissions
62
+ 'UserController.findMany', //Why do we need this?
63
+ 'UserController.checkIfPermissionExists',
64
+ 'UserController.findOne',
65
+ // Menu permissions
66
+ 'MenuItemMetadataController.findMany',
67
+ 'MenuItemMetadataController.findUserMenus',
68
+ 'MenuItemMetadataController.findOne',
69
+ // View metadata permissions
70
+ 'ViewMetadataController.getLayout',
71
+ 'ViewMetadataController.findMany',
72
+ 'ViewMetadataController.findOne',
73
+ // User View metadata permissions
74
+ 'UserViewMetadataController.upsert',
75
+ 'UserViewMetadataController.findMany',
76
+ 'UserViewMetadataController.findOne',
77
+ // IAM permissions
78
+ 'AuthenticationController.changePassword',
79
+ // Field Metadata permissions
80
+ 'FieldMetadataController.getSelectionDynamicValues',
81
+ 'FieldMetadataController.getSelectionDynamicValue',
82
+ 'FieldMetadataController.findFieldDefaultMetaData',
83
+ // Saved Filters permissions
84
+ 'SavedFiltersController.delete',
85
+ 'SavedFiltersController.deleteMany',
86
+ 'SavedFiltersController.findOne',
87
+ 'SavedFiltersController.findMany',
88
+ 'SavedFiltersController.recover',
89
+ 'SavedFiltersController.recoverMany',
90
+ 'SavedFiltersController.partialUpdate',
91
+ 'SavedFiltersController.update',
92
+ 'SavedFiltersController.insertMany',
93
+ 'SavedFiltersController.create',
94
+ // Logout permissions
95
+ 'AuthenticationController.logout',
96
+ // Other permissions can be added here as required.
97
+ // Chatter permissions
98
+ 'ChatterMessageController.create',
99
+ 'ChatterMessageController.getChatterMessages',
100
+ // 'ChatterMessageController.postMessage', // Does not seem to be used from ui
101
+ // Import
102
+ 'ImportTransactionController.getImportTemplate',
103
+ 'ImportTransactionController.getImportInstructions',
104
+ 'ImportTransactionController.getImportMappingInfo',
105
+ 'ImportTransactionController.startImportSync',
106
+ 'ImportTransactionController.startImportAsync',
107
+ 'ImportTransactionController.exportFailedImportedImports',
108
+ // Export permissions
109
+ 'ExportTemplateController.startExportSync',
110
+ 'ExportTemplateController.startExportAsync',
111
+ // List of values
112
+ 'ListOfValuesController.findMany',
113
+ 'ListOfValuesController.findOne',
114
+ // Media // [Not required], since media is always populated as part of a model
115
+ ]
package/src/interfaces.ts CHANGED
@@ -66,7 +66,7 @@ export interface CodeGenerationOptions {
66
66
 
67
67
  export interface TriggerMcpClientOptions {
68
68
  aiInteractionId: number;
69
- moduleName:string;
69
+ moduleName: string;
70
70
  }
71
71
 
72
72
  export interface McpResponse {
@@ -274,4 +274,31 @@ export interface IErrorCodeProvider {
274
274
  * If omitted, the ErrorMapperService will rely on the rule.meta of the first matching rule.
275
275
  */
276
276
  resolve?(code: ErrorCode): ErrorMeta | undefined;
277
- }
277
+ }
278
+
279
+ // MCP Tool Related
280
+
281
+ export type PlanStep = CreateNewFileStep | RegisterNestProviderStep;
282
+
283
+ export interface CreateNewFileStep {
284
+ type: "createNewFile";
285
+ path: string; // repo-relative e.g. solid-api/api/src/computed-providers/foo.provider.ts
286
+ content: string; // full file content
287
+ overwrite?: boolean; // default=false
288
+ rationale?: string; // optional, ignored by executor
289
+ }
290
+
291
+ export interface RegisterNestProviderStep {
292
+ type: "registerNestProvider";
293
+ modulePath: string; // e.g. apps/api/src/address-master/address-master.module.ts
294
+ providerClassName: string; // e.g. StateTotalCitiesComputedFieldProvider
295
+ importFrom: string; // e.g. "@/computed-providers/state-total-cities.provider"
296
+ registerIn: Array<"providers" | "exports">; // which arrays to add to
297
+ uniqueGuard?: boolean; // default=true
298
+ rationale?: string; // optional, ignored by executor
299
+ }
300
+
301
+ export interface McpComputedProviderResponse {
302
+ plan: PlanStep[];
303
+ // provider?: any; // (intentionally ignored per your note)
304
+ }
@@ -1,5 +1,4 @@
1
1
  import { Injectable, Logger } from '@nestjs/common';
2
-
3
2
  import { QueueMessage } from 'src/interfaces/mq';
4
3
  import { MqMessageService } from '../../services/mq-message.service';
5
4
  import { MqMessageQueueService } from '../../services/mq-message-queue.service';
@@ -8,6 +7,9 @@ import { DatabaseSubscriber } from 'src/services/queues/database-subscriber.serv
8
7
  import triggerMcpClientQueueOptions from "./trigger-mcp-client-queue-options";
9
8
  import { AiInteractionService } from 'src/services/ai-interaction.service';
10
9
  import { PollerService } from 'src/services/poller.service';
10
+ import { SolidRegistry } from 'src/helpers/solid-registry';
11
+ import { ModuleMetadataService } from 'src/services/module-metadata.service';
12
+ import { ModelMetadataService } from 'src';
11
13
 
12
14
  @Injectable()
13
15
  export class TriggerMcpClientSubscriberDatabase extends DatabaseSubscriber<TriggerMcpClientOptions> {
@@ -18,6 +20,10 @@ export class TriggerMcpClientSubscriberDatabase extends DatabaseSubscriber<Trigg
18
20
  readonly mqMessageQueueService: MqMessageQueueService,
19
21
  readonly poller: PollerService,
20
22
  readonly aiInteractionService: AiInteractionService,
23
+ readonly moduleMetadataService: ModuleMetadataService,
24
+ readonly modelMetadataService: ModelMetadataService,
25
+ private readonly solidRegistry: SolidRegistry,
26
+
21
27
  ) {
22
28
  super(mqMessageService, mqMessageQueueService, poller);
23
29
  }
@@ -95,23 +101,81 @@ export class TriggerMcpClientSubscriberDatabase extends DatabaseSubscriber<Trigg
95
101
  status: 'pending' // Updated after we receive the response
96
102
  });
97
103
 
104
+ const existingComputationProviders = this.solidRegistry.getComputedFieldProviders();
105
+
106
+ const { records: existingModules } = await this.moduleMetadataService.findMany({
107
+ filters: {
108
+ name: { $ne: 'solid-core' }
109
+ },
110
+ fields: ['id', 'name', 'displayName', 'description'],
111
+ limit: 1000
112
+ });
113
+ const { records: existingModels } = await this.modelMetadataService.findMany({
114
+ filters: {
115
+ module: {
116
+ name: {
117
+ $ne: 'solid-core',
118
+ }
119
+ }
120
+ },
121
+ limit: 1000,
122
+ populate: ['module']
123
+ });
124
+
125
+ // Build markdown sections using template interpolation
126
+ const modulesSection = (existingModules ?? [])
127
+ .map(m => [
128
+ `### ${m.displayName}`,
129
+ `- name: ${m.name}`,
130
+ `- description: ${m.description ?? ""}`,
131
+ ].join('\n'))
132
+ .join('\n\n');
133
+
134
+ const modelsSection = (existingModels ?? [])
135
+ .map(m => [
136
+ `### ${m.displayName}`,
137
+ `- singularName: ${m.singularName}`,
138
+ `- description: ${m.description ?? ""}`,
139
+ `- moduleName: ${m.module.name}`,
140
+ ].join('\n'))
141
+ .join('\n\n');
142
+
143
+ const computationProvidersSection = (existingComputationProviders ?? [])
144
+ .map(m => [
145
+ `### ${m.instance.name()}`,
146
+ `- name: ${m.instance.name()}`,
147
+ `- description: ${m.instance.help() ?? ""}`,
148
+ ].join('\n'))
149
+ .join('\n\n');
150
+
98
151
  const finalPrompt = `
99
152
  # User Prompt:
100
153
  ${prompt}
101
154
 
102
155
  # System Instructions:
103
156
  - aiInteractionId: ${genAiInteraction.id}
104
- - moduleName:${message.payload.moduleName}
105
- - You will be invoking tools if needed.
157
+ - You will be invoking tools if needed, hence you will have to choose the applicable tools based on the tool context given to you.
106
158
  - If a tool is invoked, you must return **exactly** the raw output from the tool, without any json envelopes, additional formatting, commentary, or text.
107
159
  - Do not wrap the result in quotes, JSON, or markdown fences.
108
160
  - Do not explain what the result means.
109
161
 
110
- # Past Interactions:
111
- This section contains the last 10 interactions done between the human and LLM. These are sorted by oldest first.
112
- Use these interactions to further identify concerns based on the current User Prompt.
162
+ # LISTS FOR REFERENCE AND VALIDATIONS
163
+
164
+ ## LIST OF EXISTING MODULES
165
+ Use the below list of models with module names to infer which module & models the user is referring to, you can try to pull out the singularName incase of models.
166
+
167
+ ${modulesSection}
113
168
 
114
- `
169
+ ## LIST OF EXISTING MODELS
170
+ Use the below list of modules to infer which module the user is referring to.
171
+
172
+ ${modelsSection}
173
+
174
+ ## LIST OF EXISTING COMPUTED FIELD PROVIDERS
175
+ Use the below list of computed field providers to infer which provider the user is referring to.
176
+
177
+ ${computationProvidersSection}
178
+ `.trim();
115
179
 
116
180
  const aiResponse = await this.aiInteractionService.runMcpPrompt(finalPrompt);
117
181
  this.triggerMcpClientSubscriberLogger.log(`aiResponse: `);
@@ -170,7 +234,9 @@ Use these interactions to further identify concerns based on the current User Pr
170
234
  // });
171
235
 
172
236
  // TODO: Update the previously created genAiInteraction record with the respective success fields and save to DB
173
- const errorsStr = nestedResponse.status == "error" && nestedResponse.errors.join('\n ');
237
+ const errorsStr = nestedResponse?.status == "error" && nestedResponse?.errors.join('\n ');
238
+ // const errorTrace = nestedResponse?.status == "error" && nestedResponse?.error_trace?.join('\n');
239
+
174
240
 
175
241
  await this.aiInteractionService.update(genAiInteraction.id, {
176
242
  errorMessage: nestedResponse.status == "error" ? `${errorsStr}` : "",
@@ -28,4 +28,19 @@ export class ViewMetadataRepository extends Repository<ViewMetadata> {
28
28
  });
29
29
  return viewMetadata;
30
30
  }
31
+
32
+ async findByTypeModelNameAndModuleName(type: string, modelUserKey: string, moduleUserKey: string): Promise<ViewMetadata | null> {
33
+ const viewMetadata = await this.findOne({
34
+ where: {
35
+ type: type,
36
+ model: {
37
+ singularName: modelUserKey,
38
+ module: {
39
+ name: moduleUserKey
40
+ }
41
+ }
42
+ }
43
+ });
44
+ return viewMetadata;
45
+ }
31
46
  }