@solidstarters/solid-core 1.2.187 → 1.2.189
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/config/iam.config.d.ts +0 -13
- package/dist/config/iam.config.d.ts.map +1 -1
- package/dist/config/iam.config.js +2 -12
- package/dist/config/iam.config.js.map +1 -1
- package/dist/config/jwt.config.d.ts +14 -0
- package/dist/config/jwt.config.d.ts.map +1 -0
- package/dist/config/jwt.config.js +15 -0
- package/dist/config/jwt.config.js.map +1 -0
- package/dist/decorators/active-user.decorator.d.ts +1 -1
- package/dist/dtos/create-list-of-values.dto.d.ts.map +1 -1
- package/dist/dtos/create-list-of-values.dto.js +1 -0
- package/dist/dtos/create-list-of-values.dto.js.map +1 -1
- package/dist/dtos/update-list-of-values.dto.d.ts.map +1 -1
- package/dist/dtos/update-list-of-values.dto.js +1 -0
- package/dist/dtos/update-list-of-values.dto.js.map +1 -1
- package/dist/entities/list-of-values.entity.js +1 -1
- package/dist/entities/list-of-values.entity.js.map +1 -1
- package/dist/guards/access-token.guard.d.ts +1 -1
- package/dist/guards/access-token.guard.d.ts.map +1 -1
- package/dist/guards/access-token.guard.js +2 -2
- package/dist/guards/access-token.guard.js.map +1 -1
- package/dist/helpers/field-crud-managers/SelectionDynamicFieldCrudManager.d.ts.map +1 -1
- package/dist/helpers/field-crud-managers/SelectionDynamicFieldCrudManager.js +12 -2
- package/dist/helpers/field-crud-managers/SelectionDynamicFieldCrudManager.js.map +1 -1
- package/dist/interfaces.d.ts +16 -1
- 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 +7 -0
- package/dist/jobs/database/trigger-mcp-client-subscriber-database.service.js.map +1 -1
- package/dist/seeders/seed-data/solid-core-metadata.json +236 -119
- package/dist/services/authentication.service.d.ts +8 -7
- package/dist/services/authentication.service.d.ts.map +1 -1
- package/dist/services/authentication.service.js +12 -11
- package/dist/services/authentication.service.js.map +1 -1
- package/dist/services/crud.service.d.ts +1 -0
- package/dist/services/crud.service.d.ts.map +1 -1
- package/dist/services/crud.service.js +14 -12
- package/dist/services/crud.service.js.map +1 -1
- package/dist/services/dashboard-question.service.d.ts.map +1 -1
- package/dist/services/dashboard-question.service.js +23 -2
- package/dist/services/dashboard-question.service.js.map +1 -1
- package/dist/services/genai/mcp-handlers/solid-add-button-to-form-view-mcp-handler.service.d.ts +16 -0
- package/dist/services/genai/mcp-handlers/solid-add-button-to-form-view-mcp-handler.service.d.ts.map +1 -0
- package/dist/services/genai/mcp-handlers/solid-add-button-to-form-view-mcp-handler.service.js +151 -0
- package/dist/services/genai/mcp-handlers/solid-add-button-to-form-view-mcp-handler.service.js.map +1 -0
- package/dist/services/genai/mcp-handlers/solid-add-controller-handler-method-mcp-handler.service.d.ts +1 -0
- package/dist/services/genai/mcp-handlers/solid-add-controller-handler-method-mcp-handler.service.d.ts.map +1 -1
- package/dist/services/genai/mcp-handlers/solid-add-controller-handler-method-mcp-handler.service.js +8 -1
- package/dist/services/genai/mcp-handlers/solid-add-controller-handler-method-mcp-handler.service.js.map +1 -1
- package/dist/services/genai/mcp-handlers/solid-create-custom-form-view-widget-mcp-handler.service.d.ts +14 -0
- package/dist/services/genai/mcp-handlers/solid-create-custom-form-view-widget-mcp-handler.service.d.ts.map +1 -0
- package/dist/services/genai/mcp-handlers/solid-create-custom-form-view-widget-mcp-handler.service.js +73 -0
- package/dist/services/genai/mcp-handlers/solid-create-custom-form-view-widget-mcp-handler.service.js.map +1 -0
- package/dist/services/list-of-values-metadata.service.d.ts.map +1 -1
- package/dist/services/list-of-values-metadata.service.js.map +1 -1
- package/dist/services/model-metadata.service.js +2 -2
- package/dist/services/model-metadata.service.js.map +1 -1
- package/dist/services/selection-providers/list-of-models-selection-provider.service.js +2 -2
- package/dist/services/selection-providers/list-of-models-selection-provider.service.js.map +1 -1
- package/dist/services/setting.service.d.ts.map +1 -1
- package/dist/services/setting.service.js +3 -2
- package/dist/services/setting.service.js.map +1 -1
- package/dist/solid-core.module.d.ts.map +1 -1
- package/dist/solid-core.module.js +7 -2
- package/dist/solid-core.module.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/src/config/iam.config.ts +1 -11
- package/src/config/jwt.config.ts +13 -0
- package/src/dtos/create-list-of-values.dto.ts +1 -0
- package/src/dtos/update-list-of-values.dto.ts +1 -0
- package/src/entities/list-of-values.entity.ts +1 -1
- package/src/guards/access-token.guard.ts +1 -1
- package/src/helpers/field-crud-managers/SelectionDynamicFieldCrudManager.ts +17 -6
- package/src/interfaces.ts +17 -1
- package/src/jobs/database/trigger-mcp-client-subscriber-database.service.ts +18 -0
- package/src/seeders/seed-data/solid-core-metadata.json +238 -119
- package/src/services/authentication.service.ts +17 -17
- package/src/services/crud.service.ts +17 -31
- package/src/services/dashboard-question.service.ts +29 -2
- package/src/services/genai/mcp-handlers/solid-add-button-to-form-view-mcp-handler.service.ts +137 -0
- package/src/services/genai/mcp-handlers/solid-add-controller-handler-method-mcp-handler.service.ts +21 -7
- package/src/services/genai/mcp-handlers/solid-create-custom-form-view-widget-mcp-handler.service.ts +72 -0
- package/src/services/list-of-values-metadata.service.ts +0 -3
- package/src/services/model-metadata.service.ts +2 -2
- package/src/services/selection-providers/list-of-models-selection-provider.service.ts +2 -2
- package/src/services/setting.service.ts +3 -2
- package/src/solid-core.module.ts +7 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@solidstarters/solid-core",
|
|
3
|
-
"version": "1.2.
|
|
3
|
+
"version": "1.2.189",
|
|
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",
|
package/src/config/iam.config.ts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { registerAs } from '@nestjs/config';
|
|
2
|
-
import { Environment } from 'src';
|
|
3
2
|
|
|
4
3
|
export const iamConfig = registerAs('iam', () => {
|
|
5
4
|
return {
|
|
@@ -14,7 +13,7 @@ export const iamConfig = registerAs('iam', () => {
|
|
|
14
13
|
defaultRole: process.env.IAM_DEFAULT_ROLE ?? 'Public',
|
|
15
14
|
dummyOtp: process.env.IAM_OTP_DUMMY,
|
|
16
15
|
forgotPasswordSendVerificationTokenOn: process.env.IAM_FORGOT_PASSWORD_SEND_VERIFICATION_TOKEN_ON ?? 'email',
|
|
17
|
-
forceChangePasswordOnFirstLogin:
|
|
16
|
+
forceChangePasswordOnFirstLogin:false,
|
|
18
17
|
PASSWORD_REGEX: process.env.PASSWORD_REGEX || '^$|^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[^\\da-zA-Z]).*$',
|
|
19
18
|
PASSWORD_COMPLEXITY_DESC : process.env.PASSWORD_COMPLEXITY_DESC || 'Password must contain at least one uppercase, one lowercase, one number, and one special character.',
|
|
20
19
|
googleOauth: {
|
|
@@ -29,12 +28,3 @@ export const iamConfig = registerAs('iam', () => {
|
|
|
29
28
|
};
|
|
30
29
|
})
|
|
31
30
|
|
|
32
|
-
export const jwtConfig = registerAs('jwt', () => {
|
|
33
|
-
return {
|
|
34
|
-
secret: process.env.IAM_JWT_SECRET,
|
|
35
|
-
audience: process.env.IAM_JWT_TOKEN_AUDIENCE,
|
|
36
|
-
issuer: process.env.IAM_JWT_TOKEN_ISSUER,
|
|
37
|
-
accessTokenTtl: parseInt(process.env.IAM_JWT_ACCESS_TOKEN_TTL ?? (process.env.ENV as Environment) === Environment.Production ? '1200' : '86400', 10), // 20 minutes in prod, 1 day otherwise
|
|
38
|
-
refreshTokenTtl: parseInt(process.env.IAM_JWT_REFRESH_TOKEN_TTL ?? '604800', 10), // 7 days
|
|
39
|
-
};
|
|
40
|
-
});
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { registerAs } from '@nestjs/config';
|
|
2
|
+
import { Environment } from 'src/decorators/disallow-in-production.decorator';
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
export const jwtConfig = registerAs('jwt', () => {
|
|
6
|
+
return {
|
|
7
|
+
secret: process.env.IAM_JWT_SECRET,
|
|
8
|
+
audience: process.env.IAM_JWT_TOKEN_AUDIENCE,
|
|
9
|
+
issuer: process.env.IAM_JWT_TOKEN_ISSUER,
|
|
10
|
+
accessTokenTtl: parseInt(process.env.IAM_JWT_ACCESS_TOKEN_TTL ?? (process.env.ENV as Environment) === Environment.Production ? '1200' : '86400', 10), // 20 minutes in prod, 1 day otherwise
|
|
11
|
+
refreshTokenTtl: parseInt(process.env.IAM_JWT_REFRESH_TOKEN_TTL ?? '604800', 10), // 7 days
|
|
12
|
+
};
|
|
13
|
+
});
|
|
@@ -14,7 +14,7 @@ export class ListOfValues extends CommonEntity {
|
|
|
14
14
|
description: string;
|
|
15
15
|
@Column({ type: "boolean", nullable: true, default: false })
|
|
16
16
|
default: boolean = false;
|
|
17
|
-
@Column({ type: "
|
|
17
|
+
@Column({ type: "integer", nullable: true })
|
|
18
18
|
sequence: number;
|
|
19
19
|
@ManyToOne(() => ModuleMetadata, { onDelete: "CASCADE", nullable: true })
|
|
20
20
|
@JoinColumn()
|
|
@@ -9,7 +9,7 @@ import { ConfigType } from '@nestjs/config';
|
|
|
9
9
|
import { JwtService } from '@nestjs/jwt';
|
|
10
10
|
import { Request } from 'express';
|
|
11
11
|
import { ActiveUserData } from '../interfaces/active-user-data.interface';
|
|
12
|
-
import { jwtConfig } from '
|
|
12
|
+
import { jwtConfig } from 'src/config/jwt.config';
|
|
13
13
|
import { REQUEST_USER_KEY } from "../constants";
|
|
14
14
|
import { PermissionMetadataService } from '../services/permission-metadata.service';
|
|
15
15
|
import { ClsService } from 'nestjs-cls';
|
|
@@ -58,7 +58,7 @@ export class SelectionDynamicFieldCrudManager implements FieldCrudManager {
|
|
|
58
58
|
if (Array.isArray(fieldValue)) {
|
|
59
59
|
return { isValid: true, values: fieldValue };
|
|
60
60
|
}
|
|
61
|
-
|
|
61
|
+
|
|
62
62
|
try {
|
|
63
63
|
const parsed = typeof fieldValue === 'string' ? JSON.parse(fieldValue) : null;
|
|
64
64
|
if (Array.isArray(parsed)) {
|
|
@@ -67,10 +67,10 @@ export class SelectionDynamicFieldCrudManager implements FieldCrudManager {
|
|
|
67
67
|
} catch {
|
|
68
68
|
// fall through
|
|
69
69
|
}
|
|
70
|
-
|
|
70
|
+
|
|
71
71
|
return { isValid: false, values: [] };
|
|
72
72
|
}
|
|
73
|
-
|
|
73
|
+
|
|
74
74
|
|
|
75
75
|
private async applyValidations(fieldValue: any): Promise<ValidationError[]> {
|
|
76
76
|
const errors: ValidationError[] = [];
|
|
@@ -108,9 +108,20 @@ export class SelectionDynamicFieldCrudManager implements FieldCrudManager {
|
|
|
108
108
|
|
|
109
109
|
private async isValidSelectionValue(fieldValue: any, selectionDynamicProvider: string): Promise<boolean> {
|
|
110
110
|
const providerInstance = this.providerInstance<any>(selectionDynamicProvider);
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
111
|
+
try {
|
|
112
|
+
// Use the value method first
|
|
113
|
+
const valueOption = await providerInstance.value(fieldValue, JSON.parse(this.options.selectionDynamicProviderCtxt));
|
|
114
|
+
if (valueOption && valueOption.value === fieldValue) {
|
|
115
|
+
return true;
|
|
116
|
+
}
|
|
117
|
+
return false;
|
|
118
|
+
}
|
|
119
|
+
catch (error) {
|
|
120
|
+
// Use the values method as a fallback, if the value method is not implemented
|
|
121
|
+
const values = await providerInstance.values('', JSON.parse(this.options.selectionDynamicProviderCtxt));
|
|
122
|
+
const isValid = values.some(v => v.value === fieldValue);
|
|
123
|
+
return isValid;
|
|
124
|
+
}
|
|
114
125
|
}
|
|
115
126
|
|
|
116
127
|
private providerInstance<T extends ISelectionProviderContext>(selectionDynamicProvider: string): ISelectionProvider<T> {
|
package/src/interfaces.ts
CHANGED
|
@@ -281,7 +281,14 @@ export interface IErrorCodeProvider {
|
|
|
281
281
|
|
|
282
282
|
// MCP Tool Related
|
|
283
283
|
|
|
284
|
-
export type PlanStep = CreateNewFileStep | RegisterNestProviderStep | AddMethodToExistingClassStep | RegisterSolidXExtensionComponentStep | AddListViewButtonStep;
|
|
284
|
+
export type PlanStep = CreateNewFileStep | RegisterNestProviderStep | AddMethodToExistingClassStep | RegisterSolidXExtensionComponentStep | AddListViewButtonStep | AddFormViewButtonStep | AddImportStep;
|
|
285
|
+
export interface AddImportStep {
|
|
286
|
+
type: "addImport";
|
|
287
|
+
path: string; // e.g. apps/api/src/address-master/services/address-master.service.ts
|
|
288
|
+
importStatement: string; // e.g. import { Something } from 'somewhere';
|
|
289
|
+
overwrite?: boolean; // default=false
|
|
290
|
+
rationale?: string; // optional, ignored by executor
|
|
291
|
+
}
|
|
285
292
|
|
|
286
293
|
export interface CreateNewFileStep {
|
|
287
294
|
type: "createNewFile";
|
|
@@ -307,6 +314,7 @@ export interface AddMethodToExistingClassStep {
|
|
|
307
314
|
className: string // e.g. CountryService
|
|
308
315
|
methodName: string // e.g. addCountry
|
|
309
316
|
content: string // Full Method Code
|
|
317
|
+
importStatements?: string[]; // e.g. [ "import { X } from 'y';" ]
|
|
310
318
|
rationale?: string; // optional, ignored by executor
|
|
311
319
|
}
|
|
312
320
|
|
|
@@ -325,6 +333,14 @@ export interface AddListViewButtonStep {
|
|
|
325
333
|
content?: string; // Code
|
|
326
334
|
}
|
|
327
335
|
|
|
336
|
+
export interface AddFormViewButtonStep {
|
|
337
|
+
type: "addFormViewButton";
|
|
338
|
+
moduleName?: string;
|
|
339
|
+
modelName?: string;
|
|
340
|
+
buttonType?: string;
|
|
341
|
+
content?: string; // Code
|
|
342
|
+
}
|
|
343
|
+
|
|
328
344
|
export interface McpComputedProviderResponse {
|
|
329
345
|
plan: PlanStep[];
|
|
330
346
|
// provider?: any; // (intentionally ignored per your note)
|
|
@@ -142,6 +142,10 @@ export class TriggerMcpClientSubscriberDatabase extends DatabaseSubscriber<Trigg
|
|
|
142
142
|
}
|
|
143
143
|
);
|
|
144
144
|
|
|
145
|
+
const existingControllerAndTheirMethods = this.solidRegistry.getControllers();
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
|
|
145
149
|
// Build markdown sections using template interpolation
|
|
146
150
|
const modulesSection = (existingModules ?? [])
|
|
147
151
|
.map(m => [
|
|
@@ -176,6 +180,14 @@ export class TriggerMcpClientSubscriberDatabase extends DatabaseSubscriber<Trigg
|
|
|
176
180
|
].join('\n'))
|
|
177
181
|
.join('\n\n');
|
|
178
182
|
|
|
183
|
+
const controllersAndTheirMethods = (existingControllerAndTheirMethods ?? [])
|
|
184
|
+
.map(m => [
|
|
185
|
+
`### ${m.name}`,
|
|
186
|
+
`- methods: ${m.methods.length ? m.methods.map(m => `- ${m}`).join('\n'): '- No methods found'}`,
|
|
187
|
+
].join('\n'))
|
|
188
|
+
.join('\n\n');
|
|
189
|
+
|
|
190
|
+
|
|
179
191
|
|
|
180
192
|
const finalPrompt = `
|
|
181
193
|
# User Prompt:
|
|
@@ -212,6 +224,12 @@ Use the below list of computed field providers to infer which provider the user
|
|
|
212
224
|
${computationProvidersSection}
|
|
213
225
|
`.trim();
|
|
214
226
|
|
|
227
|
+
|
|
228
|
+
// ## LIST OF EXISTING CONTROLLERS AND THEIR METHODS
|
|
229
|
+
// Use the below list of controllers and their methods to infer whether the api call being made to a particular controller exists or not.
|
|
230
|
+
|
|
231
|
+
// ${controllersAndTheirMethods}
|
|
232
|
+
|
|
215
233
|
const aiResponse = await this.aiInteractionService.runMcpPrompt(finalPrompt);
|
|
216
234
|
this.triggerMcpClientSubscriberLogger.log(`aiResponse: `);
|
|
217
235
|
this.triggerMcpClientSubscriberLogger.log(JSON.stringify(aiResponse));
|