@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.
- package/dev-grooming-docs/ozzy-prompts.txt +28 -3
- package/dist/config/iam.config.d.ts.map +1 -1
- package/dist/config/iam.config.js +2 -1
- package/dist/config/iam.config.js.map +1 -1
- package/dist/controllers/service.controller.d.ts +8 -1
- package/dist/controllers/service.controller.d.ts.map +1 -1
- package/dist/controllers/service.controller.js +38 -2
- package/dist/controllers/service.controller.js.map +1 -1
- package/dist/decorators/active-user.decorator.d.ts +1 -1
- package/dist/dtos/create-menu-item-metadata.dto.d.ts +3 -0
- package/dist/dtos/create-menu-item-metadata.dto.d.ts.map +1 -1
- package/dist/dtos/create-menu-item-metadata.dto.js +4 -1
- package/dist/dtos/create-menu-item-metadata.dto.js.map +1 -1
- package/dist/dtos/create-role-metadata.dto.d.ts +4 -0
- package/dist/dtos/create-role-metadata.dto.d.ts.map +1 -1
- package/dist/dtos/create-role-metadata.dto.js +45 -1
- package/dist/dtos/create-role-metadata.dto.js.map +1 -1
- package/dist/helpers/date.helper.d.ts +2 -0
- package/dist/helpers/date.helper.d.ts.map +1 -0
- package/dist/helpers/date.helper.js +18 -0
- package/dist/helpers/date.helper.js.map +1 -0
- package/dist/interfaces.d.ts +20 -0
- package/dist/interfaces.d.ts.map +1 -1
- package/dist/interfaces.js.map +1 -1
- package/dist/jobs/database/trigger-mcp-client-subscriber-database.service.d.ts +7 -1
- package/dist/jobs/database/trigger-mcp-client-subscriber-database.service.d.ts.map +1 -1
- package/dist/jobs/database/trigger-mcp-client-subscriber-database.service.js +82 -17
- package/dist/jobs/database/trigger-mcp-client-subscriber-database.service.js.map +1 -1
- package/dist/repository/view-metadata.repository.d.ts +1 -0
- package/dist/repository/view-metadata.repository.d.ts.map +1 -1
- package/dist/repository/view-metadata.repository.js +14 -0
- package/dist/repository/view-metadata.repository.js.map +1 -1
- package/dist/seeders/module-metadata-seeder.service.d.ts +52 -42
- package/dist/seeders/module-metadata-seeder.service.d.ts.map +1 -1
- package/dist/seeders/module-metadata-seeder.service.js +259 -202
- package/dist/seeders/module-metadata-seeder.service.js.map +1 -1
- package/dist/seeders/permission-metadata-seeder.service.js +0 -1
- package/dist/seeders/permission-metadata-seeder.service.js.map +1 -1
- package/dist/seeders/seed-data/solid-core-metadata.json +2 -3
- package/dist/services/ai-interaction.service.d.ts +3 -3
- package/dist/services/ai-interaction.service.d.ts.map +1 -1
- package/dist/services/ai-interaction.service.js +16 -9
- package/dist/services/ai-interaction.service.js.map +1 -1
- package/dist/services/excel.service.js +2 -2
- package/dist/services/excel.service.js.map +1 -1
- package/dist/services/genai/ingest-metadata.service.d.ts.map +1 -1
- package/dist/services/genai/ingest-metadata.service.js +46 -35
- package/dist/services/genai/ingest-metadata.service.js.map +1 -1
- 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
- package/dist/services/genai/mcp-handlers/mcp-handler-factory.service.d.ts.map +1 -0
- package/dist/services/{mcp-tool-response-handlers/mcp-tool-response-handler-factory.service.js → genai/mcp-handlers/mcp-handler-factory.service.js} +10 -10
- package/dist/services/genai/mcp-handlers/mcp-handler-factory.service.js.map +1 -0
- package/dist/services/genai/mcp-handlers/solid-add-fields-to-model-mcp-handler.service.d.ts +12 -0
- package/dist/services/genai/mcp-handlers/solid-add-fields-to-model-mcp-handler.service.d.ts.map +1 -0
- 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
- package/dist/services/genai/mcp-handlers/solid-add-fields-to-model-mcp-handler.service.js.map +1 -0
- package/dist/services/genai/mcp-handlers/solid-create-computed-provider-mcp-handler.service.d.ts +16 -0
- package/dist/services/genai/mcp-handlers/solid-create-computed-provider-mcp-handler.service.d.ts.map +1 -0
- package/dist/services/genai/mcp-handlers/solid-create-computed-provider-mcp-handler.service.js +75 -0
- package/dist/services/genai/mcp-handlers/solid-create-computed-provider-mcp-handler.service.js.map +1 -0
- 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
- package/dist/services/genai/mcp-handlers/solid-create-dashboard-mcp-handler.service.d.ts.map +1 -0
- 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
- package/dist/services/genai/mcp-handlers/solid-create-dashboard-mcp-handler.service.js.map +1 -0
- package/dist/services/genai/mcp-handlers/solid-create-dashboard-question-mcp-handler.service.d.ts +12 -0
- package/dist/services/genai/mcp-handlers/solid-create-dashboard-question-mcp-handler.service.d.ts.map +1 -0
- 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
- package/dist/services/genai/mcp-handlers/solid-create-dashboard-question-mcp-handler.service.js.map +1 -0
- 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
- package/dist/services/genai/mcp-handlers/solid-create-dashboard-question-sql-dataset-config-mcp-handler.service.d.ts.map +1 -0
- 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
- package/dist/services/genai/mcp-handlers/solid-create-dashboard-question-sql-dataset-config-mcp-handler.service.js.map +1 -0
- package/dist/services/genai/mcp-handlers/solid-create-dashboard-widget-mcp-handler.service.d.ts +12 -0
- package/dist/services/genai/mcp-handlers/solid-create-dashboard-widget-mcp-handler.service.d.ts.map +1 -0
- 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
- package/dist/services/genai/mcp-handlers/solid-create-dashboard-widget-mcp-handler.service.js.map +1 -0
- package/dist/services/genai/mcp-handlers/solid-create-model-with-fields-mcp-handler.service.d.ts +14 -0
- package/dist/services/genai/mcp-handlers/solid-create-model-with-fields-mcp-handler.service.d.ts.map +1 -0
- 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
- package/dist/services/genai/mcp-handlers/solid-create-model-with-fields-mcp-handler.service.js.map +1 -0
- 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
- package/dist/services/genai/mcp-handlers/solid-create-module-mcp-handler.service.d.ts.map +1 -0
- 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
- package/dist/services/genai/mcp-handlers/solid-create-module-mcp-handler.service.js.map +1 -0
- 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
- package/dist/services/genai/mcp-handlers/solid-update-layout-mcp-handler.service.d.ts.map +1 -0
- 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
- package/dist/services/genai/mcp-handlers/solid-update-layout-mcp-handler.service.js.map +1 -0
- package/dist/services/import-transaction.service.d.ts.map +1 -1
- package/dist/services/import-transaction.service.js +6 -3
- package/dist/services/import-transaction.service.js.map +1 -1
- package/dist/services/menu-item-metadata.service.d.ts.map +1 -1
- package/dist/services/menu-item-metadata.service.js +0 -2
- package/dist/services/menu-item-metadata.service.js.map +1 -1
- package/dist/services/model-metadata.service.d.ts.map +1 -1
- package/dist/services/model-metadata.service.js.map +1 -1
- package/dist/services/module-metadata.service.d.ts.map +1 -1
- package/dist/services/module-metadata.service.js +1 -1
- package/dist/services/module-metadata.service.js.map +1 -1
- package/dist/services/role-metadata.service.d.ts.map +1 -1
- package/dist/services/role-metadata.service.js +1 -7
- package/dist/services/role-metadata.service.js.map +1 -1
- package/dist/services/solid-ts-morph.service.d.ts +28 -0
- package/dist/services/solid-ts-morph.service.d.ts.map +1 -0
- package/dist/services/solid-ts-morph.service.js +222 -0
- package/dist/services/solid-ts-morph.service.js.map +1 -0
- package/dist/solid-core.module.d.ts.map +1 -1
- package/dist/solid-core.module.js +22 -18
- package/dist/solid-core.module.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +7 -4
- package/solid_seed_fixes.ts.txt +93 -0
- package/src/config/iam.config.ts +2 -1
- package/src/controllers/service.controller.ts +43 -2
- package/src/dtos/create-menu-item-metadata.dto.ts +5 -1
- package/src/dtos/create-role-metadata.dto.ts +60 -1
- package/src/helpers/date.helper.ts +13 -0
- package/src/interfaces.ts +29 -2
- package/src/jobs/database/trigger-mcp-client-subscriber-database.service.ts +86 -16
- package/src/repository/view-metadata.repository.ts +15 -0
- package/src/seeders/module-metadata-seeder.service.ts +355 -282
- package/src/seeders/permission-metadata-seeder.service.ts +1 -1
- package/src/seeders/seed-data/solid-core-metadata.json +3 -5
- package/src/services/ai-interaction.service.ts +17 -13
- package/src/services/excel.service.ts +2 -2
- package/src/services/genai/ingest-metadata.service.ts +115 -39
- package/src/services/{mcp-tool-response-handlers/mcp-tool-response-handler-factory.service.ts → genai/mcp-handlers/mcp-handler-factory.service.ts} +5 -5
- package/src/services/genai/mcp-handlers/solid-add-fields-to-model-mcp-handler.service.ts +68 -0
- package/src/services/genai/mcp-handlers/solid-create-computed-provider-mcp-handler.service.ts +71 -0
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- package/src/services/import-transaction.service.ts +12 -4
- package/src/services/menu-item-metadata.service.ts +3 -7
- package/src/services/model-metadata.service.ts +0 -3
- package/src/services/module-metadata.service.ts +2 -3
- package/src/services/role-metadata.service.ts +22 -8
- package/src/services/solid-ts-morph.service.ts +263 -0
- package/src/solid-core.module.ts +25 -19
- package/dist/services/mcp-tool-response-handlers/mcp-tool-response-handler-factory.service.d.ts.map +0 -1
- package/dist/services/mcp-tool-response-handlers/mcp-tool-response-handler-factory.service.js.map +0 -1
- package/dist/services/mcp-tool-response-handlers/solid-add-field-mcp-tool-response-handler.service.d.ts +0 -16
- package/dist/services/mcp-tool-response-handlers/solid-add-field-mcp-tool-response-handler.service.d.ts.map +0 -1
- package/dist/services/mcp-tool-response-handlers/solid-add-field-mcp-tool-response-handler.service.js.map +0 -1
- package/dist/services/mcp-tool-response-handlers/solid-create-dashboard-mcp-tool-response-handler.service.d.ts.map +0 -1
- package/dist/services/mcp-tool-response-handlers/solid-create-dashboard-mcp-tool-response-handler.service.js.map +0 -1
- package/dist/services/mcp-tool-response-handlers/solid-create-dashboard-question-mcp-tool-response-handler.service.d.ts +0 -12
- package/dist/services/mcp-tool-response-handlers/solid-create-dashboard-question-mcp-tool-response-handler.service.d.ts.map +0 -1
- package/dist/services/mcp-tool-response-handlers/solid-create-dashboard-question-mcp-tool-response-handler.service.js.map +0 -1
- package/dist/services/mcp-tool-response-handlers/solid-create-dashboard-question-sql-dataset-config-mcp-tool-response-handler.service.d.ts.map +0 -1
- package/dist/services/mcp-tool-response-handlers/solid-create-dashboard-question-sql-dataset-config-mcp-tool-response-handler.service.js.map +0 -1
- package/dist/services/mcp-tool-response-handlers/solid-create-dashboard-widget-mcp-tool-response-handler.service.d.ts +0 -12
- package/dist/services/mcp-tool-response-handlers/solid-create-dashboard-widget-mcp-tool-response-handler.service.d.ts.map +0 -1
- package/dist/services/mcp-tool-response-handlers/solid-create-dashboard-widget-mcp-tool-response-handler.service.js.map +0 -1
- package/dist/services/mcp-tool-response-handlers/solid-create-model-with-fields-mcp-tool-response-handler.service.d.ts +0 -16
- package/dist/services/mcp-tool-response-handlers/solid-create-model-with-fields-mcp-tool-response-handler.service.d.ts.map +0 -1
- package/dist/services/mcp-tool-response-handlers/solid-create-model-with-fields-mcp-tool-response-handler.service.js.map +0 -1
- package/dist/services/mcp-tool-response-handlers/solid-create-module-mcp-tool-response-handler.service.d.ts.map +0 -1
- package/dist/services/mcp-tool-response-handlers/solid-create-module-mcp-tool-response-handler.service.js.map +0 -1
- package/dist/services/mcp-tool-response-handlers/solid-save-model-layout-mcp-tool-response-handler.service.d.ts.map +0 -1
- package/dist/services/mcp-tool-response-handlers/solid-save-model-layout-mcp-tool-response-handler.service.js.map +0 -1
- 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 "
|
|
4
|
+
import { IMcpToolResponseHandler } from "../../../interfaces";
|
|
5
5
|
|
|
6
6
|
@Injectable()
|
|
7
|
-
export class
|
|
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 {
|
|
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.
|
|
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
|
-
|
|
661
|
-
|
|
662
|
-
|
|
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
|
-
|
|
64
|
-
//
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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
|
+
}
|
package/src/solid-core.module.ts
CHANGED
|
@@ -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
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
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,
|
package/dist/services/mcp-tool-response-handlers/mcp-tool-response-handler-factory.service.d.ts.map
DELETED
|
@@ -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"}
|
package/dist/services/mcp-tool-response-handlers/mcp-tool-response-handler-factory.service.js.map
DELETED
|
@@ -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":";;;;;;;;;;;;AAAA,2CAA4C;AAC5C,yDAAoD;AACpD,0EAAmE;AAKnE,wEAAmE;AACnE,4DAAwD;AACxD,8EAAwE;AACxE,sEAAiE;AACjE,wEAAmE;AACnE,oEAA+D;AAGxD,IAAM,0CAA0C,GAAhD,MAAM,0CAA0C;IAEnD,YACqB,gBAAkC,EAClC,qBAA4C,EAC5C,uBAAgD,EAChD,qBAA4C,EAC5C,oBAA0C,EAC1C,WAAgC;QALhC,qBAAgB,GAAhB,gBAAgB,CAAkB;QAClC,0BAAqB,GAArB,qBAAqB,CAAuB;QAC5C,4BAAuB,GAAvB,uBAAuB,CAAyB;QAChD,0BAAqB,GAArB,qBAAqB,CAAuB;QAC5C,yBAAoB,GAApB,oBAAoB,CAAsB;QAC1C,gBAAW,GAAX,WAAW,CAAqB;IAErD,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,aAA4B;QACpC,MAAM,cAAc,GAAG,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAClE,MAAM,iBAAiB,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;QAErD,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,iBAAiB,CAAC,CAAC;QAElF,MAAM,EAAE,aAAa,EAAE,oBAAoB,EAAE,GAAG,MAAM,IAAI,CAAC,yBAAyB,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;QAE9G,MAAM,IAAI,CAAC,mBAAmB,CAAC,SAAS,EAAE,aAAa,EAAE,oBAAoB,CAAC,CAAC;QAG/E,OAAO;YACH,eAAe,EAAE,KAAK;YACtB,eAAe,EAAE,KAAK;SACzB,CAAA;IACL,CAAC;IAGO,KAAK,CAAC,mBAAmB,CAAC,SAAoB,EAAE,aAAqB,EAAE,oBAAyB;QACpG,MAAM,QAAQ,GAAG;YACb,WAAW,EAAE,SAAS,CAAC,WAAW,IAAI,SAAS,CAAC,IAAI;YACpD,IAAI,EAAE,GAAG,aAAa,IAAI,SAAS,CAAC,IAAI,sBAAsB;YAC9D,cAAc,EAAE,CAAC;YACjB,aAAa,EAAE,oBAAoB,CAAC,IAAI;YACxC,aAAa,EAAE,aAAa;YAC5B,qBAAqB,EAAE,EAAE;SAC5B,CAAC;QAEF,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;QACjE,MAAM,cAAc,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;QAGzC,MAAM,oBAAoB,GAAG,CAAC,SAAS,CAAC,CAAC;QACzC,IAAI,cAAc,EAAE,CAAC;YACjB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,cAAc,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC7C,MAAM,aAAa,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;gBACxC,MAAM,mBAAmB,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC;gBACjF,IAAI,CAAC,mBAAmB,EAAE,CAAC;oBACvB,MAAM,IAAI,KAAK,CAAC,kBAAkB,aAAa,8CAA8C,QAAQ,CAAC,WAAW,GAAG,CAAC,CAAC;gBAC1H,CAAC;gBACD,oBAAoB,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;YACnD,CAAC;QACL,CAAC;QAED,QAAQ,CAAC,OAAO,CAAC,GAAG,oBAAoB,CAAC;QACzC,QAAQ,CAAC,QAAQ,CAAC,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,gBAAgB,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;QAC/F,QAAQ,CAAC,QAAQ,CAAC,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,gBAAgB,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;QAE/F,IAAI,QAAQ,CAAC,qBAAqB,EAAE,CAAC;YACjC,QAAQ,CAAC,gBAAgB,CAAC,GAAG,MAAM,IAAI,CAAC,uBAAuB,CAAC,gBAAgB,CAAC,QAAQ,CAAC,qBAAqB,CAAC,CAAC;QACrH,CAAC;aAAM,CAAC;YACJ,QAAQ,CAAC,gBAAgB,CAAC,GAAG,IAAI,CAAC;QACtC,CAAC;QACD,MAAM,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAAC,QAAgD,CAAC,CAAC;IAChG,CAAC;IAEO,KAAK,CAAC,yBAAyB,CAAC,YAAgC,EAAE,SAAoB;QAC1F,MAAM,aAAa,GAAG,YAAY,CAAC,aAAa,CAAC;QACjD,MAAM,cAAc,GAAG;YACnB,IAAI,EAAE,GAAG,SAAS,CAAC,IAAI,OAAO;YAC9B,WAAW,EAAE,SAAS,CAAC,WAAW,IAAI,SAAS,CAAC,IAAI;YACpD,IAAI,EAAE,QAAQ;YACd,MAAM,EAAE,IAAI;YACZ,OAAO,EAAE,IAAI;YACb,eAAe,EAAE,eAAe,aAAa,6BAA6B,SAAS,CAAC,IAAI,EAAE;YAC1F,aAAa,EAAE,IAAI;YACnB,cAAc,EAAE,EAAE;YAClB,aAAa,EAAE,aAAa;YAC5B,YAAY,EAAE,EAAE;YAChB,WAAW,EAAE,GAAG,SAAS,CAAC,IAAI,OAAO;SACxC,CAAC;QACF,cAAc,CAAC,QAAQ,CAAC,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,gBAAgB,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC;QAC3G,IAAI,cAAc,CAAC,YAAY,EAAE,CAAC;YAC9B,cAAc,CAAC,OAAO,CAAC,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,gBAAgB,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;QAC5G,CAAC;QACD,MAAM,oBAAoB,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;QACrF,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,CAAC;IACnD,CAAC;IAEO,KAAK,CAAC,eAAe,CAAC,iBAAsB;QAChD,MAAM,YAAY,GAAG,IAAA,mCAAe,EAAC,yCAAkB,EAAE,iBAAiB,CAAC,CAAC;QAC5E,YAAY,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC,CAAC;QACxE,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;QACvE,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC;IACvC,CAAC;CACJ,CAAA;AAjGY,gGAA0C;qDAA1C,0CAA0C;IADtD,IAAA,mBAAU,GAAE;qCAI8B,oCAAgB;QACX,+CAAqB;QACnB,oDAAuB;QACzB,+CAAqB;QACtB,6CAAoB;QAC7B,2CAAmB;GAR5C,0CAA0C,CAiGtD","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"}
|