@solidstarters/solid-core 1.2.179 → 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 (166) 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 +8 -1
  6. package/dist/controllers/service.controller.d.ts.map +1 -1
  7. package/dist/controllers/service.controller.js +38 -2
  8. package/dist/controllers/service.controller.js.map +1 -1
  9. package/dist/decorators/active-user.decorator.d.ts +1 -1
  10. package/dist/dtos/create-menu-item-metadata.dto.d.ts +3 -0
  11. package/dist/dtos/create-menu-item-metadata.dto.d.ts.map +1 -1
  12. package/dist/dtos/create-menu-item-metadata.dto.js +4 -1
  13. package/dist/dtos/create-menu-item-metadata.dto.js.map +1 -1
  14. package/dist/dtos/create-role-metadata.dto.d.ts +4 -0
  15. package/dist/dtos/create-role-metadata.dto.d.ts.map +1 -1
  16. package/dist/dtos/create-role-metadata.dto.js +45 -1
  17. package/dist/dtos/create-role-metadata.dto.js.map +1 -1
  18. package/dist/helpers/date.helper.d.ts +2 -0
  19. package/dist/helpers/date.helper.d.ts.map +1 -0
  20. package/dist/helpers/date.helper.js +18 -0
  21. package/dist/helpers/date.helper.js.map +1 -0
  22. package/dist/interfaces.d.ts +20 -0
  23. package/dist/interfaces.d.ts.map +1 -1
  24. package/dist/interfaces.js.map +1 -1
  25. package/dist/jobs/database/trigger-mcp-client-subscriber-database.service.d.ts +7 -1
  26. package/dist/jobs/database/trigger-mcp-client-subscriber-database.service.d.ts.map +1 -1
  27. package/dist/jobs/database/trigger-mcp-client-subscriber-database.service.js +82 -17
  28. package/dist/jobs/database/trigger-mcp-client-subscriber-database.service.js.map +1 -1
  29. package/dist/repository/view-metadata.repository.d.ts +1 -0
  30. package/dist/repository/view-metadata.repository.d.ts.map +1 -1
  31. package/dist/repository/view-metadata.repository.js +14 -0
  32. package/dist/repository/view-metadata.repository.js.map +1 -1
  33. package/dist/seeders/module-metadata-seeder.service.d.ts +52 -42
  34. package/dist/seeders/module-metadata-seeder.service.d.ts.map +1 -1
  35. package/dist/seeders/module-metadata-seeder.service.js +259 -202
  36. package/dist/seeders/module-metadata-seeder.service.js.map +1 -1
  37. package/dist/seeders/permission-metadata-seeder.service.js +0 -1
  38. package/dist/seeders/permission-metadata-seeder.service.js.map +1 -1
  39. package/dist/seeders/seed-data/solid-core-metadata.json +2 -3
  40. package/dist/services/ai-interaction.service.d.ts +3 -3
  41. package/dist/services/ai-interaction.service.d.ts.map +1 -1
  42. package/dist/services/ai-interaction.service.js +16 -9
  43. package/dist/services/ai-interaction.service.js.map +1 -1
  44. package/dist/services/excel.service.js +2 -2
  45. package/dist/services/excel.service.js.map +1 -1
  46. package/dist/services/genai/ingest-metadata.service.d.ts.map +1 -1
  47. package/dist/services/genai/ingest-metadata.service.js +46 -35
  48. package/dist/services/genai/ingest-metadata.service.js.map +1 -1
  49. 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
  50. package/dist/services/genai/mcp-handlers/mcp-handler-factory.service.d.ts.map +1 -0
  51. package/dist/services/{mcp-tool-response-handlers/mcp-tool-response-handler-factory.service.js → genai/mcp-handlers/mcp-handler-factory.service.js} +10 -10
  52. package/dist/services/genai/mcp-handlers/mcp-handler-factory.service.js.map +1 -0
  53. package/dist/services/genai/mcp-handlers/solid-add-fields-to-model-mcp-handler.service.d.ts +12 -0
  54. package/dist/services/genai/mcp-handlers/solid-add-fields-to-model-mcp-handler.service.d.ts.map +1 -0
  55. 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
  56. package/dist/services/genai/mcp-handlers/solid-add-fields-to-model-mcp-handler.service.js.map +1 -0
  57. package/dist/services/genai/mcp-handlers/solid-create-computed-provider-mcp-handler.service.d.ts +16 -0
  58. package/dist/services/genai/mcp-handlers/solid-create-computed-provider-mcp-handler.service.d.ts.map +1 -0
  59. package/dist/services/genai/mcp-handlers/solid-create-computed-provider-mcp-handler.service.js +75 -0
  60. package/dist/services/genai/mcp-handlers/solid-create-computed-provider-mcp-handler.service.js.map +1 -0
  61. 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
  62. package/dist/services/genai/mcp-handlers/solid-create-dashboard-mcp-handler.service.d.ts.map +1 -0
  63. 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
  64. package/dist/services/genai/mcp-handlers/solid-create-dashboard-mcp-handler.service.js.map +1 -0
  65. package/dist/services/genai/mcp-handlers/solid-create-dashboard-question-mcp-handler.service.d.ts +12 -0
  66. package/dist/services/genai/mcp-handlers/solid-create-dashboard-question-mcp-handler.service.d.ts.map +1 -0
  67. 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
  68. package/dist/services/genai/mcp-handlers/solid-create-dashboard-question-mcp-handler.service.js.map +1 -0
  69. 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
  70. package/dist/services/genai/mcp-handlers/solid-create-dashboard-question-sql-dataset-config-mcp-handler.service.d.ts.map +1 -0
  71. 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
  72. package/dist/services/genai/mcp-handlers/solid-create-dashboard-question-sql-dataset-config-mcp-handler.service.js.map +1 -0
  73. package/dist/services/genai/mcp-handlers/solid-create-dashboard-widget-mcp-handler.service.d.ts +12 -0
  74. package/dist/services/genai/mcp-handlers/solid-create-dashboard-widget-mcp-handler.service.d.ts.map +1 -0
  75. 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
  76. package/dist/services/genai/mcp-handlers/solid-create-dashboard-widget-mcp-handler.service.js.map +1 -0
  77. package/dist/services/genai/mcp-handlers/solid-create-model-with-fields-mcp-handler.service.d.ts +14 -0
  78. package/dist/services/genai/mcp-handlers/solid-create-model-with-fields-mcp-handler.service.d.ts.map +1 -0
  79. 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} +15 -17
  80. package/dist/services/genai/mcp-handlers/solid-create-model-with-fields-mcp-handler.service.js.map +1 -0
  81. 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
  82. package/dist/services/genai/mcp-handlers/solid-create-module-mcp-handler.service.d.ts.map +1 -0
  83. 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
  84. package/dist/services/genai/mcp-handlers/solid-create-module-mcp-handler.service.js.map +1 -0
  85. 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
  86. package/dist/services/genai/mcp-handlers/solid-update-layout-mcp-handler.service.d.ts.map +1 -0
  87. 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
  88. package/dist/services/genai/mcp-handlers/solid-update-layout-mcp-handler.service.js.map +1 -0
  89. package/dist/services/import-transaction.service.d.ts.map +1 -1
  90. package/dist/services/import-transaction.service.js +6 -3
  91. package/dist/services/import-transaction.service.js.map +1 -1
  92. package/dist/services/menu-item-metadata.service.d.ts.map +1 -1
  93. package/dist/services/menu-item-metadata.service.js +0 -2
  94. package/dist/services/menu-item-metadata.service.js.map +1 -1
  95. package/dist/services/model-metadata.service.d.ts.map +1 -1
  96. package/dist/services/model-metadata.service.js.map +1 -1
  97. package/dist/services/module-metadata.service.d.ts.map +1 -1
  98. package/dist/services/module-metadata.service.js +1 -1
  99. package/dist/services/module-metadata.service.js.map +1 -1
  100. package/dist/services/role-metadata.service.d.ts.map +1 -1
  101. package/dist/services/role-metadata.service.js +1 -7
  102. package/dist/services/role-metadata.service.js.map +1 -1
  103. package/dist/services/solid-ts-morph.service.d.ts +28 -0
  104. package/dist/services/solid-ts-morph.service.d.ts.map +1 -0
  105. package/dist/services/solid-ts-morph.service.js +222 -0
  106. package/dist/services/solid-ts-morph.service.js.map +1 -0
  107. package/dist/solid-core.module.d.ts.map +1 -1
  108. package/dist/solid-core.module.js +22 -18
  109. package/dist/solid-core.module.js.map +1 -1
  110. package/dist/tsconfig.tsbuildinfo +1 -1
  111. package/package.json +7 -4
  112. package/solid_seed_fixes.ts.txt +93 -0
  113. package/src/config/iam.config.ts +2 -1
  114. package/src/controllers/service.controller.ts +43 -2
  115. package/src/dtos/create-menu-item-metadata.dto.ts +5 -1
  116. package/src/dtos/create-role-metadata.dto.ts +60 -1
  117. package/src/helpers/date.helper.ts +13 -0
  118. package/src/interfaces.ts +29 -2
  119. package/src/jobs/database/trigger-mcp-client-subscriber-database.service.ts +86 -16
  120. package/src/repository/view-metadata.repository.ts +15 -0
  121. package/src/seeders/module-metadata-seeder.service.ts +355 -282
  122. package/src/seeders/permission-metadata-seeder.service.ts +1 -1
  123. package/src/seeders/seed-data/solid-core-metadata.json +3 -5
  124. package/src/services/ai-interaction.service.ts +17 -13
  125. package/src/services/excel.service.ts +2 -2
  126. package/src/services/genai/ingest-metadata.service.ts +115 -39
  127. package/src/services/{mcp-tool-response-handlers/mcp-tool-response-handler-factory.service.ts → genai/mcp-handlers/mcp-handler-factory.service.ts} +5 -5
  128. package/src/services/genai/mcp-handlers/solid-add-fields-to-model-mcp-handler.service.ts +68 -0
  129. package/src/services/genai/mcp-handlers/solid-create-computed-provider-mcp-handler.service.ts +71 -0
  130. 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
  131. 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
  132. 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
  133. 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
  134. 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} +9 -10
  135. 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
  136. 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
  137. package/src/services/import-transaction.service.ts +12 -4
  138. package/src/services/menu-item-metadata.service.ts +3 -7
  139. package/src/services/model-metadata.service.ts +0 -3
  140. package/src/services/module-metadata.service.ts +2 -3
  141. package/src/services/role-metadata.service.ts +22 -8
  142. package/src/services/solid-ts-morph.service.ts +263 -0
  143. package/src/solid-core.module.ts +25 -19
  144. package/dist/services/mcp-tool-response-handlers/mcp-tool-response-handler-factory.service.d.ts.map +0 -1
  145. package/dist/services/mcp-tool-response-handlers/mcp-tool-response-handler-factory.service.js.map +0 -1
  146. package/dist/services/mcp-tool-response-handlers/solid-add-field-mcp-tool-response-handler.service.d.ts +0 -16
  147. package/dist/services/mcp-tool-response-handlers/solid-add-field-mcp-tool-response-handler.service.d.ts.map +0 -1
  148. package/dist/services/mcp-tool-response-handlers/solid-add-field-mcp-tool-response-handler.service.js.map +0 -1
  149. package/dist/services/mcp-tool-response-handlers/solid-create-dashboard-mcp-tool-response-handler.service.d.ts.map +0 -1
  150. package/dist/services/mcp-tool-response-handlers/solid-create-dashboard-mcp-tool-response-handler.service.js.map +0 -1
  151. package/dist/services/mcp-tool-response-handlers/solid-create-dashboard-question-mcp-tool-response-handler.service.d.ts +0 -12
  152. package/dist/services/mcp-tool-response-handlers/solid-create-dashboard-question-mcp-tool-response-handler.service.d.ts.map +0 -1
  153. package/dist/services/mcp-tool-response-handlers/solid-create-dashboard-question-mcp-tool-response-handler.service.js.map +0 -1
  154. package/dist/services/mcp-tool-response-handlers/solid-create-dashboard-question-sql-dataset-config-mcp-tool-response-handler.service.d.ts.map +0 -1
  155. package/dist/services/mcp-tool-response-handlers/solid-create-dashboard-question-sql-dataset-config-mcp-tool-response-handler.service.js.map +0 -1
  156. package/dist/services/mcp-tool-response-handlers/solid-create-dashboard-widget-mcp-tool-response-handler.service.d.ts +0 -12
  157. package/dist/services/mcp-tool-response-handlers/solid-create-dashboard-widget-mcp-tool-response-handler.service.d.ts.map +0 -1
  158. package/dist/services/mcp-tool-response-handlers/solid-create-dashboard-widget-mcp-tool-response-handler.service.js.map +0 -1
  159. package/dist/services/mcp-tool-response-handlers/solid-create-model-with-fields-mcp-tool-response-handler.service.d.ts +0 -16
  160. package/dist/services/mcp-tool-response-handlers/solid-create-model-with-fields-mcp-tool-response-handler.service.d.ts.map +0 -1
  161. package/dist/services/mcp-tool-response-handlers/solid-create-model-with-fields-mcp-tool-response-handler.service.js.map +0 -1
  162. package/dist/services/mcp-tool-response-handlers/solid-create-module-mcp-tool-response-handler.service.d.ts.map +0 -1
  163. package/dist/services/mcp-tool-response-handlers/solid-create-module-mcp-tool-response-handler.service.js.map +0 -1
  164. package/dist/services/mcp-tool-response-handlers/solid-save-model-layout-mcp-tool-response-handler.service.d.ts.map +0 -1
  165. package/dist/services/mcp-tool-response-handlers/solid-save-model-layout-mcp-tool-response-handler.service.js.map +0 -1
  166. 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.179",
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",
@@ -49,6 +49,7 @@
49
49
  "cache-manager-redis-store": "^3.0.1",
