@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
@@ -1,10 +1,10 @@
1
1
  import { Injectable } from "@nestjs/common";
2
2
  import { AiInteraction } from "src/entities/ai-interaction.entity";
3
3
  import { ViewMetadataRepository } from "src/repository/view-metadata.repository";
4
- import { IMcpToolResponseHandler } from "../../interfaces";
4
+ import { IMcpToolResponseHandler } from "../../../interfaces";
5
5
 
6
6
  @Injectable()
7
- export class SolidCreateModelLayoutMcpToolResponseHandler implements IMcpToolResponseHandler {
7
+ export class SolidUpdateLayoutMcpHandler implements IMcpToolResponseHandler {
8
8
 
9
9
  constructor(
10
10
  private readonly viewMetadataRepository: ViewMetadataRepository,
@@ -12,15 +12,21 @@ export class SolidCreateModelLayoutMcpToolResponseHandler implements IMcpToolRes
12
12
  }
13
13
 
14
14
  async apply(aiInteraction: AiInteraction) {
15
- const aiResponse = JSON.parse(aiInteraction.message);
15
+ // const aiResponse = JSON.parse(aiInteraction.message);
16
+ const escapedMessage = aiInteraction.message.replace(/\\'/g, "'");
17
+ const aiResponseMessage = JSON.parse(escapedMessage);
16
18
 
17
19
  // Get the data for resolving the view metadata
18
- const {name, modelUserKey, moduleUserKey, layout} = aiResponse;
20
+ const { data } = aiResponseMessage;
21
+ const { moduleUserKey, modelUserKey, view, schema: layout } = data;
19
22
 
20
23
  // Fetch the view metadata for the given model and module and the view name
21
- const viewMetadata = await this.viewMetadataRepository.findByNameAndModelNameAndModuleName(name, modelUserKey, moduleUserKey);
24
+ const viewMetadata = await this.viewMetadataRepository.findByTypeModelNameAndModuleName(view, modelUserKey, moduleUserKey);
25
+
26
+ // TODO: Validation to check if we were able to resolve the right view.
22
27
 
23
28
  viewMetadata.layout = JSON.stringify(layout);
29
+
24
30
  // Save the updated view metadata
25
31
  await this.viewMetadataRepository.save(viewMetadata);
26
32
 
@@ -26,6 +26,7 @@ import { CsvService } from './csv.service';
26
26
  import { ExcelService } from './excel.service';
27
27
  import { SolidIntrospectService } from './solid-introspect.service';
28
28
  import { ERROR_MESSAGES } from 'src/constants/error-messages';
29
+ import { parseFlexibleDate } from 'src/helpers/date.helper';
29
30
 
30
31
  interface ImportTemplateFileInfo {
31
32
  stream: NodeJS.ReadableStream;
@@ -657,10 +658,17 @@ export class ImportTransactionService extends CRUDService<ImportTransaction> {
657
658
  dtoRecord[fieldMetadata.name] = null; // If the cell is empty, set the field to null
658
659
  return dtoRecord;
659
660
  }
660
- const dateValue = new Date(cellValue);
661
- if (isNaN(dateValue.getTime())) {
662
- throw new Error(`Invalid date value for cell ${key} with value ${record[key]}`);
663
- }
661
+ // Use flexible date parser
662
+ this.logger.verbose(cellValue,'cellValue');
663
+
664
+ const dateValue = parseFlexibleDate(cellValue);
665
+ this.logger.verbose(dateValue,'dateValue');
666
+
667
+ if (!dateValue) {
668
+ throw new Error(
669
+ `Invalid date value for cell ${key} with value ${cellValue}`
670
+ );
671
+ }
664
672
  dtoRecord[fieldMetadata.name] = dateValue;
665
673
  return dtoRecord;
666
674
  }
@@ -60,10 +60,9 @@ export class MenuItemMetadataService extends CRUDService<MenuItemMetadata> {
60
60
 
61
61
  // if found
62
62
  if (existingMenuItem) {
63
- const updatedSolidActionDto = { ...existingMenuItem, ...cleanUpdateSolidMenuItemDto };
64
- // @ts-ignore
65
- return this.repo.save(updatedSolidActionDto);
66
- // await this.repo.remove(existingSolidAction);
63
+ // TODO: This is very slow disabling this for now..
64
+ // const updatedSolidActionDto = { ...existingMenuItem, ...cleanUpdateSolidMenuItemDto };
65
+ // return this.repo.save(updatedSolidActionDto);
67
66
  }
68
67
  // if not found - create new
69
68
  else {
@@ -71,9 +70,6 @@ export class MenuItemMetadataService extends CRUDService<MenuItemMetadata> {
71
70
  const moduleMetadata = this.repo.create(cleanUpdateSolidMenuItemDto);
72
71
  return this.repo.save(moduleMetadata);
73
72
  }
74
- // const moduleMetadata = this.repo.create(updateSolidMenuItemDto);
75
- // return this.repo.save(moduleMetadata);
76
-
77
73
  }
78
74
 
79
75
 
@@ -1172,7 +1172,6 @@ export class ModelMetadataService {
1172
1172
  return `${refreshOuput}`;
1173
1173
  }
1174
1174
 
1175
-
1176
1175
  private async executeRefreshModelCommand(model: ModelMetadata, dryRun: boolean = false): Promise<string> {
1177
1176
  const fieldsForRefresh = model.fields.filter((field) => !field.isMarkedForRemoval);
1178
1177
  const output = await this.schematicService.executeSchematicCommand(
@@ -1264,5 +1263,3 @@ export class ModelMetadataService {
1264
1263
  }
1265
1264
 
1266
1265
  }
1267
-
1268
-
@@ -119,6 +119,7 @@ export class ModuleMetadataService {
119
119
  throw error;
120
120
  }
121
121
  }
122
+
122
123
  async createInDB(manager: EntityManager, createDto: CreateModuleMetadataDto, files: Express.Multer.File[] = []) {
123
124
  if (files.length > 0) {
124
125
  const fileStoragePath = this.getFileSysytemFullFilePath(this.getFileName(files[0]));
@@ -287,7 +288,7 @@ export class ModuleMetadataService {
287
288
  }
288
289
 
289
290
  async upsert(updateModuleMetadataDto: UpdateModuleMetadataDto) {
290
- this.logger.log(`Module Upsert called for : ${updateModuleMetadataDto.name}`);
291
+ this.logger.debug(`Module Upsert called for : ${updateModuleMetadataDto.name}`);
291
292
  // First check if module already exists using name
292
293
  const existingModuleMetadata = await this.moduleMetadataRepo.findOne({
293
294
  where: {
@@ -408,8 +409,6 @@ export class ModuleMetadataService {
408
409
  return `${this.configService.get('app-builder.fileStorageDir')}/${fileName}`;
409
410
  }
410
411
 
411
-
412
-
413
412
  private getFileName(file: Express.Multer.File): string {
414
413
  return `${file.filename}-${file.originalname}`;
415
414
  }
@@ -53,11 +53,12 @@ export class RoleMetadataService extends CRUDService<RoleMetadata> {
53
53
  return entity;
54
54
  }
55
55
 
56
+ // OK
56
57
  async createRolesIfNotExists(roles: CreateRoleMetadataDto[]) {
57
58
  for (let id = 0; id < roles.length; id++) {
58
59
  try {
59
60
  const roleObj = roles[id];
60
- this.logger.log(`Resolving role: ${JSON.stringify(roleObj)}`);
61
+ // this.logger.log(`Resolving role: ${JSON.stringify(roleObj)}`);
61
62
 
62
63
  const existingRole = await this.repo.findOne({
63
64
  where: {
@@ -68,7 +69,7 @@ export class RoleMetadataService extends CRUDService<RoleMetadata> {
68
69
 
69
70
  // Create only if not existing already.
70
71
  if (!existingRole) {
71
- this.logger.log(`Role ${roleObj.name} does not exist, hence creating`);
72
+ this.logger.debug(`Role ${roleObj.name} does not exist, hence creating`);
72
73
 
73
74
  let permissions = [];
74
75
 
@@ -82,7 +83,21 @@ export class RoleMetadataService extends CRUDService<RoleMetadata> {
82
83
  const role = this.repo.create({ ...roleObj });
83
84
  await this.repo.save(role);
84
85
  } else {
85
- this.logger.log(`Role ${roleObj.name} already exists`);
86
+ /*
87
+ this.logger.debug(`Role ${roleObj.name} already exists`);
88
+ const existingPermissions = existingRole.permissions.map(permission => permission.name);
89
+ const newPermissions = roleObj.permissions.map(permission => permission.name);
90
+ const permissionsToAdd = newPermissions.filter(permission => !existingPermissions.includes(permission));
91
+ const permissionsToRemove = existingPermissions.filter(permission => !newPermissions.includes(permission));
92
+ this.logger.debug(`Permissions to add: ${JSON.stringify(permissionsToAdd)}`);
93
+ if (permissionsToAdd.length > 0) {
94
+ await this.addPermissionsToRole(roleObj.name, permissionsToAdd);
95
+ }
96
+ this.logger.debug(`Permissions to remove: ${JSON.stringify(permissionsToRemove)}`);
97
+ if (permissionsToRemove.length > 0) {
98
+ await this.removePermissionsFromRole(roleObj.name, permissionsToRemove);
99
+ }
100
+ */
86
101
  }
87
102
  } catch (error) {
88
103
  this.logger.error(error);
@@ -113,15 +128,14 @@ export class RoleMetadataService extends CRUDService<RoleMetadata> {
113
128
  throw new Error(`Role '${roleName}' not found.`);
114
129
  }
115
130
 
116
- this.logger.log(`Found role ${roleName}`);
117
-
131
+ // this.logger.log(`Found role ${roleName}`);
118
132
 
119
133
  // The new set of permissions which are to be added to this role.
120
134
  let newPermissions: PermissionMetadata[];
121
135
 
122
136
  // Load all the specified permissions in the system.
123
137
  if (permissionNames && permissionNames.length != 0) {
124
- this.logger.log(`Loading specified permissions.`);
138
+ // this.logger.log(`Loading specified permissions.`);
125
139
 
126
140
  newPermissions = await this.permissionRepository.find({ where: { name: In(permissionNames) } });
127
141
  if (newPermissions.length !== permissionNames.length) {
@@ -129,7 +143,7 @@ export class RoleMetadataService extends CRUDService<RoleMetadata> {
129
143
  }
130
144
  }
131
145
  else {
132
- this.logger.log(`Loading all permissions in system.`);
146
+ // this.logger.log(`Loading all permissions in system.`);
133
147
 
134
148
  // Load all permissions in the system.
135
149
  // TODO: Do we want to convert this to a paginated query to avoid having to load a very large permissions table into memory?
@@ -139,7 +153,7 @@ export class RoleMetadataService extends CRUDService<RoleMetadata> {
139
153
  }
140
154
  }
141
155
 
142
- this.logger.log(`Adding ${newPermissions.length} permissions to role ${roleName}.`);
156
+ // this.logger.log(`Adding ${newPermissions.length} permissions to role ${roleName}.`);
143
157
 
144
158
  // if there are already permissions assigned.
145
159
  if (role.permissions && role.permissions.length > 0) {
@@ -0,0 +1,263 @@
1
+ // src/ai/services/solid-ts-morph.service.ts
2
+ import { Injectable, Logger } from "@nestjs/common";
3
+ import { join, dirname, normalize, isAbsolute, basename } from "node:path";
4
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
5
+ import { Project, Node, ObjectLiteralExpression, ArrayLiteralExpression, QuoteKind, IndentationText } from "ts-morph";
6
+
7
+ type Bucket = "providers" | "exports";
8
+
9
+ // interface SolidTsMorphOptions {
10
+ // /** Absolute path to monorepo root. Defaults to auto-detect or ENV. */
11
+ // repoRoot?: string;
12
+ // /** Map of workspace prefixes to absolute directories. Defaults for solid-api / solid-ui. */
13
+ // workspaceMap?: Record<string, string>;
14
+ // }
15
+
16
+ @Injectable()
17
+ export class SolidTsMorphService {
18
+ private readonly logger = new Logger(SolidTsMorphService.name);
19
+ private project: Project;
20
+
21
+ // transaction state
22
+ private inTxn = false;
23
+ private stagedWrites = new Map<string, { content: string; overwrite: boolean }>(); // absPath -> write
24
+ private dirtySourceFiles = new Set<string>(); // absPath
25
+
26
+ // path roots
27
+ private readonly repoRoot: string;
28
+ private readonly workspaceMap: Record<string, string>;
29
+
30
+ // constructor(opts: SolidTsMorphOptions = {}) {
31
+ constructor() {
32
+ // this.repoRoot = this.discoverRepoRoot(opts.repoRoot);
33
+ this.repoRoot = this.discoverRepoRoot();
34
+ this.workspaceMap = {
35
+ "solid-api": join(this.repoRoot, "solid-api"),
36
+ "solid-ui": join(this.repoRoot, "solid-ui"),
37
+ // ...(opts.workspaceMap ?? {}),
38
+ };
39
+
40
+ this.project = new Project({
41
+ skipAddingFilesFromTsConfig: true,
42
+ manipulationSettings: {
43
+ quoteKind: QuoteKind.Double,
44
+ indentationText: IndentationText.FourSpaces,
45
+ insertSpaceAfterOpeningAndBeforeClosingNonemptyBraces: true,
46
+ },
47
+ });
48
+
49
+ this.logger.log(`SolidTsMorphService repoRoot = ${this.repoRoot}`);
50
+ Object.entries(this.workspaceMap).forEach(([k, v]) => this.logger.log(`workspace '${k}' => ${v}`));
51
+ }
52
+
53
+ // ---- repo-root discovery ----
54
+ private discoverRepoRoot(): string {
55
+ // if (input && isAbsolute(input)) return normalize(input);
56
+
57
+ // ENV override
58
+ const envRoot = process.env.SOLID_REPO_ROOT;
59
+ if (envRoot && isAbsolute(envRoot)) return normalize(envRoot);
60
+
61
+ // Auto-detect: if current cwd is a workspace (solid-api/solid-ui), then repoRoot = parent(cwd)
62
+ const cwd = normalize(process.cwd());
63
+ const base = basename(cwd);
64
+ if (base === "solid-api" || base === "solid-ui") {
65
+ return normalize(dirname(cwd));
66
+ }
67
+
68
+ // Otherwise assume cwd itself is the repo root
69
+ return cwd;
70
+ }
71
+
72
+ /** Resolve a repo-relative path with optional workspace prefix (e.g. 'solid-api/...', 'solid-ui/...'). */
73
+ private resolveRepoPath(relPath: string): string {
74
+ if (!relPath) throw new Error("resolveRepoPath: empty path");
75
+ const p = normalize(relPath);
76
+
77
+ if (isAbsolute(p)) return p;
78
+
79
+ // Prefix-aware mapping: 'solid-api/...', 'solid-ui/...'
80
+ for (const [prefix, root] of Object.entries(this.workspaceMap)) {
81
+ if (p === prefix || p.startsWith(prefix + "/") || p.startsWith(prefix + "\\")) {
82
+ const suffix = p.slice(prefix.length + (p.length > prefix.length ? 1 : 0));
83
+ return normalize(join(root, suffix));
84
+ }
85
+ }
86
+
87
+ // Default: treat as repo-root relative
88
+ return normalize(join(this.repoRoot, p));
89
+ }
90
+
91
+ private rel(abs: string): string {
92
+ const root = this.repoRoot.replace(/\\/g, "/");
93
+ return abs.replace(/\\/g, "/").replace(root + "/", "");
94
+ }
95
+
96
+ // ---- transaction API ----
97
+ begin(): void {
98
+ if (this.inTxn) {
99
+ this.logger.warn("begin(): already in a transaction; reusing current transaction.");
100
+ return;
101
+ }
102
+ this.inTxn = true;
103
+ this.stagedWrites.clear();
104
+ this.dirtySourceFiles.clear();
105
+ this.project = new Project({
106
+ skipAddingFilesFromTsConfig: true,
107
+ manipulationSettings: {
108
+ quoteKind: QuoteKind.Double,
109
+ indentationText: IndentationText.FourSpaces,
110
+ insertSpaceAfterOpeningAndBeforeClosingNonemptyBraces: true,
111
+ },
112
+ });
113
+ this.logger.log("Transaction started.");
114
+ }
115
+
116
+ rollback(): void {
117
+ if (!this.inTxn) return;
118
+ this.inTxn = false;
119
+ this.stagedWrites.clear();
120
+ this.dirtySourceFiles.clear();
121
+ this.project = new Project({
122
+ skipAddingFilesFromTsConfig: true,
123
+ manipulationSettings: {
124
+ quoteKind: QuoteKind.Double,
125
+ indentationText: IndentationText.FourSpaces,
126
+ insertSpaceAfterOpeningAndBeforeClosingNonemptyBraces: true,
127
+ },
128
+ });
129
+ this.logger.log("Transaction rolled back.");
130
+ }
131
+
132
+ async commit(): Promise<{ wrote: number }> {
133
+ if (!this.inTxn) {
134
+ this.logger.log("commit(): not in a transaction; nothing to commit.");
135
+ return { wrote: 0 };
136
+ }
137
+
138
+ let writes = 0;
139
+
140
+ // 1) write staged new/overwritten files
141
+ for (const [abs, { content, overwrite }] of this.stagedWrites.entries()) {
142
+ const dir = dirname(abs);
143
+ if (!existsSync(dir)) mkdirSync(dir, { recursive: true });
144
+ if (existsSync(abs) && !overwrite) {
145
+ this.logger.log(`createNewFile (staged): skipped (exists) ${this.rel(abs)}`);
146
+ } else {
147
+ writeFileSync(abs, content, "utf8");
148
+ writes++;
149
+ this.logger.log(`${existsSync(abs) && overwrite ? "Overwrote" : "Created"} file: ${this.rel(abs)}`);
150
+ }
151
+ }
152
+
153
+ // 2) save all mutated module files once
154
+ for (const abs of this.dirtySourceFiles.values()) {
155
+ const sf = this.project.getSourceFile(abs);
156
+ if (!sf) continue;
157
+ sf.fixMissingImports();
158
+ sf.organizeImports();
159
+ await sf.save();
160
+ writes++;
161
+ this.logger.log(`Updated module: ${this.rel(abs)}`);
162
+ }
163
+
164
+ // end txn
165
+ this.inTxn = false;
166
+ this.stagedWrites.clear();
167
+ this.dirtySourceFiles.clear();
168
+ this.project = new Project({
169
+ skipAddingFilesFromTsConfig: true,
170
+ manipulationSettings: {
171
+ quoteKind: QuoteKind.Double,
172
+ indentationText: IndentationText.FourSpaces,
173
+ insertSpaceAfterOpeningAndBeforeClosingNonemptyBraces: true,
174
+ },
175
+ });
176
+
177
+ return { wrote: writes };
178
+ }
179
+
180
+ // ---- operations ----
181
+ createNewFile(path: string, content: string, overwrite = false): { createdOrStaged: boolean; skipped: boolean } {
182
+ const abs = this.resolveRepoPath(path);
183
+ const dir = dirname(abs);
184
+
185
+ if (this.inTxn) {
186
+ if (!existsSync(dir)) mkdirSync(dir, { recursive: true });
187
+ this.stagedWrites.set(abs, { content, overwrite });
188
+ this.logger.log(`Staged createNewFile: ${this.rel(abs)} (overwrite=${overwrite})`);
189
+ return { createdOrStaged: true, skipped: false };
190
+ }
191
+
192
+ if (!existsSync(dir)) mkdirSync(dir, { recursive: true });
193
+ if (existsSync(abs) && !overwrite) {
194
+ this.logger.log(`createNewFile: skipped (exists): ${path}`);
195
+ return { createdOrStaged: false, skipped: true };
196
+ }
197
+ writeFileSync(abs, content, "utf8");
198
+ this.logger.log(`${existsSync(abs) && overwrite ? "Overwrote" : "Created"} file: ${path}`);
199
+ return { createdOrStaged: true, skipped: false };
200
+ }
201
+
202
+ registerNestProvider(
203
+ modulePath: string,
204
+ providerClassName: string,
205
+ importFrom: string,
206
+ registerIn: Array<Bucket>,
207
+ uniqueGuard = true
208
+ ): { staged: boolean } {
209
+ const abs = this.resolveRepoPath(modulePath);
210
+ if (!existsSync(abs)) throw new Error(`registerNestProvider: module file not found at ${modulePath}`);
211
+
212
+ const existing = this.project.getSourceFile(abs);
213
+ const sourceFile = existing
214
+ ? existing
215
+ : this.project.createSourceFile(abs, readFileSync(abs, "utf8"), { overwrite: true });
216
+
217
+ // ensure import
218
+ const imp = sourceFile.getImportDeclarations().find(d => d.getModuleSpecifierValue() === importFrom);
219
+ if (imp) {
220
+ const has = imp.getNamedImports().some(ni => ni.getName() === providerClassName);
221
+ if (!has) imp.addNamedImport(providerClassName);
222
+ } else {
223
+ sourceFile.addImportDeclaration({ moduleSpecifier: importFrom, namedImports: [providerClassName] });
224
+ }
225
+
226
+ // mutate @Module metadata
227
+ const nestModuleClass = sourceFile.getClasses().find(cls =>
228
+ cls.getDecorators().some(dec => dec.getName() === "Module")
229
+ );
230
+ if (!nestModuleClass) throw new Error(`registerNestProvider: No @Module() class found in ${modulePath}`);
231
+
232
+ const moduleDec = nestModuleClass.getDecorators().find(dec => dec.getName() === "Module");
233
+ const callExpr = moduleDec!.getCallExpression();
234
+ const arg0 = callExpr?.getArguments()[0];
235
+ if (!arg0 || !Node.isObjectLiteralExpression(arg0)) {
236
+ throw new Error(`registerNestProvider: Malformed @Module() in ${modulePath}`);
237
+ }
238
+ const meta = arg0 as ObjectLiteralExpression;
239
+
240
+ const ensureInArray = (propName: Bucket) => {
241
+ let prop = meta.getProperty(propName);
242
+ if (!prop) {
243
+ meta.addPropertyAssignment({ name: propName, initializer: "[]" });
244
+ prop = meta.getProperty(propName);
245
+ }
246
+ let arr: ArrayLiteralExpression | undefined;
247
+ if (Node.isPropertyAssignment(prop)) {
248
+ const init = prop.getInitializer();
249
+ if (init && Node.isArrayLiteralExpression(init)) arr = init;
250
+ }
251
+ if (!arr) throw new Error(`registerNestProvider: Property ${propName} is not an array in ${modulePath}`);
252
+
253
+ const exists = arr.getElements().some(el => el.getText().replace(/\s/g, "") === providerClassName);
254
+ if (!exists || !uniqueGuard) arr.addElement(providerClassName);
255
+ };
256
+
257
+ for (const bucket of registerIn) ensureInArray(bucket);
258
+
259
+ this.dirtySourceFiles.add(abs); // defer save to commit()
260
+ this.logger.log(`Staged provider registration in: ${this.rel(abs)} (${registerIn.join(", ")})`);
261
+ return { staged: true };
262
+ }
263
+ }
@@ -247,15 +247,6 @@ import { ImportTransactionErrorLogService } from './services/import-transaction-
247
247
  import { ImportTransactionService } from './services/import-transaction.service';
248
248
  import { ListOfValuesMetadataService } from './services/list-of-values-metadata.service';
249
249
  import { LocaleService } from './services/locale.service';
250
- import { McpToolResponseHandlerFactory } from './services/mcp-tool-response-handlers/mcp-tool-response-handler-factory.service';
251
- import { SolidAddFieldMcpToolResponseHandler } from './services/mcp-tool-response-handlers/solid-add-field-mcp-tool-response-handler.service';
252
- import { SolidCreateDashboardMcpToolResponseHandler } from './services/mcp-tool-response-handlers/solid-create-dashboard-mcp-tool-response-handler.service';
253
- import { SolidCreateDashboardQuestionMcpToolResponseHandler } from './services/mcp-tool-response-handlers/solid-create-dashboard-question-mcp-tool-response-handler.service';
254
- import { SolidCreateDashboardQuestionSqlDatasetConfigMcpToolResponseHandler } from './services/mcp-tool-response-handlers/solid-create-dashboard-question-sql-dataset-config-mcp-tool-response-handler.service';
255
- import { SolidCreateDashboardWidgetMcpToolResponseHandler } from './services/mcp-tool-response-handlers/solid-create-dashboard-widget-mcp-tool-response-handler.service';
256
- import { SolidCreateModelWithFieldsMcpToolResponseHandler } from './services/mcp-tool-response-handlers/solid-create-model-with-fields-mcp-tool-response-handler.service';
257
- import { SolidCreateModuleMcpToolResponseHandler } from './services/mcp-tool-response-handlers/solid-create-module-mcp-tool-response-handler.service';
258
- import { SolidCreateModelLayoutMcpToolResponseHandler } from './services/mcp-tool-response-handlers/solid-save-model-layout-mcp-tool-response-handler.service';
259
250
  import { FileS3StorageProvider } from './services/mediaStorageProviders/file-s3-storage-provider';
260
251
  import { FileStorageProvider } from './services/mediaStorageProviders/file-storage-provider';
261
252
  import { PollerService } from './services/poller.service';
@@ -292,6 +283,17 @@ import { ListOfValuesMetadataSubscriber } from './subscribers/list-of-values-met
292
283
  import { ScheduledJobSubscriber } from './subscribers/scheduled-job.subscriber';
293
284
  import { SecurityRuleSubscriber } from './subscribers/security-rule.subscriber';
294
285
  import { ViewMetadataSubsciber } from './subscribers/view-metadata.subscriber';
286
+ import { McpHandlerFactory } from './services/genai/mcp-handlers/mcp-handler-factory.service';
287
+ import { SolidCreateModuleMcpHandler } from './services/genai/mcp-handlers/solid-create-module-mcp-handler.service';
288
+ import { SolidCreateModelWithFieldsMcpHandler } from './services/genai/mcp-handlers/solid-create-model-with-fields-mcp-handler.service';
289
+ import { SolidAddFieldsToModelMcpHandler } from './services/genai/mcp-handlers/solid-add-fields-to-model-mcp-handler.service';
290
+ import { SolidUpdateLayoutMcpHandler } from './services/genai/mcp-handlers/solid-update-layout-mcp-handler.service';
291
+ import { SolidCreateDashboardMcpHandler } from './services/genai/mcp-handlers/solid-create-dashboard-mcp-handler.service';
292
+ import { SolidCreateDashboardQuestionMcpHandler } from './services/genai/mcp-handlers/solid-create-dashboard-question-mcp-handler.service';
293
+ import { SolidCreateDashboardQuestionSqlDatasetConfigMcpHandler } from './services/genai/mcp-handlers/solid-create-dashboard-question-sql-dataset-config-mcp-handler.service';
294
+ import { SolidCreateDashboardWidgetMcpHandler } from './services/genai/mcp-handlers/solid-create-dashboard-widget-mcp-handler.service';
295
+ import { SolidCreateComputedProviderMcpHandler } from './services/genai/mcp-handlers/solid-create-computed-provider-mcp-handler.service';
296
+ import { SolidTsMorphService } from './services/solid-ts-morph.service';
295
297
 
296
298
 
297
299
  @Global()
@@ -493,9 +495,6 @@ import { ViewMetadataSubsciber } from './subscribers/view-metadata.subscriber';
493
495
  ErrorMapperService,
494
496
  SolidCoreErrorCodesProvider,
495
497
 
496
- McpToolResponseHandlerFactory,
497
- SolidCreateModuleMcpToolResponseHandler,
498
-
499
498
  TriggerMcpClientPublisherDatabase,
500
499
  TriggerMcpClientSubscriberDatabase,
501
500
  TriggerMcpClientPublisherRabbitmq,
@@ -625,14 +624,21 @@ import { ViewMetadataSubsciber } from './subscribers/view-metadata.subscriber';
625
624
  DashboardQuestionSubscriber,
626
625
  DashboardQuestionSqlDatasetConfigSubscriber,
627
626
  NoopsEntityComputedFieldProviderService,
628
- SolidCreateDashboardMcpToolResponseHandler,
629
- SolidCreateDashboardQuestionMcpToolResponseHandler,
630
- SolidCreateDashboardQuestionSqlDatasetConfigMcpToolResponseHandler,
631
- SolidCreateDashboardWidgetMcpToolResponseHandler,
632
- SolidCreateModelWithFieldsMcpToolResponseHandler,
633
- SolidAddFieldMcpToolResponseHandler,
627
+
628
+ McpHandlerFactory,
629
+ SolidCreateModuleMcpHandler,
630
+ SolidCreateModelWithFieldsMcpHandler,
631
+ SolidAddFieldsToModelMcpHandler,
632
+ SolidUpdateLayoutMcpHandler,
633
+
634
+ SolidCreateDashboardMcpHandler,
635
+ SolidCreateDashboardQuestionMcpHandler,
636
+ SolidCreateDashboardQuestionSqlDatasetConfigMcpHandler,
637
+ SolidCreateDashboardWidgetMcpHandler,
638
+ SolidCreateComputedProviderMcpHandler,
639
+ SolidTsMorphService,
640
+
634
641
  ViewMetadataRepository,
635
- SolidCreateModelLayoutMcpToolResponseHandler,
636
642
  ScheduledJobRepository,
637
643
  ScheduledJobSubscriber,
638
644
  AlphaNumExternalIdComputationProvider,
@@ -1 +0,0 @@
1
- {"version":3,"file":"mcp-tool-response-handler-factory.service.d.ts","sourceRoot":"","sources":["../../../src/services/mcp-tool-response-handlers/mcp-tool-response-handler-factory.service.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAGrE,qBACa,6BAA6B;IAIlC,OAAO,CAAC,QAAQ,CAAC,yBAAyB;IAH9C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkD;gBAGpD,yBAAyB,EAAE,sBAAsB;IAItE,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,uBAAuB;CAiB5D"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"mcp-tool-response-handler-factory.service.js","sourceRoot":"","sources":["../../../src/services/mcp-tool-response-handlers/mcp-tool-response-handler-factory.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,2CAAoD;AAEpD,oEAAkE;AAElE,0EAAqE;AAI9D,IAAM,6BAA6B,qCAAnC,MAAM,6BAA6B;IAGtC,YACqB,yBAAiD;QAAjD,8BAAyB,GAAzB,yBAAyB,CAAwB;QAHrD,WAAM,GAAG,IAAI,eAAM,CAAC,+BAA6B,CAAC,IAAI,CAAC,CAAC;IAKzE,CAAC;IAED,WAAW,CAAC,WAAmB;QAC3B,WAAW,GAAG,IAAA,kBAAQ,EAAC,WAAW,CAAC,CAAC;QAEpC,IAAI,mBAAmB,GAAG,GAAG,WAAW,wBAAwB,CAAC;QAGjE,IAAI,aAAa,GAAG,IAAI,CAAC,yBAAyB,CAAC,WAAW,CAAC,mBAAmB,CAAC,CAAC;QACpF,IAAI,CAAC,aAAa,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,+CAA+C,mBAAmB,EAAE,CAAC,CAAC;QAC1F,CAAC;QAGD,MAAM,qBAAqB,GAA4B,aAAa,CAAC,QAAQ,CAAC;QAC9E,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,gDAAgD,aAAa,CAAC,IAAI,EAAE,CAAC,CAAC;QAExF,OAAO,qBAAqB,CAAC;IACjC,CAAC;CACJ,CAAA;AAzBY,sEAA6B;wCAA7B,6BAA6B;IADzC,IAAA,mBAAU,GAAE;qCAKuC,iDAAsB;GAJ7D,6BAA6B,CAyBzC","sourcesContent":["import { Injectable, Logger } from '@nestjs/common';\n\nimport { classify } from '@angular-devkit/core/src/utils/strings';\nimport { IMcpToolResponseHandler } from 'src/interfaces';\nimport { SolidIntrospectService } from '../solid-introspect.service';\n\n\n@Injectable()\nexport class McpToolResponseHandlerFactory {\n private readonly logger = new Logger(McpToolResponseHandlerFactory.name);\n\n constructor(\n private readonly solidIntrospectionService: SolidIntrospectService\n ) {\n }\n\n getInstance(toolInvoked: string): IMcpToolResponseHandler {\n toolInvoked = classify(toolInvoked);\n\n let resolvedHandlerName = `${toolInvoked}McpToolResponseHandler`;\n\n // Register all ISolidDatabaseModules implementations\n let actualHandler = this.solidIntrospectionService.getProvider(resolvedHandlerName);\n if (!actualHandler) {\n throw new Error(`Unable to locate mcp tool handler with name ${resolvedHandlerName}`);\n }\n\n // type safe\n const actualHandlerInstance: IMcpToolResponseHandler = actualHandler.instance;\n this.logger.error(`Resolved mcp tool response handler with name ${actualHandler.name}`);\n\n return actualHandlerInstance;\n }\n}\n"]}
@@ -1,16 +0,0 @@
1
- import { AiInteraction } from "src/entities/ai-interaction.entity";
2
- import { SolidRegistry } from "src/helpers/solid-registry";
3
- import { IMcpToolResponseHandler } from "../../interfaces";
4
- import { FieldMetadataService } from "../field-metadata.service";
5
- import { ModelMetadataService } from "../model-metadata.service";
6
- export declare class SolidAddFieldMcpToolResponseHandler implements IMcpToolResponseHandler {
7
- private readonly modelMetadataService;
8
- private readonly fieldMetadataService;
9
- private readonly solidRegistry;
10
- constructor(modelMetadataService: ModelMetadataService, fieldMetadataService: FieldMetadataService, solidRegistry: SolidRegistry);
11
- apply(aiInteraction: AiInteraction): Promise<{
12
- seedingRequired: boolean;
13
- serverRebooting: boolean;
14
- }>;
15
- }
16
- //# sourceMappingURL=solid-add-field-mcp-tool-response-handler.service.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"solid-add-field-mcp-tool-response-handler.service.d.ts","sourceRoot":"","sources":["../../../src/services/mcp-tool-response-handlers/solid-add-field-mcp-tool-response-handler.service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AAEnE,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAEjE,qBAEa,mCAAoC,YAAW,uBAAuB;IAG3E,OAAO,CAAC,QAAQ,CAAC,oBAAoB;IACrC,OAAO,CAAC,QAAQ,CAAC,oBAAoB;IACrC,OAAO,CAAC,QAAQ,CAAC,aAAa;gBAFb,oBAAoB,EAAE,oBAAoB,EAC1C,oBAAoB,EAAE,oBAAoB,EAC1C,aAAa,EAAE,aAAa;IAI3C,KAAK,CAAC,aAAa,EAAE,aAAa;;;;CAmC3C"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"solid-add-field-mcp-tool-response-handler.service.js","sourceRoot":"","sources":["../../../src/services/mcp-tool-response-handlers/solid-add-field-mcp-tool-response-handler.service.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAA4C;AAI5C,iEAA2D;AAE3D,sEAAiE;AACjE,sEAAiE;AAI1D,IAAM,mCAAmC,GAAzC,MAAM,mCAAmC;IAE5C,YACqB,oBAA0C,EAC1C,oBAA0C,EAC1C,aAA4B;QAF5B,yBAAoB,GAApB,oBAAoB,CAAsB;QAC1C,yBAAoB,GAApB,oBAAoB,CAAsB;QAC1C,kBAAa,GAAb,aAAa,CAAe;IAEjD,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,aAA4B;QAEpC,MAAM,cAAc,GAAG,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAClE,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;QAE9C,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,GAAG,UAAU,CAAC;QAKjD,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,gBAAgB,CAAC,YAAY,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;QACjG,IAAI,CAAC,aAAa,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,uBAAuB,YAAY,aAAa,CAAC,CAAC;QACtE,CAAC;QAGD,WAAW,CAAC,SAAS,CAAC,GAAG,aAAa,CAAC,EAAE,CAAC;QAC1C,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,WAA4B,CAAC,CAAC;QAExD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,EAAE,aAAkD,CAAC,CAAC;QAO9H,MAAM,IAAI,CAAC,oBAAoB,CAAC,kBAAkB,CAAC,EAAE,OAAO,EAAE,aAAa,CAAC,EAAE,EAAE,CAAC,CAAC;QAGlF,OAAO;YACH,eAAe,EAAE,IAAI;YACrB,eAAe,EAAE,IAAI;SACxB,CAAA;IACL,CAAC;CAEJ,CAAA;AA5CY,kFAAmC;8CAAnC,mCAAmC;IAF/C,IAAA,mBAAU,GAAE;qCAKkC,6CAAoB;QACpB,6CAAoB;QAC3B,8BAAa;GALxC,mCAAmC,CA4C/C","sourcesContent":["import { Injectable } from \"@nestjs/common\";\nimport { UpdateModelMetaDataDto } from \"src/dtos/update-model-metadata.dto\";\nimport { AiInteraction } from \"src/entities/ai-interaction.entity\";\nimport { FieldMetadata } from \"src/entities/field-metadata.entity\";\nimport { SolidRegistry } from \"src/helpers/solid-registry\";\nimport { IMcpToolResponseHandler } from \"../../interfaces\";\nimport { FieldMetadataService } from \"../field-metadata.service\";\nimport { ModelMetadataService } from \"../model-metadata.service\";\n\n@Injectable()\n// solid_add_field\nexport class SolidAddFieldMcpToolResponseHandler implements IMcpToolResponseHandler {\n\n constructor(\n private readonly modelMetadataService: ModelMetadataService,\n private readonly fieldMetadataService: FieldMetadataService,\n private readonly solidRegistry: SolidRegistry,\n ) {\n }\n\n async apply(aiInteraction: AiInteraction) {\n // const aiResponse = JSON.parse(aiInteraction.message);\n const escapedMessage = aiInteraction.message.replace(/\\\\'/g, \"'\");\n const aiResponse = JSON.parse(escapedMessage);\n\n const { modelUserKey, fieldSchema } = aiResponse;\n\n // TODO: Validate if another field with same name exists, if it does then raise an error...\n\n // TODO: load the model with the fields.\n const modelMetadata = await this.modelMetadataService.findOneByUserKey(modelUserKey, ['fields']);\n if (!modelMetadata) {\n throw new Error(`Model with user key ${modelUserKey} not found.`);\n }\n\n // Add the fieldSchema to the model fields array\n fieldSchema['modelId'] = modelMetadata.id;\n modelMetadata.fields.push(fieldSchema as FieldMetadata);\n\n const modelObj = await this.modelMetadataService.update(modelMetadata.id, modelMetadata as unknown as UpdateModelMetaDataDto);\n\n\n // This creates the module-metadata.json file....\n // const modelObj = await this.fieldMetadataService.create(fieldSchema as CreateFieldMetadataDto);\n\n // Now we need to run solid seed & then solid refresh-model --name <module-name>\n await this.modelMetadataService.handleGenerateCode({ modelId: modelMetadata.id });\n\n // TODO: decide on some shape to return hre...\n return {\n seedingRequired: true,\n serverRebooting: true,\n }\n }\n\n}"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"solid-create-dashboard-mcp-tool-response-handler.service.d.ts","sourceRoot":"","sources":["../../../src/services/mcp-tool-response-handlers/solid-create-dashboard-mcp-tool-response-handler.service.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AAEnE,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AACxE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAE/D,qBACa,0CAA2C,YAAW,uBAAuB;IAGlF,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IACjC,OAAO,CAAC,QAAQ,CAAC,qBAAqB;IACtC,OAAO,CAAC,QAAQ,CAAC,uBAAuB;IACxC,OAAO,CAAC,QAAQ,CAAC,qBAAqB;IACtC,OAAO,CAAC,QAAQ,CAAC,oBAAoB;IACrC,OAAO,CAAC,QAAQ,CAAC,WAAW;gBALX,gBAAgB,EAAE,gBAAgB,EAClC,qBAAqB,EAAE,qBAAqB,EAC5C,uBAAuB,EAAE,uBAAuB,EAChD,qBAAqB,EAAE,qBAAqB,EAC5C,oBAAoB,EAAE,oBAAoB,EAC1C,WAAW,EAAE,mBAAmB;IAI/C,KAAK,CAAC,aAAa,EAAE,aAAa;;;;YAkB1B,mBAAmB;YAsCnB,yBAAyB;YAuBzB,eAAe;CAMhC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"solid-create-dashboard-mcp-tool-response-handler.service.js","sourceRoot":"","sources":["../../../src/services/mcp-tool-response-handlers/solid-create-dashboard-mcp-tool-response-handler.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { Injectable } from \"@nestjs/common\";\nimport { plainToInstance } from \"class-transformer\";\nimport { CreateDashboardDto } from \"src/dtos/create-dashboard.dto\";\nimport { UpdateMenuItemMetadataDto } from \"src/dtos/update-menu-item-metadata.dto\";\nimport { AiInteraction } from \"src/entities/ai-interaction.entity\";\nimport { Dashboard } from \"src/entities/dashboard.entity\";\nimport { IMcpToolResponseHandler } from \"../../interfaces\";\nimport { ActionMetadataService } from \"../action-metadata.service\";\nimport { DashboardService } from \"../dashboard.service\";\nimport { MenuItemMetadataService } from \"../menu-item-metadata.service\";\nimport { ModelMetadataService } from \"../model-metadata.service\";\nimport { ModuleMetadataService } from \"../module-metadata.service\";\nimport { RoleMetadataService } from \"../role-metadata.service\";\n\n@Injectable()\nexport class SolidCreateDashboardMcpToolResponseHandler implements IMcpToolResponseHandler {\n\n constructor(\n private readonly dashboardService: DashboardService,\n private readonly actionMetadataService: ActionMetadataService,\n private readonly menuItemMetadataService: MenuItemMetadataService,\n private readonly moduleMetadataService: ModuleMetadataService,\n private readonly modelMetadataService: ModelMetadataService,\n private readonly roleService: RoleMetadataService, // Assuming roleService is a Mongoose model, adjust as necessary\n ) {\n }\n\n async apply(aiInteraction: AiInteraction) {\n const escapedMessage = aiInteraction.message.replace(/\\\\'/g, \"'\");\n const aiResponseMessage = JSON.parse(escapedMessage);\n\n const { dashboardDto, dashboard } = await this.createDashboard(aiResponseMessage);\n\n const { moduleUserKey, actionMetadataEntity } = await this.createActionMetadataEntry(dashboardDto, dashboard);\n\n await this.createMenuItemEntry(dashboard, moduleUserKey, actionMetadataEntity);\n\n // TODO: decide on some shape to return hre...\n return {\n seedingRequired: false,\n serverRebooting: false,\n }\n }\n\n\n private async createMenuItemEntry(dashboard: Dashboard, moduleUserKey: string, actionMetadataEntity: any) {\n const menuData = {\n displayName: dashboard.displayName || dashboard.name,\n name: `${moduleUserKey}-${dashboard.name}-dashboard-menu-item`,\n sequenceNumber: 1,\n actionUserKey: actionMetadataEntity.name,\n moduleUserKey: moduleUserKey,\n parentMenuItemUserKey: '',\n };\n\n const adminRole = await this.roleService.findRoleByName('Admin');\n const specifiedRoles = menuData['roles'];\n\n // If the developer has specified roles, then resolve them, making sure that admin role is also given.\n const specifiedRoleObjects = [adminRole];\n if (specifiedRoles) {\n for (let i = 0; i < specifiedRoles.length; i++) {\n const specifiedRole = specifiedRoles[i];\n const specifiedRoleObject = await this.roleService.findRoleByName(specifiedRole);\n if (!specifiedRoleObject) {\n throw new Error(`Invalid role: (${specifiedRole}) specified against menu with display name ${menuData.displayName}.`);\n }\n specifiedRoleObjects.push(specifiedRoleObject);\n }\n }\n\n menuData['roles'] = specifiedRoleObjects;\n menuData['action'] = await this.actionMetadataService.findOneByUserKey(menuData.actionUserKey);\n menuData['module'] = await this.moduleMetadataService.findOneByUserKey(menuData.moduleUserKey);\n\n if (menuData.parentMenuItemUserKey) {\n menuData['parentMenuItem'] = await this.menuItemMetadataService.findOneByUserKey(menuData.parentMenuItemUserKey);\n } else {\n menuData['parentMenuItem'] = null;\n }\n await this.menuItemMetadataService.upsert(menuData as unknown as UpdateMenuItemMetadataDto);\n }\n\n private async createActionMetadataEntry(dashboardDto: CreateDashboardDto, dashboard: Dashboard) {\n const moduleUserKey = dashboardDto.moduleUserKey;\n const actionMetadata = {\n name: `${dashboard.name}-view`,\n displayName: dashboard.displayName || dashboard.name,\n type: 'custom',\n domain: \"{}\",\n context: \"{}\",\n customComponent: `/admin/core/${moduleUserKey}/dashboards?dashboardName=${dashboard.name}`,\n customIsModal: true,\n serverEndpoint: '',\n moduleUserKey: moduleUserKey,\n modelUserKey: '',\n viewUserKey: `${dashboard.name}-view`,\n };\n actionMetadata['module'] = await this.moduleMetadataService.findOneByUserKey(actionMetadata.moduleUserKey);\n if (actionMetadata.modelUserKey) {\n actionMetadata['model'] = await this.modelMetadataService.findOneByUserKey(actionMetadata.modelUserKey);\n }\n const actionMetadataEntity = await this.actionMetadataService.upsert(actionMetadata);\n return { moduleUserKey, actionMetadataEntity };\n }\n\n private async createDashboard(aiResponseMessage: any) {\n const dashboardDto = plainToInstance(CreateDashboardDto, aiResponseMessage);\n dashboardDto['layoutJson'] = JSON.stringify(dashboardDto['layoutJson']);\n const dashboard = await this.dashboardService.create(dashboardDto, []);\n return { dashboardDto, dashboard };\n }\n}"]}
@@ -1,12 +0,0 @@
1
- import { AiInteraction } from "src/entities/ai-interaction.entity";
2
- import { IMcpToolResponseHandler } from "../../interfaces";
3
- import { DashboardQuestionService } from "../dashboard-question.service";
4
- export declare class SolidCreateDashboardQuestionMcpToolResponseHandler implements IMcpToolResponseHandler {
5
- private readonly dashboardQuestionService;
6
- constructor(dashboardQuestionService: DashboardQuestionService);
7
- apply(aiInteraction: AiInteraction): Promise<{
8
- seedingRequired: boolean;
9
- serverRebooting: boolean;
10
- }>;
11
- }
12
- //# sourceMappingURL=solid-create-dashboard-question-mcp-tool-response-handler.service.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"solid-create-dashboard-question-mcp-tool-response-handler.service.d.ts","sourceRoot":"","sources":["../../../src/services/mcp-tool-response-handlers/solid-create-dashboard-question-mcp-tool-response-handler.service.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AACnE,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AAEzE,qBACa,kDAAmD,YAAW,uBAAuB;IAG1F,OAAO,CAAC,QAAQ,CAAC,wBAAwB;gBAAxB,wBAAwB,EAAE,wBAAwB;IAIjE,KAAK,CAAC,aAAa,EAAE,aAAa;;;;CAsB3C"}