@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
@@ -1,19 +1,16 @@
1
1
  import { Injectable } from "@nestjs/common";
2
- import { IMcpToolResponseHandler } from "../../interfaces";
2
+ import { IMcpToolResponseHandler } from "../../../interfaces";
3
3
  import { AiInteraction } from "src/entities/ai-interaction.entity";
4
- import { SolidRegistry } from "src/helpers/solid-registry";
5
- import { ModelMetadataService } from "../model-metadata.service";
4
+ import { ModelMetadataService } from "../../model-metadata.service";
6
5
  import { CreateModelMetadataDto } from "src/dtos/create-model-metadata.dto";
7
- import { ModuleMetadataService } from "../module-metadata.service";
8
- import { model } from "mongoose";
6
+ import { ModuleMetadataService } from "../../module-metadata.service";
9
7
 
10
8
  @Injectable()
11
- export class SolidCreateModelWithFieldsMcpToolResponseHandler implements IMcpToolResponseHandler {
9
+ export class SolidCreateModelWithFieldsMcpHandler implements IMcpToolResponseHandler {
12
10
 
13
11
  constructor(
14
12
  private readonly moduleMetadataService: ModuleMetadataService,
15
13
  private readonly modelMetadataService: ModelMetadataService,
16
- private readonly solidRegistry: SolidRegistry,
17
14
  ) {
18
15
  }
19
16
 
@@ -22,17 +19,18 @@ export class SolidCreateModelWithFieldsMcpToolResponseHandler implements IMcpToo
22
19
  const escapedMessage = aiInteraction.message.replace(/\\'/g, "'");
23
20
  const aiResponseMessage = JSON.parse(escapedMessage);
24
21
 
25
- const { moduleUserKey, ...modelSchema } = aiResponseMessage;
22
+ const { generation_status, instructions, data } = aiResponseMessage;
23
+ const { moduleUserKey, schema } = data;
26
24
  const moduleMetadata = await this.moduleMetadataService.findOneByUserKey(moduleUserKey);
27
25
  if (!moduleMetadata) {
28
26
  throw new Error(`Module with user key ${moduleUserKey} not found.`);
29
27
  }
30
- modelSchema['moduleId'] = moduleMetadata.id;
28
+ schema['moduleId'] = moduleMetadata.id;
31
29
 
32
30
  // TODO: Validate if another model with same name exists, if it does then raise an error...
33
31
 
34
32
  // This creates the module-metadata.json file....
35
- const modelObj = await this.modelMetadataService.create(modelSchema as CreateModelMetadataDto);
33
+ const modelObj = await this.modelMetadataService.create(schema as CreateModelMetadataDto);
36
34
 
37
35
  // Now we need to run solid seed & then solid refresh-model --name <module-name>
38
36
  await this.modelMetadataService.handleGenerateCode({ modelId: modelObj.id });
@@ -1,12 +1,12 @@
1
1
  import { Injectable } from "@nestjs/common";
2
- import { IMcpToolResponseHandler } from "../../interfaces";
2
+ import { IMcpToolResponseHandler } from "../../../interfaces";
3
3
  import { AiInteraction } from "src/entities/ai-interaction.entity";
4
- import { ModuleMetadataService } from "../module-metadata.service";
4
+ import { ModuleMetadataService } from "../../module-metadata.service";
5
5
  import { CreateModuleMetadataDto } from "src/dtos/create-module-metadata.dto";
6
6
  import { SolidRegistry } from "src/helpers/solid-registry";
7
7
 
8
8
  @Injectable()
9
- export class SolidCreateModuleMcpToolResponseHandler implements IMcpToolResponseHandler {
9
+ export class SolidCreateModuleMcpHandler implements IMcpToolResponseHandler {
10
10
 
11
11
  constructor(
12
12
  private readonly moduleMetadataService: ModuleMetadataService,
@@ -16,9 +16,12 @@ export class SolidCreateModuleMcpToolResponseHandler implements IMcpToolResponse
16
16
  }
17
17
 
18
18
  async apply(aiInteraction: AiInteraction) {
19
- const aiResponseMessage = JSON.parse(aiInteraction.message);
19
+ const escapedMessage = aiInteraction.message.replace(/\\'/g, "'");
20
+ const aiResponseMessage = JSON.parse(escapedMessage);
20
21
 
21
- const moduleMetadata = aiResponseMessage?.moduleMetadata ?? {};
22
+ const { generation_status, instructions, data } = aiResponseMessage;
23
+ const { schema } = data;
24
+ const { moduleMetadata } = schema;
22
25
 
23
26
  // TODO: Validate if another module with same name exists, if it does then raise an error...
24
27
 
@@ -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
 
@@ -659,10 +659,10 @@ export class ImportTransactionService extends CRUDService<ImportTransaction> {
659
659
  return dtoRecord;
660
660
  }
661
661
  // Use flexible date parser
662
- console.log(cellValue,'cellValue');
662
+ this.logger.verbose(cellValue,'cellValue');
663
663
 
664
664
  const dateValue = parseFlexibleDate(cellValue);
665
- console.log(dateValue,'dateValue');
665
+ this.logger.verbose(dateValue,'dateValue');
666
666
 
667
667
  if (!dateValue) {
668
668
  throw new Error(
@@ -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,19 @@ 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 { SolidCreateDashboardWithWidgetsMcpHandler } 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';
297
+ import { SolidAddVariableToDashboardMcpHandler } from './services/genai/mcp-handlers/solid-add-variable-to-dashboard-mcp-handler.service';
298
+ import { SolidAddQuestionToDashboardMcpHandler } from './services/genai/mcp-handlers/solid-add-question-to-dashboard-mcp-handler.service';
295
299
 
296
300
 
297
301
  @Global()
@@ -493,9 +497,6 @@ import { ViewMetadataSubsciber } from './subscribers/view-metadata.subscriber';
493
497
  ErrorMapperService,
494
498
  SolidCoreErrorCodesProvider,
495
499
 
496
- McpToolResponseHandlerFactory,
497
- SolidCreateModuleMcpToolResponseHandler,
498
-
499
500
  TriggerMcpClientPublisherDatabase,
500
501
  TriggerMcpClientSubscriberDatabase,
501
502
  TriggerMcpClientPublisherRabbitmq,
@@ -625,14 +626,23 @@ import { ViewMetadataSubsciber } from './subscribers/view-metadata.subscriber';
625
626
  DashboardQuestionSubscriber,
626
627
  DashboardQuestionSqlDatasetConfigSubscriber,
627
628
  NoopsEntityComputedFieldProviderService,
628
- SolidCreateDashboardMcpToolResponseHandler,
629
- SolidCreateDashboardQuestionMcpToolResponseHandler,
630
- SolidCreateDashboardQuestionSqlDatasetConfigMcpToolResponseHandler,
631
- SolidCreateDashboardWidgetMcpToolResponseHandler,
632
- SolidCreateModelWithFieldsMcpToolResponseHandler,
633
- SolidAddFieldMcpToolResponseHandler,
629
+
630
+ McpHandlerFactory,
631
+ SolidCreateModuleMcpHandler,
632
+ SolidCreateModelWithFieldsMcpHandler,
633
+ SolidAddFieldsToModelMcpHandler,
634
+ SolidUpdateLayoutMcpHandler,
635
+
636
+ SolidCreateDashboardWithWidgetsMcpHandler,
637
+ SolidCreateDashboardQuestionMcpHandler,
638
+ SolidCreateDashboardQuestionSqlDatasetConfigMcpHandler,
639
+ SolidCreateDashboardWidgetMcpHandler,
640
+ SolidCreateComputedProviderMcpHandler,
641
+ SolidAddVariableToDashboardMcpHandler,
642
+ SolidAddQuestionToDashboardMcpHandler,
643
+ SolidTsMorphService,
644
+
634
645
  ViewMetadataRepository,
635
- SolidCreateModelLayoutMcpToolResponseHandler,
636
646
  ScheduledJobRepository,
637
647
  ScheduledJobSubscriber,
638
648
  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"}