50
50
  "class-transformer": "^0.5.1",
51
51
  "class-validator": "^0.14.1",
52
+ "dayjs": "^1.11.18",
52
53
  "exceljs": "^4.4.0",
53
54
  "fast-csv": "^5.0.2",
54
55
  "handlebars": "^4.7.8",
@@ -69,9 +70,9 @@
69
70
  "pluralize": "^8.0.0",
70
71
  "puppeteer": "^23.2.0",
71
72
  "r2r-js": "^0.4.43",
72
- "reflect-metadata": "^0.1.13",
73
73
  "rxjs": "^7.8.1",
74
74
  "swagger-ui-express": "^5.0.0",
75
+ "ts-morph": "^27.0.2",
75
76
  "twilio": "^5.8.0",
76
77
  "uuid": "^9.0.1",
77
78
  "xlsx": "^0.18.5"
@@ -96,7 +97,8 @@
96
97
  "nestjs-cls": "^5.4.3",
97
98
  "typeorm": "^0.3.20",
98
99
  "typeorm-naming-strategies": "^4.1.0",
99
- "winston": "^3.17.0"
100
+ "winston": "^3.17.0",
101
+ "reflect-metadata": "^0.2.2"
100
102
  },
101
103
  "devDependencies": {
102
104
  "@angular-devkit/schematics": "^19.2.6",
@@ -151,7 +153,8 @@
151
153
  "typeorm": "^0.3.20",
152
154
  "typeorm-naming-strategies": "^4.1.0",
153
155
  "typescript": "^5.1.3",
154
- "winston": "^3.17.0"
156
+ "winston": "^3.17.0",
157
+ "reflect-metadata": "^0.2.2"
155
158
  },
