@solidstarters/solid-core 1.2.180 → 1.2.184

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 (170) hide show
  1. package/dev-grooming-docs/ozzy-prompts.txt +60 -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 +13 -5
  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 +97 -13
  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/chatter-message.service.d.ts.map +1 -1
  40. package/dist/services/chatter-message.service.js +9 -2
  41. package/dist/services/chatter-message.service.js.map +1 -1
  42. package/dist/services/genai/ingest-metadata.service.d.ts.map +1 -1
  43. package/dist/services/genai/ingest-metadata.service.js +46 -35
  44. package/dist/services/genai/ingest-metadata.service.js.map +1 -1
  45. 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
  46. package/dist/services/genai/mcp-handlers/mcp-handler-factory.service.d.ts.map +1 -0
  47. package/dist/services/{mcp-tool-response-handlers/mcp-tool-response-handler-factory.service.js → genai/mcp-handlers/mcp-handler-factory.service.js} +10 -10
  48. package/dist/services/genai/mcp-handlers/mcp-handler-factory.service.js.map +1 -0
  49. package/dist/services/genai/mcp-handlers/solid-add-fields-to-model-mcp-handler.service.d.ts +12 -0
  50. package/dist/services/genai/mcp-handlers/solid-add-fields-to-model-mcp-handler.service.d.ts.map +1 -0
  51. 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
  52. package/dist/services/genai/mcp-handlers/solid-add-fields-to-model-mcp-handler.service.js.map +1 -0
  53. package/dist/services/genai/mcp-handlers/solid-add-question-to-dashboard-mcp-handler.service.d.ts +12 -0
  54. package/dist/services/genai/mcp-handlers/solid-add-question-to-dashboard-mcp-handler.service.d.ts.map +1 -0
  55. package/dist/services/genai/mcp-handlers/solid-add-question-to-dashboard-mcp-handler.service.js +41 -0
  56. package/dist/services/genai/mcp-handlers/solid-add-question-to-dashboard-mcp-handler.service.js.map +1 -0
  57. package/dist/services/genai/mcp-handlers/solid-add-variable-to-dashboard-mcp-handler.service.d.ts +12 -0
  58. package/dist/services/genai/mcp-handlers/solid-add-variable-to-dashboard-mcp-handler.service.d.ts.map +1 -0
  59. package/dist/services/genai/mcp-handlers/solid-add-variable-to-dashboard-mcp-handler.service.js +42 -0
  60. package/dist/services/genai/mcp-handlers/solid-add-variable-to-dashboard-mcp-handler.service.js.map +1 -0
  61. package/dist/services/genai/mcp-handlers/solid-create-computed-provider-mcp-handler.service.d.ts +16 -0
  62. package/dist/services/genai/mcp-handlers/solid-create-computed-provider-mcp-handler.service.d.ts.map +1 -0
  63. package/dist/services/genai/mcp-handlers/solid-create-computed-provider-mcp-handler.service.js +75 -0
  64. package/dist/services/genai/mcp-handlers/solid-create-computed-provider-mcp-handler.service.js.map +1 -0
  65. 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
  66. package/dist/services/genai/mcp-handlers/solid-create-dashboard-mcp-handler.service.d.ts.map +1 -0
  67. 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} +16 -14
  68. package/dist/services/genai/mcp-handlers/solid-create-dashboard-mcp-handler.service.js.map +1 -0
  69. package/dist/services/genai/mcp-handlers/solid-create-dashboard-question-mcp-handler.service.d.ts +12 -0
  70. package/dist/services/genai/mcp-handlers/solid-create-dashboard-question-mcp-handler.service.d.ts.map +1 -0
  71. 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
  72. package/dist/services/genai/mcp-handlers/solid-create-dashboard-question-mcp-handler.service.js.map +1 -0
  73. 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
  74. package/dist/services/genai/mcp-handlers/solid-create-dashboard-question-sql-dataset-config-mcp-handler.service.d.ts.map +1 -0
  75. 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
  76. package/dist/services/genai/mcp-handlers/solid-create-dashboard-question-sql-dataset-config-mcp-handler.service.js.map +1 -0
  77. package/dist/services/genai/mcp-handlers/solid-create-dashboard-widget-mcp-handler.service.d.ts +12 -0
  78. package/dist/services/genai/mcp-handlers/solid-create-dashboard-widget-mcp-handler.service.d.ts.map +1 -0
  79. 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
  80. package/dist/services/genai/mcp-handlers/solid-create-dashboard-widget-mcp-handler.service.js.map +1 -0
  81. package/dist/services/genai/mcp-handlers/solid-create-model-with-fields-mcp-handler.service.d.ts +14 -0
  82. package/dist/services/genai/mcp-handlers/solid-create-model-with-fields-mcp-handler.service.d.ts.map +1 -0
  83. 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
  84. package/dist/services/genai/mcp-handlers/solid-create-model-with-fields-mcp-handler.service.js.map +1 -0
  85. 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
  86. package/dist/services/genai/mcp-handlers/solid-create-module-mcp-handler.service.d.ts.map +1 -0
  87. 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
  88. package/dist/services/genai/mcp-handlers/solid-create-module-mcp-handler.service.js.map +1 -0
  89. 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
  90. package/dist/services/genai/mcp-handlers/solid-update-layout-mcp-handler.service.d.ts.map +1 -0
  91. 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
  92. package/dist/services/genai/mcp-handlers/solid-update-layout-mcp-handler.service.js.map +1 -0
  93. package/dist/services/import-transaction.service.js +2 -2
  94. package/dist/services/import-transaction.service.js.map +1 -1
  95. package/dist/services/menu-item-metadata.service.d.ts.map +1 -1
  96. package/dist/services/menu-item-metadata.service.js +0 -2
  97. package/dist/services/menu-item-metadata.service.js.map +1 -1
  98. package/dist/services/model-metadata.service.d.ts.map +1 -1
  99. package/dist/services/model-metadata.service.js.map +1 -1
  100. package/dist/services/module-metadata.service.d.ts.map +1 -1
  101. package/dist/services/module-metadata.service.js +1 -1
  102. package/dist/services/module-metadata.service.js.map +1 -1
  103. package/dist/services/role-metadata.service.d.ts.map +1 -1
  104. package/dist/services/role-metadata.service.js +1 -7
  105. package/dist/services/role-metadata.service.js.map +1 -1
  106. package/dist/services/solid-ts-morph.service.d.ts +28 -0
  107. package/dist/services/solid-ts-morph.service.d.ts.map +1 -0
  108. package/dist/services/solid-ts-morph.service.js +222 -0
  109. package/dist/services/solid-ts-morph.service.js.map +1 -0
  110. package/dist/solid-core.module.d.ts.map +1 -1
  111. package/dist/solid-core.module.js +26 -18
  112. package/dist/solid-core.module.js.map +1 -1
  113. package/dist/tsconfig.tsbuildinfo +1 -1
  114. package/package.json +6 -4
  115. package/solid_seed_fixes.ts.txt +93 -0
  116. package/src/config/iam.config.ts +2 -1
  117. package/src/controllers/service.controller.ts +4 -1
  118. package/src/dtos/create-menu-item-metadata.dto.ts +5 -1
  119. package/src/dtos/create-role-metadata.dto.ts +60 -1
  120. package/src/interfaces.ts +29 -2
  121. package/src/jobs/database/trigger-mcp-client-subscriber-database.service.ts +113 -13
  122. package/src/repository/view-metadata.repository.ts +15 -0
  123. package/src/seeders/module-metadata-seeder.service.ts +355 -282
  124. package/src/seeders/permission-metadata-seeder.service.ts +1 -1
  125. package/src/seeders/seed-data/solid-core-metadata.json +3 -5
  126. package/src/services/ai-interaction.service.ts +3 -5
  127. package/src/services/chatter-message.service.ts +11 -3
  128. package/src/services/genai/ingest-metadata.service.ts +115 -39
  129. package/src/services/{mcp-tool-response-handlers/mcp-tool-response-handler-factory.service.ts → genai/mcp-handlers/mcp-handler-factory.service.ts} +5 -5
  130. package/src/services/genai/mcp-handlers/solid-add-fields-to-model-mcp-handler.service.ts +68 -0
  131. package/src/services/genai/mcp-handlers/solid-add-question-to-dashboard-mcp-handler.service.ts +43 -0
  132. package/src/services/genai/mcp-handlers/solid-add-variable-to-dashboard-mcp-handler.service.ts +44 -0
  133. package/src/services/genai/mcp-handlers/solid-create-computed-provider-mcp-handler.service.ts +71 -0
  134. 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} +11 -10
  135. 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
  136. 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
  137. 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
  138. 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
  139. 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
  140. 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
  141. package/src/services/import-transaction.service.ts +2 -2
  142. package/src/services/menu-item-metadata.service.ts +3 -7
  143. package/src/services/model-metadata.service.ts +0 -3
  144. package/src/services/module-metadata.service.ts +2 -3
  145. package/src/services/role-metadata.service.ts +22 -8
  146. package/src/services/solid-ts-morph.service.ts +263 -0
  147. package/src/solid-core.module.ts +29 -19
  148. package/dist/services/mcp-tool-response-handlers/mcp-tool-response-handler-factory.service.d.ts.map +0 -1
  149. package/dist/services/mcp-tool-response-handlers/mcp-tool-response-handler-factory.service.js.map +0 -1
  150. package/dist/services/mcp-tool-response-handlers/solid-add-field-mcp-tool-response-handler.service.d.ts +0 -16
  151. package/dist/services/mcp-tool-response-handlers/solid-add-field-mcp-tool-response-handler.service.d.ts.map +0 -1
  152. package/dist/services/mcp-tool-response-handlers/solid-add-field-mcp-tool-response-handler.service.js.map +0 -1
  153. package/dist/services/mcp-tool-response-handlers/solid-create-dashboard-mcp-tool-response-handler.service.d.ts.map +0 -1
  154. package/dist/services/mcp-tool-response-handlers/solid-create-dashboard-mcp-tool-response-handler.service.js.map +0 -1
  155. package/dist/services/mcp-tool-response-handlers/solid-create-dashboard-question-mcp-tool-response-handler.service.d.ts +0 -12
  156. package/dist/services/mcp-tool-response-handlers/solid-create-dashboard-question-mcp-tool-response-handler.service.d.ts.map +0 -1
  157. package/dist/services/mcp-tool-response-handlers/solid-create-dashboard-question-mcp-tool-response-handler.service.js.map +0 -1
  158. package/dist/services/mcp-tool-response-handlers/solid-create-dashboard-question-sql-dataset-config-mcp-tool-response-handler.service.d.ts.map +0 -1
  159. package/dist/services/mcp-tool-response-handlers/solid-create-dashboard-question-sql-dataset-config-mcp-tool-response-handler.service.js.map +0 -1
  160. package/dist/services/mcp-tool-response-handlers/solid-create-dashboard-widget-mcp-tool-response-handler.service.d.ts +0 -12
  161. package/dist/services/mcp-tool-response-handlers/solid-create-dashboard-widget-mcp-tool-response-handler.service.d.ts.map +0 -1
  162. package/dist/services/mcp-tool-response-handlers/solid-create-dashboard-widget-mcp-tool-response-handler.service.js.map +0 -1
  163. package/dist/services/mcp-tool-response-handlers/solid-create-model-with-fields-mcp-tool-response-handler.service.d.ts +0 -16
  164. package/dist/services/mcp-tool-response-handlers/solid-create-model-with-fields-mcp-tool-response-handler.service.d.ts.map +0 -1
  165. package/dist/services/mcp-tool-response-handlers/solid-create-model-with-fields-mcp-tool-response-handler.service.js.map +0 -1
  166. package/dist/services/mcp-tool-response-handlers/solid-create-module-mcp-tool-response-handler.service.d.ts.map +0 -1
  167. package/dist/services/mcp-tool-response-handlers/solid-create-module-mcp-tool-response-handler.service.js.map +0 -1
  168. package/dist/services/mcp-tool-response-handlers/solid-save-model-layout-mcp-tool-response-handler.service.d.ts.map +0 -1
  169. package/dist/services/mcp-tool-response-handlers/solid-save-model-layout-mcp-tool-response-handler.service.js.map +0 -1
  170. 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.184",
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,13 +1,17 @@
1
1
  import { Injectable, Logger } from '@nestjs/common';
