@solidstarters/solid-core 1.2.136 → 1.2.137
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/dist/controllers/ai-interaction.controller.d.ts +1 -0
- package/dist/controllers/ai-interaction.controller.d.ts.map +1 -1
- package/dist/controllers/ai-interaction.controller.js +12 -0
- package/dist/controllers/ai-interaction.controller.js.map +1 -1
- package/dist/interfaces.d.ts +5 -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.map +1 -1
- package/dist/jobs/database/trigger-mcp-client-subscriber-database.service.js +23 -3
- package/dist/jobs/database/trigger-mcp-client-subscriber-database.service.js.map +1 -1
- package/dist/services/ai-interaction.service.d.ts +4 -1
- package/dist/services/ai-interaction.service.d.ts.map +1 -1
- package/dist/services/ai-interaction.service.js +34 -4
- package/dist/services/ai-interaction.service.js.map +1 -1
- package/dist/services/mcp-tool-response-handlers/mcp-tool-response-handler-factory.service.d.ts +9 -0
- package/dist/services/mcp-tool-response-handlers/mcp-tool-response-handler-factory.service.d.ts.map +1 -0
- package/dist/services/mcp-tool-response-handlers/mcp-tool-response-handler-factory.service.js +40 -0
- package/dist/services/mcp-tool-response-handlers/mcp-tool-response-handler-factory.service.js.map +1 -0
- package/dist/services/mcp-tool-response-handlers/solid-create-module-mcp-tool-response-handler.service.d.ts +11 -0
- package/dist/services/mcp-tool-response-handlers/solid-create-module-mcp-tool-response-handler.service.d.ts.map +1 -0
- package/dist/services/mcp-tool-response-handlers/solid-create-module-mcp-tool-response-handler.service.js +46 -0
- package/dist/services/mcp-tool-response-handlers/solid-create-module-mcp-tool-response-handler.service.js.map +1 -0
- package/dist/services/module-metadata.service.d.ts.map +1 -1
- package/dist/services/module-metadata.service.js.map +1 -1
- package/dist/services/scheduled-jobs/scheduled-job.interface.d.ts +1 -1
- package/dist/services/scheduled-jobs/scheduled-job.interface.d.ts.map +1 -1
- package/dist/services/scheduled-jobs/scheduled-job.interface.js.map +1 -1
- package/dist/services/scheduled-jobs/scheduler.service.js +1 -6
- package/dist/services/scheduled-jobs/scheduler.service.js.map +1 -1
- package/dist/solid-core.module.d.ts.map +1 -1
- package/dist/solid-core.module.js +4 -0
- package/dist/solid-core.module.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/src/controllers/ai-interaction.controller.ts +6 -0
- package/src/interfaces.ts +6 -0
- package/src/jobs/database/trigger-mcp-client-subscriber-database.service.ts +29 -11
- package/src/services/ai-interaction.service.ts +50 -2
- package/src/services/mcp-tool-response-handlers/mcp-tool-response-handler-factory.service.ts +36 -0
- package/src/services/mcp-tool-response-handlers/solid-create-module-mcp-tool-response-handler.service.ts +52 -0
- package/src/services/module-metadata.service.ts +0 -5
- package/src/services/scheduled-jobs/scheduled-job.interface.ts +1 -1
- package/src/services/scheduled-jobs/scheduler.service.ts +6 -6
- package/src/solid-core.module.ts +5 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@solidstarters/solid-core",
|
|
3
|
-
"version": "1.2.
|
|
3
|
+
"version": "1.2.137",
|
|
4
4
|
"description": "This module is a NestJS module containing all the required core providers required by a Solid application",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -96,6 +96,12 @@ export class AiInteractionController {
|
|
|
96
96
|
return this.service.triggerMcpClientJob(dto.prompt);
|
|
97
97
|
}
|
|
98
98
|
|
|
99
|
+
@ApiBearerAuth("jwt")
|
|
100
|
+
@Post(':id/apply-solid-ai-interaction')
|
|
101
|
+
async applySolidAiInteraction(@Param('id') id: number) {
|
|
102
|
+
return this.service.applySolidAiInteraction(+id);
|
|
103
|
+
}
|
|
104
|
+
|
|
99
105
|
@ApiBearerAuth("jwt")
|
|
100
106
|
@Post('/run-mcp-prompt')
|
|
101
107
|
async runMcpPrompt(@Body() dto: InvokeAiPromptDto) {
|
package/src/interfaces.ts
CHANGED
|
@@ -13,6 +13,7 @@ import { DashboardQuestion } from './entities/dashboard-question.entity';
|
|
|
13
13
|
import { ComputedFieldMetadata } from './helpers/solid-registry';
|
|
14
14
|
import { SqlExpression } from './services/question-data-providers/chartjs-sql-data-provider.service';
|
|
15
15
|
import { CreateDashboardDto } from './dtos/create-dashboard.dto';
|
|
16
|
+
import { AiInteraction } from './entities/ai-interaction.entity';
|
|
16
17
|
|
|
17
18
|
export interface FieldCrudManager {
|
|
18
19
|
// fieldMetadata: FieldMetadata;
|
|
@@ -77,6 +78,7 @@ export interface McpResponse {
|
|
|
77
78
|
duration_ms?: number;
|
|
78
79
|
errors?: string[];
|
|
79
80
|
trace?: string[];
|
|
81
|
+
content_type?: string;
|
|
80
82
|
}
|
|
81
83
|
|
|
82
84
|
export interface ISelectionProviderContext {
|
|
@@ -101,6 +103,10 @@ export interface ISelectionProvider<T extends ISelectionProviderContext> {
|
|
|
101
103
|
export interface IDashboardVariableSelectionProvider<T extends ISelectionProviderContext> extends ISelectionProvider<T> {
|
|
102
104
|
}
|
|
103
105
|
|
|
106
|
+
export interface IMcpToolResponseHandler {
|
|
107
|
+
apply(aiInteraction: AiInteraction);
|
|
108
|
+
}
|
|
109
|
+
|
|
104
110
|
export interface IDashboardQuestionDataProvider<TContext, TData> {
|
|
105
111
|
help(): string;
|
|
106
112
|
|
|
@@ -34,36 +34,54 @@ export class TriggerMcpClientSubscriberDatabase extends DatabaseSubscriber<Trigg
|
|
|
34
34
|
const aiInteraction = await this.aiInteractionService.findOne(codeGnerationOptions.aiInteractionId, {
|
|
35
35
|
populate: ['user']
|
|
36
36
|
});
|
|
37
|
+
if (!aiInteraction) {
|
|
38
|
+
const m = `Unable to identified the aiInteraction entry that triggered this job... using id: ${codeGnerationOptions.aiInteractionId}`
|
|
39
|
+
this.triggerMcpClientSubscriberLogger.log(m);
|
|
40
|
+
throw new Error(m);
|
|
41
|
+
}
|
|
37
42
|
|
|
38
43
|
// The message contains the users prompt.
|
|
39
44
|
const prompt = aiInteraction.message;
|
|
40
45
|
|
|
41
46
|
// Use this to invoke our mcp client
|
|
42
47
|
const aiResponse = await this.aiInteractionService.runMcpPrompt(prompt);
|
|
43
|
-
|
|
48
|
+
this.triggerMcpClientSubscriberLogger.log(`aiResponse: `);
|
|
49
|
+
this.triggerMcpClientSubscriberLogger.log(JSON.stringify(aiResponse));
|
|
50
|
+
|
|
44
51
|
if (!aiResponse.success) {
|
|
45
|
-
|
|
46
|
-
|
|
52
|
+
this.triggerMcpClientSubscriberLogger.log(`Gen ai has returned with a false status code`);
|
|
53
|
+
|
|
54
|
+
const errorsStr = aiResponse.errors.join('; ');
|
|
55
|
+
|
|
56
|
+
await this.aiInteractionService.create({
|
|
57
|
+
userId: aiInteraction.user.id,
|
|
58
|
+
threadId: aiInteraction.threadId,
|
|
59
|
+
role: 'gen-ai',
|
|
60
|
+
message: '-',
|
|
61
|
+
contentType: aiResponse.content_type,
|
|
62
|
+
errorMessage: errorsStr,
|
|
63
|
+
modelUsed: aiResponse.model,
|
|
64
|
+
responseTimeMs: aiResponse.duration_ms,
|
|
65
|
+
metadata: JSON.stringify(aiResponse)
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
// update the job entry with failure... raising an error will lead the job to be marked as failed...
|
|
69
|
+
throw new Error(errorsStr);
|
|
47
70
|
}
|
|
48
71
|
else {
|
|
49
|
-
|
|
50
|
-
// const updatedDto = {
|
|
51
|
-
// ...aiInteraction,
|
|
52
|
-
// message: nestedResponse,
|
|
53
|
-
// }
|
|
54
|
-
// await this.aiInteractionService.update(codeGnerationOptions.aiInteractionId, updatedDto);
|
|
72
|
+
let nestedResponse = aiResponse.response.trim();
|
|
55
73
|
|
|
56
74
|
await this.aiInteractionService.create({
|
|
57
75
|
userId: aiInteraction.user.id,
|
|
58
76
|
threadId: aiInteraction.threadId,
|
|
59
77
|
role: 'gen-ai',
|
|
60
78
|
message: nestedResponse,
|
|
61
|
-
contentType:
|
|
79
|
+
contentType: aiResponse.content_type,
|
|
62
80
|
errorMessage: '',
|
|
63
81
|
modelUsed: aiResponse.model,
|
|
64
82
|
responseTimeMs: aiResponse.duration_ms,
|
|
65
83
|
metadata: JSON.stringify(aiResponse)
|
|
66
|
-
})
|
|
84
|
+
});
|
|
67
85
|
}
|
|
68
86
|
|
|
69
87
|
return aiResponse;
|
|
@@ -16,6 +16,7 @@ import { McpResponse, TriggerMcpClientOptions } from 'src/interfaces';
|
|
|
16
16
|
import { PublisherFactory } from './queues/publisher-factory.service';
|
|
17
17
|
import { RequestContextService } from './request-context.service';
|
|
18
18
|
import { ActiveUserData } from 'src/interfaces/active-user-data.interface';
|
|
19
|
+
import { McpToolResponseHandlerFactory } from './mcp-tool-response-handlers/mcp-tool-response-handler-factory.service';
|
|
19
20
|
|
|
20
21
|
@Injectable()
|
|
21
22
|
export class AiInteractionService extends CRUDService<AiInteraction> {
|
|
@@ -35,6 +36,7 @@ export class AiInteractionService extends CRUDService<AiInteraction> {
|
|
|
35
36
|
readonly moduleRef: ModuleRef,
|
|
36
37
|
readonly publisherFactory: PublisherFactory<TriggerMcpClientOptions>,
|
|
37
38
|
readonly requestContextService: RequestContextService,
|
|
39
|
+
readonly mcpToolResponseHandlerFactory: McpToolResponseHandlerFactory,
|
|
38
40
|
|
|
39
41
|
) {
|
|
40
42
|
super(modelMetadataService, moduleMetadataService, configService, fileService, discoveryService, crudHelperService, entityManager, repo, 'aiInteraction', 'solid-core', moduleRef);
|
|
@@ -101,9 +103,9 @@ export class AiInteractionService extends CRUDService<AiInteraction> {
|
|
|
101
103
|
// TODO: Refactor to use the command.service.ts instead...
|
|
102
104
|
return new Promise((resolve, reject) => {
|
|
103
105
|
this.logger.log(`Attempting to run command:`)
|
|
104
|
-
this.logger.log(`${pythonExecutable} ${mcpClient} ${prompt}`);
|
|
106
|
+
this.logger.log(`${pythonExecutable} ${mcpClient} "${prompt}"`);
|
|
105
107
|
|
|
106
|
-
const python = spawn(pythonExecutable, [mcpClient, prompt]);
|
|
108
|
+
const python = spawn(pythonExecutable, [mcpClient, `"${prompt}"`]);
|
|
107
109
|
|
|
108
110
|
let stdout = '';
|
|
109
111
|
let stderr = '';
|
|
@@ -160,4 +162,50 @@ export class AiInteractionService extends CRUDService<AiInteraction> {
|
|
|
160
162
|
return response;
|
|
161
163
|
}
|
|
162
164
|
|
|
165
|
+
async applySolidAiInteraction(id: number) {
|
|
166
|
+
// Fetch the aiInteraction
|
|
167
|
+
const aiInteraction = await this.findOne(id, {
|
|
168
|
+
populate: ['user']
|
|
169
|
+
});
|
|
170
|
+
if (!aiInteraction) {
|
|
171
|
+
const m = `Unable to identified the aiInteraction entry that triggered this job... using id: ${id}`
|
|
172
|
+
|
|
173
|
+
// TODO: RESPONSE SHAPE ALERT Check if we want to control the shape of the response....
|
|
174
|
+
throw new Error(m);
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
// TODO: Validation: Check if JSON.parse(metadata).tools_invoked starts with solid_
|
|
178
|
+
let metadata = {};
|
|
179
|
+
try {
|
|
180
|
+
metadata = JSON.parse(aiInteraction.metadata);
|
|
181
|
+
}
|
|
182
|
+
catch (e) {
|
|
183
|
+
// TODO: RESPONSE SHAPE ALERT Check if we want to control the shape of the response....
|
|
184
|
+
throw new Error(e);
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
const toolsInvoked = metadata['tools_invoked'];
|
|
188
|
+
if (!toolsInvoked) {
|
|
189
|
+
// TODO: RESPONSE SHAPE ALERT Check if we want to control the shape of the response....
|
|
190
|
+
throw new Error('Unable to resolve a solid_ command that was used to come up with this response.');
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
// TODO: OPTIMISATION for chained tool invocation, for now we are assuming only 1 tool was used.
|
|
194
|
+
const toolInvoked = toolsInvoked[0];
|
|
195
|
+
|
|
196
|
+
// TODO: use the toolInvoked to identify a service using some convention.
|
|
197
|
+
// TODO: Eg. if toolInvoked is solid_create_module <> SolidCreateModuleMcpToolHandler ... create a factory class to do this mapping and identify the relevant provider.
|
|
198
|
+
const mcpToolHandler = this.mcpToolResponseHandlerFactory.getInstance(toolInvoked);
|
|
199
|
+
if (!mcpToolHandler) {
|
|
200
|
+
// TODO: RESPONSE SHAPE ALERT Check if we want to control the shape of the response....
|
|
201
|
+
throw new Error('Unable to resolve a mcp tool handler.');
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
const handlerApplicationResponse = await mcpToolHandler.apply(aiInteraction);
|
|
205
|
+
|
|
206
|
+
// TODO: This provider to implement an interface - IMcpToolResponseHandler ... apply(aiInteraction: AiInteraction)
|
|
207
|
+
// throw new Error('Method not implemented.');
|
|
208
|
+
|
|
209
|
+
return handlerApplicationResponse;
|
|
210
|
+
}
|
|
163
211
|
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { Logger } from '@nestjs/common';
|
|
2
|
+
import { Injectable } from '@nestjs/common';
|
|
3
|
+
|
|
4
|
+
import { QueueMessage, QueuePublisher } from 'src/interfaces/mq';
|
|
5
|
+
import { classify } from '@angular-devkit/core/src/utils/strings';
|
|
6
|
+
import { SolidIntrospectService } from '../solid-introspect.service';
|
|
7
|
+
import { IMcpToolResponseHandler } from 'src/interfaces';
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
@Injectable()
|
|
11
|
+
export class McpToolResponseHandlerFactory {
|
|
12
|
+
private readonly logger = new Logger(McpToolResponseHandlerFactory.name);
|
|
13
|
+
|
|
14
|
+
constructor(
|
|
15
|
+
private readonly solidIntrospectionService: SolidIntrospectService
|
|
16
|
+
) {
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
getInstance(toolInvoked: string): IMcpToolResponseHandler {
|
|
20
|
+
toolInvoked = classify(toolInvoked);
|
|
21
|
+
|
|
22
|
+
let resolvedHandlerName = `${toolInvoked}McpToolResponseHandler`;
|
|
23
|
+
|
|
24
|
+
// Register all ISolidDatabaseModules implementations
|
|
25
|
+
let actualHandler = this.solidIntrospectionService.getProvider(resolvedHandlerName);
|
|
26
|
+
if (!actualHandler) {
|
|
27
|
+
throw new Error(`Unable to locate mcp tool handler with name ${resolvedHandlerName}`);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// type safe
|
|
31
|
+
const actualHandlerInstance: IMcpToolResponseHandler = actualHandler.instance;
|
|
32
|
+
this.logger.error(`Resolved mcp tool response handler with name ${actualHandler.name}`);
|
|
33
|
+
|
|
34
|
+
return actualHandlerInstance;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { Injectable } from "@nestjs/common";
|
|
2
|
+
import { IMcpToolResponseHandler } from "../../interfaces";
|
|
3
|
+
import { AiInteraction } from "src/entities/ai-interaction.entity";
|
|
4
|
+
import { ModuleMetadataService } from "../module-metadata.service";
|
|
5
|
+
import { CreateModuleMetadataDto } from "src/dtos/create-module-metadata.dto";
|
|
6
|
+
import { SolidRegistry } from "src/helpers/solid-registry";
|
|
7
|
+
|
|
8
|
+
@Injectable()
|
|
9
|
+
export class SolidCreateModuleMcpToolResponseHandler implements IMcpToolResponseHandler {
|
|
10
|
+
|
|
11
|
+
constructor(
|
|
12
|
+
private readonly moduleMetadataService: ModuleMetadataService,
|
|
13
|
+
private readonly solidRegistry: SolidRegistry,
|
|
14
|
+
|
|
15
|
+
) {
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
async apply(aiInteraction: AiInteraction) {
|
|
19
|
+
const aiResponse = JSON.parse(aiInteraction.message);
|
|
20
|
+
|
|
21
|
+
const moduleMetadata = aiResponse['moduleMetadata'];
|
|
22
|
+
|
|
23
|
+
// TODO: Validate if another module with same name exists, if it does then raise an error...
|
|
24
|
+
|
|
25
|
+
const createDto: CreateModuleMetadataDto = {
|
|
26
|
+
defaultDataSource: 'default',
|
|
27
|
+
description: moduleMetadata['description'],
|
|
28
|
+
displayName: moduleMetadata['displayName'],
|
|
29
|
+
isSystem: false,
|
|
30
|
+
menuIconUrl: '',
|
|
31
|
+
models: [],
|
|
32
|
+
name: moduleMetadata['name'],
|
|
33
|
+
menuSequenceNumber: 1
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// This creates the module-metadata.json file....
|
|
37
|
+
const moduleObj = await this.moduleMetadataService.create(createDto);
|
|
38
|
+
|
|
39
|
+
const seeder = this.solidRegistry.getSeeders().filter((seeder) => seeder.name === 'ModuleMetadataSeederService').map((seeder) => seeder.instance).pop();
|
|
40
|
+
|
|
41
|
+
// Now we need to run solid seed & then solid refresh-model --name <module-name>
|
|
42
|
+
await this.moduleMetadataService.generateCode({ moduleId: moduleObj.id });
|
|
43
|
+
|
|
44
|
+
// solid seed ... this has to be run after reboot from the UI...
|
|
45
|
+
// await new Promise(resolve => setTimeout(resolve, 1000));
|
|
46
|
+
// await seeder.seed();
|
|
47
|
+
|
|
48
|
+
// TODO: decide on some shape to return hre...
|
|
49
|
+
return {}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
}
|
|
@@ -213,7 +213,6 @@ export class ModuleMetadataService {
|
|
|
213
213
|
}
|
|
214
214
|
}
|
|
215
215
|
|
|
216
|
-
|
|
217
216
|
async updateInDB(manager: EntityManager, id: number, updateModuleMetadataDto: UpdateModuleMetadataDto, files: Express.Multer.File[] = []) {
|
|
218
217
|
|
|
219
218
|
const module = await this.moduleMetadataRepo.preload({
|
|
@@ -286,7 +285,6 @@ export class ModuleMetadataService {
|
|
|
286
285
|
}
|
|
287
286
|
}
|
|
288
287
|
|
|
289
|
-
|
|
290
288
|
async upsert(updateModuleMetadataDto: UpdateModuleMetadataDto) {
|
|
291
289
|
this.logger.log(`Module Upsert called for : ${updateModuleMetadataDto.name}`);
|
|
292
290
|
// First check if module already exists using name
|
|
@@ -308,9 +306,6 @@ export class ModuleMetadataService {
|
|
|
308
306
|
}
|
|
309
307
|
}
|
|
310
308
|
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
309
|
async removeByName(name: string) {
|
|
315
310
|
const entity = await this.findOneByUserKey(name);
|
|
316
311
|
if (entity) {
|
|
@@ -22,7 +22,7 @@ export class SchedulerServiceImpl implements ISchedulerService {
|
|
|
22
22
|
async runScheduledJobs(): Promise<void> {
|
|
23
23
|
const now = new Date();
|
|
24
24
|
|
|
25
|
-
this.logger.log(`[${now.getTime()}]: scheduler service started run...`);
|
|
25
|
+
// this.logger.log(`[${now.getTime()}]: scheduler service started run...`);
|
|
26
26
|
const dueJobs = await this.scheduledJobRepo.find({
|
|
27
27
|
where: [
|
|
28
28
|
{
|
|
@@ -37,7 +37,7 @@ export class SchedulerServiceImpl implements ISchedulerService {
|
|
|
37
37
|
],
|
|
38
38
|
});
|
|
39
39
|
|
|
40
|
-
this.logger.log(`[${now.getTime()}]: scheduler service identified ${dueJobs.length} jobs to run...`);
|
|
40
|
+
// this.logger.log(`[${now.getTime()}]: scheduler service identified ${dueJobs.length} jobs to run...`);
|
|
41
41
|
|
|
42
42
|
for (const job of dueJobs) {
|
|
43
43
|
this.logger.log(`[${now.getTime()}]: scheduler service attempting to run job ${job.job}`);
|
|
@@ -49,13 +49,13 @@ export class SchedulerServiceImpl implements ISchedulerService {
|
|
|
49
49
|
|
|
50
50
|
const handler = this.solidRegistry.getScheduledJobProviderInstance(job.job);
|
|
51
51
|
if (!handler) {
|
|
52
|
-
this.logger.warn(`[${now.getTime()}]: scheduler service skipping because job handler not found: ${job.job}`);
|
|
52
|
+
// this.logger.warn(`[${now.getTime()}]: scheduler service skipping because job handler not found: ${job.job}`);
|
|
53
53
|
continue;
|
|
54
54
|
}
|
|
55
55
|
|
|
56
|
-
this.logger.log(`[${now.getTime()}]: scheduler service about to run job ${job.job}`);
|
|
57
|
-
await handler.
|
|
58
|
-
this.logger.log(`[${now.getTime()}]: scheduler service finished running job ${job.job}`);
|
|
56
|
+
// this.logger.log(`[${now.getTime()}]: scheduler service about to run job ${job.job}`);
|
|
57
|
+
await handler.execute(job);
|
|
58
|
+
// this.logger.log(`[${now.getTime()}]: scheduler service finished running job ${job.job}`);
|
|
59
59
|
|
|
60
60
|
job.isActive = true;
|
|
61
61
|
job.lastRunAt = now;
|
package/src/solid-core.module.ts
CHANGED
|
@@ -247,6 +247,8 @@ import { DashboardSubscriber } from './subscribers/dashboard.subscriber';
|
|
|
247
247
|
import { SecurityRuleSubscriber } from './subscribers/security-rule.subscriber';
|
|
248
248
|
import { ViewMetadataSubsciber } from './subscribers/view-metadata.subscriber';
|
|
249
249
|
import { CRUDService } from './services/crud.service';
|
|
250
|
+
import { McpToolResponseHandlerFactory } from './services/mcp-tool-response-handlers/mcp-tool-response-handler-factory.service';
|
|
251
|
+
import { SolidCreateModuleMcpToolResponseHandler } from './services/mcp-tool-response-handlers/solid-create-module-mcp-tool-response-handler.service';
|
|
250
252
|
|
|
251
253
|
|
|
252
254
|
@Global()
|
|
@@ -417,6 +419,9 @@ import { CRUDService } from './services/crud.service';
|
|
|
417
419
|
SmsTemplateService,
|
|
418
420
|
EmailTemplateService,
|
|
419
421
|
PublisherFactory,
|
|
422
|
+
|
|
423
|
+
McpToolResponseHandlerFactory,
|
|
424
|
+
SolidCreateModuleMcpToolResponseHandler,
|
|
420
425
|
|
|
421
426
|
TriggerMcpClientPublisherDatabase,
|
|
422
427
|
TriggerMcpClientSubscriberDatabase,
|