@solidstarters/solid-core 1.2.180 → 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.map +1 -1
- package/dist/controllers/service.controller.js +0 -1
- 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/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 +70 -9
- 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 +5 -5
- package/dist/services/ai-interaction.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} +14 -16
- 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.js +2 -2
- 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 +6 -4
- package/solid_seed_fixes.ts.txt +93 -0
- package/src/config/iam.config.ts +2 -1
- package/src/controllers/service.controller.ts +4 -1
- package/src/dtos/create-menu-item-metadata.dto.ts +5 -1
- package/src/dtos/create-role-metadata.dto.ts +60 -1
- package/src/interfaces.ts +29 -2
- package/src/jobs/database/trigger-mcp-client-subscriber-database.service.ts +74 -8
- 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 +3 -5
- 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} +8 -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 +2 -2
- 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
|
@@ -25,7 +25,7 @@ export class PermissionMetadataSeederService {
|
|
|
25
25
|
for (let id = 0; id < controllers.length; id++) {
|
|
26
26
|
try {
|
|
27
27
|
const controller = controllers[id];
|
|
28
|
-
this.logger.log(`Resolving controller: ${controller.name}`);
|
|
28
|
+
// this.logger.log(`Resolving controller: ${controller.name}`);
|
|
29
29
|
|
|
30
30
|
const methods = controller.methods;
|
|
31
31
|
for (let mId = 0; mId < methods.length; mId++) {
|
|
@@ -12136,6 +12136,7 @@
|
|
|
12136
12136
|
"modelUserKey": "aiInteraction",
|
|
12137
12137
|
"layout": {
|
|
12138
12138
|
"type": "form",
|
|
12139
|
+
"edit": false,
|
|
12139
12140
|
"attrs": {
|
|
12140
12141
|
"name": "form-1",
|
|
12141
12142
|
"label": "AI Interaction",
|
|
@@ -12203,8 +12204,7 @@
|
|
|
12203
12204
|
"type": "field",
|
|
12204
12205
|
"attrs": {
|
|
12205
12206
|
"name": "message",
|
|
12206
|
-
"
|
|
12207
|
-
"rows": 6
|
|
12207
|
+
"viewWidget": "SolidAiInteractionMessageFieldFormWidget"
|
|
12208
12208
|
}
|
|
12209
12209
|
}
|
|
12210
12210
|
]
|
|
@@ -12296,7 +12296,6 @@
|
|
|
12296
12296
|
"type": "field",
|
|
12297
12297
|
"attrs": {
|
|
12298
12298
|
"name": "errorMessage",
|
|
12299
|
-
"editWidget": "textarea",
|
|
12300
12299
|
"rows": 5
|
|
12301
12300
|
}
|
|
12302
12301
|
}
|
|
@@ -12332,8 +12331,7 @@
|
|
|
12332
12331
|
"attrs": {
|
|
12333
12332
|
"name": "metadata",
|
|
12334
12333
|
"height": "80vh",
|
|
12335
|
-
"viewWidget":"SolidAiInteractionMetadataFieldFormWidget"
|
|
12336
|
-
|
|
12334
|
+
"viewWidget": "SolidAiInteractionMetadataFieldFormWidget"
|
|
12337
12335
|
}
|
|
12338
12336
|
}
|
|
12339
12337
|
]
|
|
@@ -14,11 +14,9 @@ import { AiInteraction } from '../entities/ai-interaction.entity';
|
|
|
14
14
|
import * as fs from 'fs/promises';
|
|
15
15
|
import { McpResponse, TriggerMcpClientOptions } from 'src/interfaces';
|
|
16
16
|
import { PublisherFactory } from './queues/publisher-factory.service';
|
|
17
|
-
import { RequestContextService } from './request-context.service';
|
|
18
|
-
import { ActiveUserData } from 'src/interfaces/active-user-data.interface';
|
|
19
|
-
import { McpToolResponseHandlerFactory } from './mcp-tool-response-handlers/mcp-tool-response-handler-factory.service';
|
|
20
17
|
import { ERROR_MESSAGES } from 'src/constants/error-messages';
|
|
21
18
|
import { InvokeAiPromptDto } from 'src/dtos/invoke-ai-prompt.dto';
|
|
19
|
+
import { McpHandlerFactory } from './genai/mcp-handlers/mcp-handler-factory.service';
|
|
22
20
|
|
|
23
21
|
@Injectable()
|
|
24
22
|
export class AiInteractionService extends CRUDService<AiInteraction> {
|
|
@@ -38,7 +36,7 @@ export class AiInteractionService extends CRUDService<AiInteraction> {
|
|
|
38
36
|
readonly moduleRef: ModuleRef,
|
|
39
37
|
readonly publisherFactory: PublisherFactory<TriggerMcpClientOptions>,
|
|
40
38
|
// readonly requestContextService: RequestContextService,
|
|
41
|
-
readonly
|
|
39
|
+
readonly mcpHandlerFactory: McpHandlerFactory,
|
|
42
40
|
|
|
43
41
|
) {
|
|
44
42
|
super(modelMetadataService, moduleMetadataService, configService, fileService, discoveryService, crudHelperService, entityManager, repo, 'aiInteraction', 'solid-core', moduleRef);
|
|
@@ -230,7 +228,7 @@ export class AiInteractionService extends CRUDService<AiInteraction> {
|
|
|
230
228
|
|
|
231
229
|
// TODO: use the toolInvoked to identify a service using some convention.
|
|
232
230
|
// TODO: Eg. if toolInvoked is solid_create_module <> SolidCreateModuleMcpToolHandler ... create a factory class to do this mapping and identify the relevant provider.
|
|
233
|
-
const mcpToolHandler = this.
|
|
231
|
+
const mcpToolHandler = this.mcpHandlerFactory.getInstance(toolInvoked);
|
|
234
232
|
if (!mcpToolHandler) {
|
|
235
233
|
// TODO: RESPONSE SHAPE ALERT Check if we want to control the shape of the response....
|
|
236
234
|
throw new Error(ERROR_MESSAGES.UNABLE_TO_RESOLVE_MCP_HANDLER);
|
|
@@ -123,6 +123,20 @@ export class IngestMetadataService {
|
|
|
123
123
|
// Delete and re-insert a document representing the full json...
|
|
124
124
|
// await this.deleteInsertRagDocumentForModuleMetadataJsonFile(ingestionInfo, fullPath, fileName)
|
|
125
125
|
|
|
126
|
+
// Delete all metadata chunks.
|
|
127
|
+
// const collectionName = `${enabledModule}-rag-collection`;
|
|
128
|
+
// const deleteResult = await this.ragClient.documents.deleteByFilter({
|
|
129
|
+
// filters: {
|
|
130
|
+
// // AND semantics across fields:
|
|
131
|
+
// "$and": [
|
|
132
|
+
// { 'metadata.kind': { $eq: 'solidx-metadata' } },
|
|
133
|
+
// { 'metadata.collectionName': { $eq: collectionName } },
|
|
134
|
+
// { 'title': { $like: '%Ingested Chunks%' } },
|
|
135
|
+
// ]
|
|
136
|
+
// },
|
|
137
|
+
// });
|
|
138
|
+
// this.logger.log(`Deleted existing documents for collectionName: ${collectionName}. Got response:`, deleteResult);
|
|
139
|
+
|
|
126
140
|
// Delete and re-insert a chunk representing the module.
|
|
127
141
|
await this.deleteInsertRagChunkForModule(ingestionInfo, moduleMetadata);
|
|
128
142
|
|
|
@@ -160,37 +174,52 @@ export class IngestMetadataService {
|
|
|
160
174
|
private async resolveRagCollectionForModule(ingestionInfo: ModuleRAGIngestionInfo, moduleName: string): Promise<string> {
|
|
161
175
|
this.logger.debug(`Resolving RAG collection for module: ${moduleName}`);
|
|
162
176
|
|
|
163
|
-
|
|
164
|
-
if (ingestionInfo.collectionId) {
|
|
165
|
-
// See if collection already exists...
|
|
166
|
-
const r = await this.ragClient.collections.list({
|
|
167
|
-
ids: [
|
|
168
|
-
ingestionInfo.collectionId
|
|
169
|
-
]
|
|
170
|
-
});
|
|
171
|
-
|
|
172
|
-
if (r) {
|
|
173
|
-
if (r.results.length === 1) {
|
|
174
|
-
existingCollection = r.results[0];
|
|
175
|
-
}
|
|
176
|
-
if (r.results.length > 1) {
|
|
177
|
-
// TODO: do something that will print a meaningful error on the console...
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
if (!existingCollection) {
|
|
183
|
-
const r = await this.ragClient.collections.create({
|
|
184
|
-
name: `${moduleName}-rag-collection`,
|
|
185
|
-
description: `Collection created to group all documents, chunks related to module: ${moduleName}`
|
|
186
|
-
});
|
|
177
|
+
const collectionName = `${moduleName}-rag-collection`;
|
|
187
178
|
|
|
188
|
-
|
|
179
|
+
// delete and recreate
|
|
180
|
+
// if (alwaysRecreate === true) {
|
|
181
|
+
const existingCollection = await this.ragClient.collections.retrieveByName({
|
|
182
|
+
name: collectionName
|
|
183
|
+
});
|
|
189
184
|
|
|
190
|
-
|
|
185
|
+
if (existingCollection) {
|
|
186
|
+
try {
|
|
187
|
+
await this.ragClient.collections.delete({ id: existingCollection.results.id });
|
|
188
|
+
} catch (e) {
|
|
189
|
+
this.logger.warn(`[Warn] Failed deleteByFilter for collection': ${String(e)}`);
|
|
190
|
+
}
|
|
191
191
|
}
|
|
192
|
+
// }
|
|
193
|
+
|
|
194
|
+
// let existingCollection: CollectionResponse = null;
|
|
195
|
+
// if (ingestionInfo.collectionId) {
|
|
196
|
+
// // See if collection already exists...
|
|
197
|
+
// const r = await this.ragClient.collections.list({
|
|
198
|
+
// ids: [
|
|
199
|
+
// ingestionInfo.collectionId
|
|
200
|
+
// ]
|
|
201
|
+
// });
|
|
202
|
+
|
|
203
|
+
// if (r) {
|
|
204
|
+
// if (r.results.length === 1) {
|
|
205
|
+
// existingCollection = r.results[0];
|
|
206
|
+
// }
|
|
207
|
+
// if (r.results.length > 1) {
|
|
208
|
+
// // TODO: do something that will print a meaningful error on the console...
|
|
209
|
+
// }
|
|
210
|
+
// }
|
|
211
|
+
// }
|
|
212
|
+
|
|
213
|
+
// if (!existingCollection) {
|
|
214
|
+
const r = await this.ragClient.collections.create({
|
|
215
|
+
name: collectionName,
|
|
216
|
+
description: `Collection created to group all documents, chunks related to module: ${moduleName}`
|
|
217
|
+
});
|
|
192
218
|
|
|
193
|
-
|
|
219
|
+
// TODO: for some reason if we are unable to create a collection then fail with a visible error message in the console...
|
|
220
|
+
return r.results.id;
|
|
221
|
+
// }
|
|
222
|
+
// return existingCollection.id;
|
|
194
223
|
}
|
|
195
224
|
|
|
196
225
|
private async deleteInsertRagDocumentForModuleMetadataJsonFile(ingestionInfo: ModuleRAGIngestionInfo, fullPath: string, fileName: string): Promise<void> {
|
|
@@ -298,12 +327,35 @@ Usage: Use this chunk to choose the correct model/field chunks for code generati
|
|
|
298
327
|
};
|
|
299
328
|
|
|
300
329
|
// Delete previous chunk if we have one
|
|
301
|
-
if (ingestionInfo.moduleChunkId) {
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
330
|
+
// if (ingestionInfo.moduleChunkId) {
|
|
331
|
+
// try {
|
|
332
|
+
// await this.ragClient.documents.delete({ id: ingestionInfo.moduleChunkId });
|
|
333
|
+
// } catch (e) {
|
|
334
|
+
// this.logger.warn(`[Warn] Failed deleting old module chunk (${ingestionInfo.moduleChunkId}): ${String(e)}`);
|
|
335
|
+
// }
|
|
336
|
+
// }
|
|
337
|
+
|
|
338
|
+
// We changed the approach to delete and re-create using metadata.
|
|
339
|
+
// delete any existing module records by metadata (idempotent)
|
|
340
|
+
try {
|
|
341
|
+
const deleteResult = await this.ragClient.documents.deleteByFilter({
|
|
342
|
+
filters: {
|
|
343
|
+
// AND semantics across fields:
|
|
344
|
+
"$and": [
|
|
345
|
+
{ 'metadata.kind': { $eq: 'solidx-metadata' } },
|
|
346
|
+
{ 'metadata.type': { $eq: 'module' } },
|
|
347
|
+
{ 'metadata.moduleName': { $eq: moduleName } },
|
|
348
|
+
// (optional but nice to constrain tightly if you always set it)
|
|
349
|
+
{ 'metadata.collectionName': { $eq: `${moduleName}-rag-collection` } },
|
|
350
|
+
]
|
|
351
|
+
},
|
|
352
|
+
});
|
|
353
|
+
|
|
354
|
+
this.logger.log(`Deleted existing module document for moduleName: ${moduleName}. Got response:`, deleteResult);
|
|
355
|
+
|
|
356
|
+
} catch (e) {
|
|
357
|
+
this.logger.warn(`[Warn] Failed deleteByFilter for module '${moduleName}': ${String(e)}`);
|
|
358
|
+
// Non-fatal: we can still proceed to create; caller’s auth will limit scope anyway
|
|
307
359
|
}
|
|
308
360
|
|
|
309
361
|
const r = await this.ragClient.documents.create({
|
|
@@ -407,12 +459,36 @@ ${JSON.stringify(model)}
|
|
|
407
459
|
};
|
|
408
460
|
|
|
409
461
|
// 5) Delete previous chunk if present
|
|
410
|
-
if (modelEntry.modelChunkId) {
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
462
|
+
// if (modelEntry.modelChunkId) {
|
|
463
|
+
// try {
|
|
464
|
+
// await this.ragClient.documents.delete({ id: modelEntry.modelChunkId });
|
|
465
|
+
// } catch (e) {
|
|
466
|
+
// this.logger.warn(`[Warn] Failed deleting old model chunk (${modelEntry.modelChunkId}): ${String(e)}`);
|
|
467
|
+
// }
|
|
468
|
+
// }
|
|
469
|
+
|
|
470
|
+
// We changed the approach to delete and re-create using metadata.
|
|
471
|
+
// delete any existing module records by metadata (idempotent)
|
|
472
|
+
try {
|
|
473
|
+
const deleteResult = await this.ragClient.documents.deleteByFilter({
|
|
474
|
+
filters: {
|
|
475
|
+
// AND semantics across fields:
|
|
476
|
+
"$and": [
|
|
477
|
+
{ 'metadata.kind': { $eq: 'solidx-metadata' } },
|
|
478
|
+
{ 'metadata.type': { $eq: 'model' } },
|
|
479
|
+
{ 'metadata.moduleName': { $eq: moduleName } },
|
|
480
|
+
{ 'metadata.modelName': { $eq: modelName } },
|
|
481
|
+
// (optional but nice to constrain tightly if you always set it)
|
|
482
|
+
{ 'metadata.collectionName': { $eq: `${moduleName}-rag-collection` } },
|
|
483
|
+
]
|
|
484
|
+
},
|
|
485
|
+
});
|
|
486
|
+
|
|
487
|
+
this.logger.log(`Deleted existing model document for modelName: ${modelName}. Got response:`, deleteResult);
|
|
488
|
+
|
|
489
|
+
} catch (e) {
|
|
490
|
+
this.logger.warn(`[Warn] Failed deleteByFilter for module '${moduleName}': ${String(e)}`);
|
|
491
|
+
// Non-fatal: we can still proceed to create; caller’s auth will limit scope anyway
|
|
416
492
|
}
|
|
417
493
|
|
|
418
494
|
// 6) Create new document (R2R auto-generates the ID)
|
|
@@ -2,12 +2,12 @@ import { Injectable, Logger } from '@nestjs/common';
|
|
|
2
2
|
|
|
3
3
|
import { classify } from '@angular-devkit/core/src/utils/strings';
|
|
4
4
|
import { IMcpToolResponseHandler } from 'src/interfaces';
|
|
5
|
-
import { SolidIntrospectService } from '
|
|
5
|
+
import { SolidIntrospectService } from '../../solid-introspect.service';
|
|
6
6
|
|
|
7
7
|
|
|
8
8
|
@Injectable()
|
|
9
|
-
export class
|
|
10
|
-
private readonly logger = new Logger(
|
|
9
|
+
export class McpHandlerFactory {
|
|
10
|
+
private readonly logger = new Logger(McpHandlerFactory.name);
|
|
11
11
|
|
|
12
12
|
constructor(
|
|
13
13
|
private readonly solidIntrospectionService: SolidIntrospectService
|
|
@@ -17,9 +17,9 @@ export class McpToolResponseHandlerFactory {
|
|
|
17
17
|
getInstance(toolInvoked: string): IMcpToolResponseHandler {
|
|
18
18
|
toolInvoked = classify(toolInvoked);
|
|
19
19
|
|
|
20
|
-
let resolvedHandlerName = `${toolInvoked}
|
|
20
|
+
let resolvedHandlerName = `${toolInvoked}McpHandler`;
|
|
21
21
|
|
|
22
|
-
//
|
|
22
|
+
// Get hold of the tool response handler instance using the tool name used.
|
|
23
23
|
let actualHandler = this.solidIntrospectionService.getProvider(resolvedHandlerName);
|
|
24
24
|
if (!actualHandler) {
|
|
25
25
|
throw new Error(`Unable to locate mcp tool handler with name ${resolvedHandlerName}`);
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { Injectable } from "@nestjs/common";
|
|
2
|
+
import { UpdateModelMetaDataDto } from "src/dtos/update-model-metadata.dto";
|
|
3
|
+
import { AiInteraction } from "src/entities/ai-interaction.entity";
|
|
4
|
+
import { FieldMetadata } from "src/entities/field-metadata.entity";
|
|
5
|
+
import { IMcpToolResponseHandler } from "../../../interfaces";
|
|
6
|
+
import { ModelMetadataService } from "../../model-metadata.service";
|
|
7
|
+
|
|
8
|
+
@Injectable()
|
|
9
|
+
// solid_add_field
|
|
10
|
+
export class SolidAddFieldsToModelMcpHandler implements IMcpToolResponseHandler {
|
|
11
|
+
|
|
12
|
+
constructor(
|
|
13
|
+
private readonly modelMetadataService: ModelMetadataService,
|
|
14
|
+
) {
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
async apply(aiInteraction: AiInteraction) {
|
|
18
|
+
// const aiResponse = JSON.parse(aiInteraction.message);
|
|
19
|
+
const escapedMessage = aiInteraction.message.replace(/\\'/g, "'");
|
|
20
|
+
const aiResponseMessage = JSON.parse(escapedMessage);
|
|
21
|
+
|
|
22
|
+
// {
|
|
23
|
+
// "generation_status": "success",
|
|
24
|
+
// "instructions": "<optional string>",
|
|
25
|
+
// "data": {
|
|
26
|
+
// "modelUserKey": "<existing model name>",
|
|
27
|
+
// "schemaPatch": {
|
|
28
|
+
// "fieldsToAdd": [
|
|
29
|
+
// <json representing each of the fields to be added>
|
|
30
|
+
// ]
|
|
31
|
+
// }
|
|
32
|
+
// }
|
|
33
|
+
// }
|
|
34
|
+
// const { modelUserKey, fieldSchema } = aiResponseMessage;
|
|
35
|
+
const { data } = aiResponseMessage;
|
|
36
|
+
const { modelUserKey, schemaPatch } = data;
|
|
37
|
+
const { fieldsToAdd } = schemaPatch;
|
|
38
|
+
|
|
39
|
+
// TODO: Validate if another field with same name exists, if it does then raise an error...
|
|
40
|
+
|
|
41
|
+
// TODO: load the model with the fields.
|
|
42
|
+
const modelMetadata = await this.modelMetadataService.findOneByUserKey(modelUserKey, ['fields']);
|
|
43
|
+
if (!modelMetadata) {
|
|
44
|
+
throw new Error(`Model with user key ${modelUserKey} not found.`);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
for (let i = 0; i < fieldsToAdd.length; i++) {
|
|
48
|
+
const fieldSchema = fieldsToAdd[i];
|
|
49
|
+
|
|
50
|
+
// Add the fieldSchema to the model fields array
|
|
51
|
+
fieldSchema['modelId'] = modelMetadata.id;
|
|
52
|
+
modelMetadata.fields.push(fieldSchema as FieldMetadata);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// This adds the field to the respective model metadat...
|
|
56
|
+
await this.modelMetadataService.update(modelMetadata.id, modelMetadata as unknown as UpdateModelMetaDataDto);
|
|
57
|
+
|
|
58
|
+
// Now we need to run solid seed & then solid refresh-model --name <module-name>
|
|
59
|
+
await this.modelMetadataService.handleGenerateCode({ modelId: modelMetadata.id });
|
|
60
|
+
|
|
61
|
+
// TODO: decide on some shape to return hre...
|
|
62
|
+
return {
|
|
63
|
+
seedingRequired: true,
|
|
64
|
+
serverRebooting: true,
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { Injectable, Logger } from "@nestjs/common";
|
|
2
|
+
import { AiInteraction } from "src/entities/ai-interaction.entity";
|
|
3
|
+
import { IMcpToolResponseHandler, McpComputedProviderResponse, PlanStep } from "../../../interfaces";
|
|
4
|
+
import { SolidTsMorphService } from "src/services/solid-ts-morph.service";
|
|
5
|
+
|
|
6
|
+
const RESTART_TOUCH_FILE = process.env.MCP_RESTART_TOUCH_FILE || "tmp/restart.touch";
|
|
7
|
+
|
|
8
|
+
@Injectable()
|
|
9
|
+
export class SolidCreateComputedProviderMcpHandler implements IMcpToolResponseHandler {
|
|
10
|
+
private readonly logger = new Logger(SolidCreateComputedProviderMcpHandler.name);
|
|
11
|
+
|
|
12
|
+
constructor(private readonly tsMorph: SolidTsMorphService) { }
|
|
13
|
+
|
|
14
|
+
async apply(aiInteraction: AiInteraction) {
|
|
15
|
+
const raw = this.safeParse(aiInteraction.message);
|
|
16
|
+
const payload: McpComputedProviderResponse | undefined = (raw?.data?.plan ? raw.data : raw) as McpComputedProviderResponse;
|
|
17
|
+
|
|
18
|
+
if (!payload || !Array.isArray(payload.plan)) {
|
|
19
|
+
throw new Error("SolidCreateComputedProviderMcpHandler: invalid MCP response; missing plan[]");
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
// Batch all plan steps in a single txn so nodemon restarts only once.
|
|
23
|
+
this.tsMorph.begin();
|
|
24
|
+
try {
|
|
25
|
+
for (const step of payload.plan as PlanStep[]) {
|
|
26
|
+
switch (step.type) {
|
|
27
|
+
case "createNewFile": {
|
|
28
|
+
const overwrite = step.overwrite ?? false;
|
|
29
|
+
this.tsMorph.createNewFile(step.path, step.content, overwrite);
|
|
30
|
+
break;
|
|
31
|
+
}
|
|
32
|
+
case "registerNestProvider": {
|
|
33
|
+
const uniqueGuard = step.uniqueGuard ?? true;
|
|
34
|
+
this.tsMorph.registerNestProvider(
|
|
35
|
+
step.modulePath,
|
|
36
|
+
step.providerClassName,
|
|
37
|
+
step.importFrom,
|
|
38
|
+
step.registerIn,
|
|
39
|
+
uniqueGuard,
|
|
40
|
+
);
|
|
41
|
+
break;
|
|
42
|
+
}
|
|
43
|
+
default:
|
|
44
|
+
throw new Error(`Unsupported plan step type: ${(step as any).type}`);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
const result = await this.tsMorph.commit();
|
|
49
|
+
|
|
50
|
+
return {
|
|
51
|
+
seedingRequired: false,
|
|
52
|
+
serverRebooting: false,
|
|
53
|
+
appliedSteps: payload.plan.length,
|
|
54
|
+
wroteFiles: result.wrote,
|
|
55
|
+
};
|
|
56
|
+
} catch (err) {
|
|
57
|
+
this.logger.error(`Apply failed; rolling back. ${String(err)}`);
|
|
58
|
+
this.tsMorph.rollback();
|
|
59
|
+
throw err;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
private safeParse(str: string): any {
|
|
64
|
+
try {
|
|
65
|
+
return JSON.parse(str);
|
|
66
|
+
} catch {
|
|
67
|
+
const unescaped = str.replace(/\\'/g, "'");
|
|
68
|
+
return JSON.parse(unescaped);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
@@ -4,16 +4,16 @@ import { CreateDashboardDto } from "src/dtos/create-dashboard.dto";
|
|
|
4
4
|
import { UpdateMenuItemMetadataDto } from "src/dtos/update-menu-item-metadata.dto";
|
|
5
5
|
import { AiInteraction } from "src/entities/ai-interaction.entity";
|
|
6
6
|
import { Dashboard } from "src/entities/dashboard.entity";
|
|
7
|
-
import { IMcpToolResponseHandler } from "
|
|
8
|
-
import { ActionMetadataService } from "
|
|
9
|
-
import { DashboardService } from "
|
|
10
|
-
import { MenuItemMetadataService } from "
|
|
11
|
-
import { ModelMetadataService } from "
|
|
12
|
-
import { ModuleMetadataService } from "
|
|
13
|
-
import { RoleMetadataService } from "
|
|
7
|
+
import { IMcpToolResponseHandler } from "../../../interfaces";
|
|
8
|
+
import { ActionMetadataService } from "../../action-metadata.service";
|
|
9
|
+
import { DashboardService } from "../../dashboard.service";
|
|
10
|
+
import { MenuItemMetadataService } from "../../menu-item-metadata.service";
|
|
11
|
+
import { ModelMetadataService } from "../../model-metadata.service";
|
|
12
|
+
import { ModuleMetadataService } from "../../module-metadata.service";
|
|
13
|
+
import { RoleMetadataService } from "../../role-metadata.service";
|
|
14
14
|
|
|
15
15
|
@Injectable()
|
|
16
|
-
export class
|
|
16
|
+
export class SolidCreateDashboardMcpHandler implements IMcpToolResponseHandler {
|
|
17
17
|
|
|
18
18
|
constructor(
|
|
19
19
|
private readonly dashboardService: DashboardService,
|
|
@@ -2,11 +2,11 @@ import { Injectable } from "@nestjs/common";
|
|
|
2
2
|
import { plainToInstance } from "class-transformer";
|
|
3
3
|
import { CreateDashboardQuestionDto } from "src/dtos/create-dashboard-question.dto";
|
|
4
4
|
import { AiInteraction } from "src/entities/ai-interaction.entity";
|
|
5
|
-
import { IMcpToolResponseHandler } from "
|
|
6
|
-
import { DashboardQuestionService } from "
|
|
5
|
+
import { IMcpToolResponseHandler } from "../../../interfaces";
|
|
6
|
+
import { DashboardQuestionService } from "../../dashboard-question.service";
|
|
7
7
|
|
|
8
8
|
@Injectable()
|
|
9
|
-
export class
|
|
9
|
+
export class SolidCreateDashboardQuestionMcpHandler implements IMcpToolResponseHandler {
|
|
10
10
|
|
|
11
11
|
constructor(
|
|
12
12
|
private readonly dashboardQuestionService: DashboardQuestionService,
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { Injectable } from "@nestjs/common";
|
|
2
2
|
import { plainToInstance } from "class-transformer";
|
|
3
3
|
import { AiInteraction } from "src/entities/ai-interaction.entity";
|
|
4
|
-
import { IMcpToolResponseHandler } from "
|
|
5
|
-
import { DashboardQuestionSqlDatasetConfigService } from "
|
|
4
|
+
import { IMcpToolResponseHandler } from "../../../interfaces";
|
|
5
|
+
import { DashboardQuestionSqlDatasetConfigService } from "../../dashboard-question-sql-dataset-config.service";
|
|
6
6
|
import { CreateDashboardQuestionSqlDatasetConfigDto } from "src/dtos/create-dashboard-question-sql-dataset-config.dto";
|
|
7
7
|
|
|
8
8
|
@Injectable()
|
|
9
|
-
export class
|
|
9
|
+
export class SolidCreateDashboardQuestionSqlDatasetConfigMcpHandler implements IMcpToolResponseHandler {
|
|
10
10
|
|
|
11
11
|
constructor(
|
|
12
12
|
private readonly dashboardQuestionSqlDatasetConfigService: DashboardQuestionSqlDatasetConfigService,
|
|
@@ -2,11 +2,11 @@ import { Injectable } from "@nestjs/common";
|
|
|
2
2
|
import { plainToInstance } from "class-transformer";
|
|
3
3
|
import { CreateDashboardQuestionDto } from "src/dtos/create-dashboard-question.dto";
|
|
4
4
|
import { AiInteraction } from "src/entities/ai-interaction.entity";
|
|
5
|
-
import { IMcpToolResponseHandler } from "
|
|
6
|
-
import { DashboardQuestionService } from "
|
|
5
|
+
import { IMcpToolResponseHandler } from "../../../interfaces";
|
|
6
|
+
import { DashboardQuestionService } from "../../dashboard-question.service";
|
|
7
7
|
|
|
8
8
|
@Injectable()
|
|
9
|
-
export class
|
|
9
|
+
export class SolidCreateDashboardWidgetMcpHandler implements IMcpToolResponseHandler {
|
|
10
10
|
|
|
11
11
|
constructor(
|
|
12
12
|
private readonly dashboardQuestionService: DashboardQuestionService,
|
|
@@ -1,19 +1,16 @@
|
|
|
1
1
|
import { Injectable } from "@nestjs/common";
|
|
2
|
-
import { IMcpToolResponseHandler } from "
|
|
2
|
+
import { IMcpToolResponseHandler } from "../../../interfaces";
|
|
3
3
|
import { AiInteraction } from "src/entities/ai-interaction.entity";
|
|
4
|
-
import {
|
|
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 "
|
|
8
|
-
import { model } from "mongoose";
|
|
6
|
+
import { ModuleMetadataService } from "../../module-metadata.service";
|
|
9
7
|
|
|
10
8
|
@Injectable()
|
|
11
|
-
export class
|
|
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 {
|
|
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
|
-
|
|
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(
|
|
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 "
|
|
2
|
+
import { IMcpToolResponseHandler } from "../../../interfaces";
|
|
3
3
|
import { AiInteraction } from "src/entities/ai-interaction.entity";
|
|
4
|
-
import { ModuleMetadataService } from "
|
|
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
|
|
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
|
|
19
|
+
const escapedMessage = aiInteraction.message.replace(/\\'/g, "'");
|
|
20
|
+
const aiResponseMessage = JSON.parse(escapedMessage);
|
|
20
21
|
|
|
21
|
-
const
|
|
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 "
|
|
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
|
|
|
@@ -659,10 +659,10 @@ export class ImportTransactionService extends CRUDService<ImportTransaction> {
|
|
|
659
659
|
return dtoRecord;
|
|
660
660
|
}
|
|
661
661
|
// Use flexible date parser
|
|
662
|
-
|
|
662
|
+
this.logger.verbose(cellValue,'cellValue');
|
|
663
663
|
|
|
664
664
|
const dateValue = parseFlexibleDate(cellValue);
|
|
665
|
-
|
|
665
|
+
this.logger.verbose(dateValue,'dateValue');
|
|
666
666
|
|
|
667
667
|
if (!dateValue) {
|
|
668
668
|
throw new Error(
|