2
-
2
+ import { ModelMetadataService } from 'src';
3
+ import { SolidRegistry } from 'src/helpers/solid-registry';
3
4
  import { QueueMessage } from 'src/interfaces/mq';
4
- import { MqMessageService } from '../../services/mq-message.service';
5
- import { MqMessageQueueService } from '../../services/mq-message-queue.service';
6
- import { McpResponse, QueuesModuleOptions, TriggerMcpClientOptions } from "../../interfaces";
7
- import { DatabaseSubscriber } from 'src/services/queues/database-subscriber.service';
8
- import triggerMcpClientQueueOptions from "./trigger-mcp-client-queue-options";
5
+ import { DashboardRepository } from 'src/repository/dashboard.repository';
9
6
  import { AiInteractionService } from 'src/services/ai-interaction.service';
7
+ import { ModuleMetadataService } from 'src/services/module-metadata.service';
10
8
  import { PollerService } from 'src/services/poller.service';
9
+ import { DatabaseSubscriber } from 'src/services/queues/database-subscriber.service';
10
+ import { Not } from 'typeorm';
11
+ import { McpResponse, QueuesModuleOptions, TriggerMcpClientOptions } from "../../interfaces";
12
+ import { MqMessageQueueService } from '../../services/mq-message-queue.service';
13
+ import { MqMessageService } from '../../services/mq-message.service';
14
+ import triggerMcpClientQueueOptions from "./trigger-mcp-client-queue-options";
11
15
 
