@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.
Files changed (89) hide show
  1. package/dist/config/iam.config.d.ts +0 -13
  2. package/dist/config/iam.config.d.ts.map +1 -1
  3. package/dist/config/iam.config.js +2 -12
  4. package/dist/config/iam.config.js.map +1 -1
  5. package/dist/config/jwt.config.d.ts +14 -0
  6. package/dist/config/jwt.config.d.ts.map +1 -0
  7. package/dist/config/jwt.config.js +15 -0
  8. package/dist/config/jwt.config.js.map +1 -0
  9. package/dist/decorators/active-user.decorator.d.ts +1 -1
  10. package/dist/dtos/create-list-of-values.dto.d.ts.map +1 -1
  11. package/dist/dtos/create-list-of-values.dto.js +1 -0
  12. package/dist/dtos/create-list-of-values.dto.js.map +1 -1
  13. package/dist/dtos/update-list-of-values.dto.d.ts.map +1 -1
  14. package/dist/dtos/update-list-of-values.dto.js +1 -0
  15. package/dist/dtos/update-list-of-values.dto.js.map +1 -1
  16. package/dist/entities/list-of-values.entity.js +1 -1
  17. package/dist/entities/list-of-values.entity.js.map +1 -1
  18. package/dist/guards/access-token.guard.d.ts +1 -1
  19. package/dist/guards/access-token.guard.d.ts.map +1 -1
  20. package/dist/guards/access-token.guard.js +2 -2
  21. package/dist/guards/access-token.guard.js.map +1 -1
  22. package/dist/helpers/field-crud-managers/SelectionDynamicFieldCrudManager.d.ts.map +1 -1
  23. package/dist/helpers/field-crud-managers/SelectionDynamicFieldCrudManager.js +12 -2
  24. package/dist/helpers/field-crud-managers/SelectionDynamicFieldCrudManager.js.map +1 -1
  25. package/dist/interfaces.d.ts +16 -1
  26. package/dist/interfaces.d.ts.map +1 -1
  27. package/dist/interfaces.js.map +1 -1
  28. package/dist/jobs/database/trigger-mcp-client-subscriber-database.service.d.ts.map +1 -1
  29. package/dist/jobs/database/trigger-mcp-client-subscriber-database.service.js +7 -0
  30. package/dist/jobs/database/trigger-mcp-client-subscriber-database.service.js.map +1 -1
  31. package/dist/seeders/seed-data/solid-core-metadata.json +236 -119
  32. package/dist/services/authentication.service.d.ts +8 -7
  33. package/dist/services/authentication.service.d.ts.map +1 -1
  34. package/dist/services/authentication.service.js +12 -11
  35. package/dist/services/authentication.service.js.map +1 -1
  36. package/dist/services/crud.service.d.ts +1 -0
  37. package/dist/services/crud.service.d.ts.map +1 -1
  38. package/dist/services/crud.service.js +14 -12
  39. package/dist/services/crud.service.js.map +1 -1
  40. package/dist/services/dashboard-question.service.d.ts.map +1 -1
  41. package/dist/services/dashboard-question.service.js +23 -2
  42. package/dist/services/dashboard-question.service.js.map +1 -1
  43. package/dist/services/genai/mcp-handlers/solid-add-button-to-form-view-mcp-handler.service.d.ts +16 -0
  44. package/dist/services/genai/mcp-handlers/solid-add-button-to-form-view-mcp-handler.service.d.ts.map +1 -0
  45. package/dist/services/genai/mcp-handlers/solid-add-button-to-form-view-mcp-handler.service.js +151 -0
  46. package/dist/services/genai/mcp-handlers/solid-add-button-to-form-view-mcp-handler.service.js.map +1 -0
  47. package/dist/services/genai/mcp-handlers/solid-add-controller-handler-method-mcp-handler.service.d.ts +1 -0
  48. package/dist/services/genai/mcp-handlers/solid-add-controller-handler-method-mcp-handler.service.d.ts.map +1 -1
  49. package/dist/services/genai/mcp-handlers/solid-add-controller-handler-method-mcp-handler.service.js +8 -1
  50. package/dist/services/genai/mcp-handlers/solid-add-controller-handler-method-mcp-handler.service.js.map +1 -1
  51. package/dist/services/genai/mcp-handlers/solid-create-custom-form-view-widget-mcp-handler.service.d.ts +14 -0
  52. package/dist/services/genai/mcp-handlers/solid-create-custom-form-view-widget-mcp-handler.service.d.ts.map +1 -0
  53. package/dist/services/genai/mcp-handlers/solid-create-custom-form-view-widget-mcp-handler.service.js +73 -0
  54. package/dist/services/genai/mcp-handlers/solid-create-custom-form-view-widget-mcp-handler.service.js.map +1 -0
  55. package/dist/services/list-of-values-metadata.service.d.ts.map +1 -1
  56. package/dist/services/list-of-values-metadata.service.js.map +1 -1
  57. package/dist/services/model-metadata.service.js +2 -2
  58. package/dist/services/model-metadata.service.js.map +1 -1
  59. package/dist/services/selection-providers/list-of-models-selection-provider.service.js +2 -2
  60. package/dist/services/selection-providers/list-of-models-selection-provider.service.js.map +1 -1
  61. package/dist/services/setting.service.d.ts.map +1 -1
  62. package/dist/services/setting.service.js +3 -2
  63. package/dist/services/setting.service.js.map +1 -1
  64. package/dist/solid-core.module.d.ts.map +1 -1
  65. package/dist/solid-core.module.js +7 -2
  66. package/dist/solid-core.module.js.map +1 -1
  67. package/dist/tsconfig.tsbuildinfo +1 -1
  68. package/package.json +1 -1
  69. package/src/config/iam.config.ts +1 -11
  70. package/src/config/jwt.config.ts +13 -0
  71. package/src/dtos/create-list-of-values.dto.ts +1 -0
  72. package/src/dtos/update-list-of-values.dto.ts +1 -0
  73. package/src/entities/list-of-values.entity.ts +1 -1
  74. package/src/guards/access-token.guard.ts +1 -1
  75. package/src/helpers/field-crud-managers/SelectionDynamicFieldCrudManager.ts +17 -6
  76. package/src/interfaces.ts +17 -1
  77. package/src/jobs/database/trigger-mcp-client-subscriber-database.service.ts +18 -0
  78. package/src/seeders/seed-data/solid-core-metadata.json +238 -119
  79. package/src/services/authentication.service.ts +17 -17
  80. package/src/services/crud.service.ts +17 -31
  81. package/src/services/dashboard-question.service.ts +29 -2
  82. package/src/services/genai/mcp-handlers/solid-add-button-to-form-view-mcp-handler.service.ts +137 -0
  83. package/src/services/genai/mcp-handlers/solid-add-controller-handler-method-mcp-handler.service.ts +21 -7
  84. package/src/services/genai/mcp-handlers/solid-create-custom-form-view-widget-mcp-handler.service.ts +72 -0
  85. package/src/services/list-of-values-metadata.service.ts +0 -3
  86. package/src/services/model-metadata.service.ts +2 -2
  87. package/src/services/selection-providers/list-of-models-selection-provider.service.ts +2 -2
  88. package/src/services/setting.service.ts +3 -2
  89. 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.187",
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",
@@ -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:true,
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
+ });
@@ -33,5 +33,6 @@ export class CreateListOfValuesDto {
33
33
  moduleId: number;
34
34
  @IsString()
35
35
  @IsOptional()
36
+ @ApiProperty()
36
37
  moduleUserKey: string;
37
38
  }
@@ -39,5 +39,6 @@ export class UpdateListOfValuesDto {
39
39
  moduleId: number;
40
40
  @IsString()
41
41
  @IsOptional()
42
+ @ApiProperty()
42
43
  moduleUserKey: string;
43
44
  }
@@ -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: "int", nullable: true })
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 '../config/iam.config';
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
- const values = await providerInstance.values('', JSON.parse(this.options.selectionDynamicProviderCtxt));
112
- // return values.map(v => v.split(":")[0]).includes(fieldValue);
113
- return values.map(v => v.value).includes(fieldValue);
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));