156
159
  "jest": {
157
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
  });
@@ -5,10 +5,14 @@ import { Public } from 'src/decorators/public.decorator';
5
5
  import { ErrorMapperService } from 'src/helpers/error-mapper.service';
6
6
  import { ActiveUserData } from 'src/interfaces/active-user-data.interface';
7
7
  import { AiInteractionService } from 'src/services/ai-interaction.service';
8
+ import { IngestMetadataService } from 'src/services/genai/ingest-metadata.service';
8
9
  import { MqMessageService } from 'src/services/mq-message.service';
9
10
  import { SolidRegistry } from '../helpers/solid-registry';
10
11
 
11
-
12
+ export interface PostProcessCodeGenConfig {
13
+ runModuleMetadataSeeder?: boolean; // If true, regenerate module metadata
14
+ runSolidIngestion?: boolean; // If true, run solid ingestion command
15
+ }
12
16
  @Controller('')
13
17
  @ApiTags("Common")
14
18
  // @UseGuards(ThrottlerGuard)
@@ -20,7 +24,9 @@ export class ServiceController {
20
24
  private readonly solidRegistry: SolidRegistry,
21
25
  private readonly aiInteractionService: AiInteractionService,
22
26
  private readonly mqMessageService: MqMessageService,
23
- private readonly errorMapper: ErrorMapperService
27
+ private readonly errorMapper: ErrorMapperService,
28
+ private readonly ingestMetadataService: IngestMetadataService,
29
+
24
30
  ) { }