12
16
  @Injectable()
13
17
  export class TriggerMcpClientSubscriberDatabase extends DatabaseSubscriber<TriggerMcpClientOptions> {
@@ -18,6 +22,12 @@ export class TriggerMcpClientSubscriberDatabase extends DatabaseSubscriber<Trigg
18
22
  readonly mqMessageQueueService: MqMessageQueueService,
19
23
  readonly poller: PollerService,
20
24
  readonly aiInteractionService: AiInteractionService,
25
+ readonly moduleMetadataService: ModuleMetadataService,
26
+ readonly modelMetadataService: ModelMetadataService,
27
+ private readonly solidRegistry: SolidRegistry,
28
+ // private readonly dashboardService: DashboardService
29
+ private readonly dashboardRepository: DashboardRepository
30
+
21
31
  ) {
22
32
  super(mqMessageService, mqMessageQueueService, poller);
23
33
  }
@@ -95,23 +105,111 @@ export class TriggerMcpClientSubscriberDatabase extends DatabaseSubscriber<Trigg
95
105
  status: 'pending' // Updated after we receive the response
96
106
  });
97
107
 
108
+ const existingComputationProviders = this.solidRegistry.getComputedFieldProviders();
109
+
110
+ const { records: existingModules } = await this.moduleMetadataService.findMany({
111
+ filters: {
112
+ name: { $ne: 'solid-core' }
113
+ },
114
+ fields: ['id', 'name', 'displayName', 'description'],
115
+ limit: 1000
116
+ });
117
+ const { records: existingModels } = await this.modelMetadataService.findMany({
118
+ filters: {
119
+ module: {
120
+ name: {
121
+ $ne: 'solid-core',
122
+ }
123
+ }
124
+ },
125
+ limit: 1000,
126
+ populate: ['module']
127
+ });
128
+
129
+ // Get the list of dashboards
130
+ //TODO: Ideally we should fetch dashboard like below, but used below approach to avoid below CLS issues for now.
131
+ // Cannot set the key "filter". No CLS context available, please make sure that a ClsMiddleware/Guard/Interceptor has set up the context, or wrap any calls that depend on CLS with "ClsService#run"
132
+ // const { records: existingDashboards } = await this.dashboardService.find({
133
+ // fields
134
+ // })
135
+ const existingDashboards = await this.dashboardRepository.find(
136
+ {
137
+ where: {
138
+ module: {
139
+ name: Not('solid-core')
140
+ }
141
+ },
142
+ }
143
+ );
144
+
145
+ // Build markdown sections using template interpolation
146
+ const modulesSection = (existingModules ?? [])
147
+ .map(m => [
148
+ `### ${m.displayName}`,
149
+ `- name: ${m.name}`,
150
+ `- description: ${m.description ?? ""}`,
151
+ ].join('\n'))
152
+ .join('\n\n');
153
+
154
+ const modelsSection = (existingModels ?? [])
155
+ .map(m => [
156
+ `### ${m.displayName}`,
157
+ `- singularName: ${m.singularName}`,
158
+ `- description: ${m.description ?? ""}`,
159
+ `- moduleName: ${m.module.name}`,
160
+ ].join('\n'))
161
+ .join('\n\n');
162
+
163
+ const dashboardsSection = (existingDashboards ?? [])
164
+ .map(d => [
165
+ `### ${d.displayName}`,
166
+ `- name: ${d.name}`,
167
+ `- description: ${d.description ?? ""}`,
168
+ ].join('\n'))
169
+ .join('\n\n');
170
+
171
+ const computationProvidersSection = (existingComputationProviders ?? [])
172
+ .map(m => [
173
+ `### ${m.instance.name()}`,
174
+ `- name: ${m.instance.name()}`,
175
+ `- description: ${m.instance.help() ?? ""}`,
176
+ ].join('\n'))
177
+ .join('\n\n');
178
+
179
+
98
180
  const finalPrompt = `
99
181
  # User Prompt:
100
182
  ${prompt}
101
183
 
102
184
  # System Instructions:
103
185
  - aiInteractionId: ${genAiInteraction.id}
104
- - moduleName:${message.payload.moduleName}
105
- - You will be invoking tools if needed.
186
+ - 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
187
  - 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
188
  - Do not wrap the result in quotes, JSON, or markdown fences.
108
189
  - Do not explain what the result means.
109
190
 
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.
191
+ # LISTS FOR REFERENCE AND VALIDATIONS
113
192
 
114
- `
193
+ ## LIST OF EXISTING MODULES
194
+ 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.
195
+
196
+ ${modulesSection}
197
+
198
+ ## LIST OF EXISTING MODELS
199
+ Use the below list of modules to infer which module the user is referring to.
200
+
201
+ ${modelsSection}
202
+
203
+ ## LIST OF EXISTING DASHBOARDS
204
+ Use the below list of dashboards to infer which dashboard the user is referring to.
205
+
206
+ ${dashboardsSection}
207
+
208
+ ## LIST OF EXISTING COMPUTED FIELD PROVIDERS
209
+ Use the below list of computed field providers to infer which provider the user is referring to.
210
+
211
+ ${computationProvidersSection}
212
+ `.trim();
115
213
 
116
214
  const aiResponse = await this.aiInteractionService.runMcpPrompt(finalPrompt);
117
215
  this.triggerMcpClientSubscriberLogger.log(`aiResponse: `);
@@ -170,7 +268,9 @@ Use these interactions to further identify concerns based on the current User Pr
170
268
  // });
171
269
 
172
270
  // 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 ');
271
+ const errorsStr = nestedResponse?.status == "error" && nestedResponse?.errors.join('\n ');
272
+ // const errorTrace = nestedResponse?.status == "error" && nestedResponse?.error_trace?.join('\n');
273
+
174
274
 
175
275
  await this.aiInteractionService.update(genAiInteraction.id, {
176
276
  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
  }