25
31
 
26
32
  @Public()
@@ -103,6 +109,41 @@ export class ServiceController {
103
109
  return { message: `seed data for ${seedData.seeder}` };
104
110
  }
105
111
 
112
+ @ApiBearerAuth("jwt")
113
+ @Post('code-generation/post-process')
114
+ async postProcessCodeGeneration(@Body() config : PostProcessCodeGenConfig) {
115
+ // Set defaults if not provided
116
+ config.runModuleMetadataSeeder = config.runModuleMetadataSeeder ?? true;
117
+ config.runSolidIngestion = config.runSolidIngestion ?? true;
118
+
119
+ // Run the Module Metadata Seeder Service
120
+ if (config.runModuleMetadataSeeder) {
121
+ this.logger.debug(`Running the Module Metadata Seeder Service as part of post-process code generation`);
122
+ const seeder = this.solidRegistry
123
+ .getSeeders()
124
+ .filter((seeder) => seeder.name === 'ModuleMetadataSeederService')
125
+ .map((seeder) => seeder.instance)
126
+ .pop();
127
+ if (!seeder) {
128
+ this.logger.error(`Seeder service ModuleMetadataSeederService not found. Does your service have a seed() method?`);
129
+ } else {
130
+ await seeder.seed();
131
+ }
132
+ } else {
133
+ this.logger.debug(`Skipping the Module Metadata Seeder Service as part of post-process code generation`);
134
+ }
135
+
136
+ // Run the Solid ingestion command
137
+ if (config.runSolidIngestion) {
138
+ this.logger.debug(`Running the Solid ingestion command as part of post-process code generation`);
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();
143
+ }
144
+ }
145
+
146
+
106
147
  // @Public()
107
148
  // @Get('play')
108
149
  // play() {
@@ -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
+ ]
@@ -0,0 +1,13 @@
1
+ import dayjs from 'dayjs';
2
+
3
+
4
+ export function parseFlexibleDate(value: string): Date | null {
5
+ if (!value) return null;
6
+ const formats = ['DD-MM-YYYY', 'YYYY-MM-DD'];
7
+ const parsed = dayjs(value, formats, true); // true = strict parsing
8
+ if (!parsed.isValid()) {
9
+ return null;
10
+ }
11
+ return parsed.toDate();
12
+ }
13
+
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,19 +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
- # User Prompt:
100
- ${prompt}
101
-
102
- # System Instructions:
103
- - aiInteractionId: ${genAiInteraction.id}
104
- - moduleName:${message.payload.moduleName}
105
- - You will be invoking tools if needed.
106
- - If a tool is invoked, you must return **exactly** the raw output from the tool, without any additional formatting, commentary, or text.
107
- - Do not wrap the result in quotes, JSON, or markdown fences.
108
- - Do not explain what the result means.
109
- - Your final response must be identical to the tool output.
110
- `
152
+ # User Prompt:
153
+ ${prompt}
154
+
155
+ # System Instructions:
156
+ - aiInteractionId: ${genAiInteraction.id}
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.
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.
159
+ - Do not wrap the result in quotes, JSON, or markdown fences.
160
+ - Do not explain what the result means.
161
+
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}
168
+
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();
111
179
 
112
180
  const aiResponse = await this.aiInteractionService.runMcpPrompt(finalPrompt);
113
181
  this.triggerMcpClientSubscriberLogger.log(`aiResponse: `);
@@ -116,8 +184,8 @@ export class TriggerMcpClientSubscriberDatabase extends DatabaseSubscriber<Trigg
116
184
  if (!aiResponse.success) {
117
185
  this.triggerMcpClientSubscriberLogger.log(`Gen ai has returned with a false status code`);
118
186
 
119
- const errorsStr = aiResponse.errors.join('\n ');
120
- const errorTrace = aiResponse.error_trace.join('\n');
187
+ const errorsStr = aiResponse.errors?.join('\n ');
188
+ const errorTrace = aiResponse.error_trace?.join('\n');
121
189
 
122
190
  // await this.aiInteractionService.create({
123
191
  // userId: aiInteraction.user.id,
@@ -166,7 +234,9 @@ export class TriggerMcpClientSubscriberDatabase extends DatabaseSubscriber<Trigg
166
234
  // });
167
235
 
168
236
  // TODO: Update the previously created genAiInteraction record with the respective success fields and save to DB
169
- 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
+
170
240
 
171
241
  await this.aiInteractionService.update(genAiInteraction.id, {
172
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
  }