@solidstarters/solid-core 1.2.180 → 1.2.184

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 (170) hide show
  1. package/dev-grooming-docs/ozzy-prompts.txt +60 -3
  2. package/dist/config/iam.config.d.ts.map +1 -1
  3. package/dist/config/iam.config.js +2 -1
  4. package/dist/config/iam.config.js.map +1 -1
  5. package/dist/controllers/service.controller.d.ts.map +1 -1
  6. package/dist/controllers/service.controller.js +0 -1
  7. package/dist/controllers/service.controller.js.map +1 -1
  8. package/dist/decorators/active-user.decorator.d.ts +1 -1
  9. package/dist/dtos/create-menu-item-metadata.dto.d.ts +3 -0
  10. package/dist/dtos/create-menu-item-metadata.dto.d.ts.map +1 -1
  11. package/dist/dtos/create-menu-item-metadata.dto.js +4 -1
  12. package/dist/dtos/create-menu-item-metadata.dto.js.map +1 -1
  13. package/dist/dtos/create-role-metadata.dto.d.ts +4 -0
  14. package/dist/dtos/create-role-metadata.dto.d.ts.map +1 -1
  15. package/dist/dtos/create-role-metadata.dto.js +45 -1
  16. package/dist/dtos/create-role-metadata.dto.js.map +1 -1
  17. package/dist/interfaces.d.ts +20 -0
  18. package/dist/interfaces.d.ts.map +1 -1
  19. package/dist/interfaces.js.map +1 -1
  20. package/dist/jobs/database/trigger-mcp-client-subscriber-database.service.d.ts +13 -5
  21. package/dist/jobs/database/trigger-mcp-client-subscriber-database.service.d.ts.map +1 -1
  22. package/dist/jobs/database/trigger-mcp-client-subscriber-database.service.js +97 -13
  23. package/dist/jobs/database/trigger-mcp-client-subscriber-database.service.js.map +1 -1
  24. package/dist/repository/view-metadata.repository.d.ts +1 -0
  25. package/dist/repository/view-metadata.repository.d.ts.map +1 -1
  26. package/dist/repository/view-metadata.repository.js +14 -0
  27. package/dist/repository/view-metadata.repository.js.map +1 -1
  28. package/dist/seeders/module-metadata-seeder.service.d.ts +52 -42
  29. package/dist/seeders/module-metadata-seeder.service.d.ts.map +1 -1
  30. package/dist/seeders/module-metadata-seeder.service.js +259 -202
  31. package/dist/seeders/module-metadata-seeder.service.js.map +1 -1
  32. package/dist/seeders/permission-metadata-seeder.service.js +0 -1
  33. package/dist/seeders/permission-metadata-seeder.service.js.map +1 -1
  34. package/dist/seeders/seed-data/solid-core-metadata.json +2 -3
  35. package/dist/services/ai-interaction.service.d.ts +3 -3
  36. package/dist/services/ai-interaction.service.d.ts.map +1 -1
  37. package/dist/services/ai-interaction.service.js +5 -5
  38. package/dist/services/ai-interaction.service.js.map +1 -1
  39. package/dist/services/chatter-message.service.d.ts.map +1 -1
  40. package/dist/services/chatter-message.service.js +9 -2
  41. package/dist/services/chatter-message.service.js.map +1 -1
  42. package/dist/services/genai/ingest-metadata.service.d.ts.map +1 -1
  43. package/dist/services/genai/ingest-metadata.service.js +46 -35
  44. package/dist/services/genai/ingest-metadata.service.js.map +1 -1
  45. 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
  46. package/dist/services/genai/mcp-handlers/mcp-handler-factory.service.d.ts.map +1 -0
  47. package/dist/services/{mcp-tool-response-handlers/mcp-tool-response-handler-factory.service.js → genai/mcp-handlers/mcp-handler-factory.service.js} +10 -10
  48. package/dist/services/genai/mcp-handlers/mcp-handler-factory.service.js.map +1 -0
  49. package/dist/services/genai/mcp-handlers/solid-add-fields-to-model-mcp-handler.service.d.ts +12 -0
  50. package/dist/services/genai/mcp-handlers/solid-add-fields-to-model-mcp-handler.service.d.ts.map +1 -0
  51. 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
  52. package/dist/services/genai/mcp-handlers/solid-add-fields-to-model-mcp-handler.service.js.map +1 -0
  53. package/dist/services/genai/mcp-handlers/solid-add-question-to-dashboard-mcp-handler.service.d.ts +12 -0
  54. package/dist/services/genai/mcp-handlers/solid-add-question-to-dashboard-mcp-handler.service.d.ts.map +1 -0
  55. package/dist/services/genai/mcp-handlers/solid-add-question-to-dashboard-mcp-handler.service.js +41 -0
  56. package/dist/services/genai/mcp-handlers/solid-add-question-to-dashboard-mcp-handler.service.js.map +1 -0
  57. package/dist/services/genai/mcp-handlers/solid-add-variable-to-dashboard-mcp-handler.service.d.ts +12 -0
  58. package/dist/services/genai/mcp-handlers/solid-add-variable-to-dashboard-mcp-handler.service.d.ts.map +1 -0
  59. package/dist/services/genai/mcp-handlers/solid-add-variable-to-dashboard-mcp-handler.service.js +42 -0
  60. package/dist/services/genai/mcp-handlers/solid-add-variable-to-dashboard-mcp-handler.service.js.map +1 -0
  61. package/dist/services/genai/mcp-handlers/solid-create-computed-provider-mcp-handler.service.d.ts +16 -0
  62. package/dist/services/genai/mcp-handlers/solid-create-computed-provider-mcp-handler.service.d.ts.map +1 -0
  63. package/dist/services/genai/mcp-handlers/solid-create-computed-provider-mcp-handler.service.js +75 -0
  64. package/dist/services/genai/mcp-handlers/solid-create-computed-provider-mcp-handler.service.js.map +1 -0
  65. 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
  66. package/dist/services/genai/mcp-handlers/solid-create-dashboard-mcp-handler.service.d.ts.map +1 -0
  67. 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} +16 -14
  68. package/dist/services/genai/mcp-handlers/solid-create-dashboard-mcp-handler.service.js.map +1 -0
  69. package/dist/services/genai/mcp-handlers/solid-create-dashboard-question-mcp-handler.service.d.ts +12 -0
  70. package/dist/services/genai/mcp-handlers/solid-create-dashboard-question-mcp-handler.service.d.ts.map +1 -0
  71. 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
  72. package/dist/services/genai/mcp-handlers/solid-create-dashboard-question-mcp-handler.service.js.map +1 -0
  73. 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
  74. package/dist/services/genai/mcp-handlers/solid-create-dashboard-question-sql-dataset-config-mcp-handler.service.d.ts.map +1 -0
  75. 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
  76. package/dist/services/genai/mcp-handlers/solid-create-dashboard-question-sql-dataset-config-mcp-handler.service.js.map +1 -0
  77. package/dist/services/genai/mcp-handlers/solid-create-dashboard-widget-mcp-handler.service.d.ts +12 -0
  78. package/dist/services/genai/mcp-handlers/solid-create-dashboard-widget-mcp-handler.service.d.ts.map +1 -0
  79. 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
  80. package/dist/services/genai/mcp-handlers/solid-create-dashboard-widget-mcp-handler.service.js.map +1 -0
  81. package/dist/services/genai/mcp-handlers/solid-create-model-with-fields-mcp-handler.service.d.ts +14 -0
  82. package/dist/services/genai/mcp-handlers/solid-create-model-with-fields-mcp-handler.service.d.ts.map +1 -0
  83. 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
  84. package/dist/services/genai/mcp-handlers/solid-create-model-with-fields-mcp-handler.service.js.map +1 -0
  85. 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
  86. package/dist/services/genai/mcp-handlers/solid-create-module-mcp-handler.service.d.ts.map +1 -0
  87. 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
  88. package/dist/services/genai/mcp-handlers/solid-create-module-mcp-handler.service.js.map +1 -0
  89. 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
  90. package/dist/services/genai/mcp-handlers/solid-update-layout-mcp-handler.service.d.ts.map +1 -0
  91. 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
  92. package/dist/services/genai/mcp-handlers/solid-update-layout-mcp-handler.service.js.map +1 -0
  93. package/dist/services/import-transaction.service.js +2 -2
  94. package/dist/services/import-transaction.service.js.map +1 -1
  95. package/dist/services/menu-item-metadata.service.d.ts.map +1 -1
  96. package/dist/services/menu-item-metadata.service.js +0 -2
  97. package/dist/services/menu-item-metadata.service.js.map +1 -1
  98. package/dist/services/model-metadata.service.d.ts.map +1 -1
  99. package/dist/services/model-metadata.service.js.map +1 -1
  100. package/dist/services/module-metadata.service.d.ts.map +1 -1
  101. package/dist/services/module-metadata.service.js +1 -1
  102. package/dist/services/module-metadata.service.js.map +1 -1
  103. package/dist/services/role-metadata.service.d.ts.map +1 -1
  104. package/dist/services/role-metadata.service.js +1 -7
  105. package/dist/services/role-metadata.service.js.map +1 -1
  106. package/dist/services/solid-ts-morph.service.d.ts +28 -0
  107. package/dist/services/solid-ts-morph.service.d.ts.map +1 -0
  108. package/dist/services/solid-ts-morph.service.js +222 -0
  109. package/dist/services/solid-ts-morph.service.js.map +1 -0
  110. package/dist/solid-core.module.d.ts.map +1 -1
  111. package/dist/solid-core.module.js +26 -18
  112. package/dist/solid-core.module.js.map +1 -1
  113. package/dist/tsconfig.tsbuildinfo +1 -1
  114. package/package.json +6 -4
  115. package/solid_seed_fixes.ts.txt +93 -0
  116. package/src/config/iam.config.ts +2 -1
  117. package/src/controllers/service.controller.ts +4 -1
  118. package/src/dtos/create-menu-item-metadata.dto.ts +5 -1
  119. package/src/dtos/create-role-metadata.dto.ts +60 -1
  120. package/src/interfaces.ts +29 -2
  121. package/src/jobs/database/trigger-mcp-client-subscriber-database.service.ts +113 -13
  122. package/src/repository/view-metadata.repository.ts +15 -0
  123. package/src/seeders/module-metadata-seeder.service.ts +355 -282
  124. package/src/seeders/permission-metadata-seeder.service.ts +1 -1
  125. package/src/seeders/seed-data/solid-core-metadata.json +3 -5
  126. package/src/services/ai-interaction.service.ts +3 -5
  127. package/src/services/chatter-message.service.ts +11 -3
  128. package/src/services/genai/ingest-metadata.service.ts +115 -39
  129. package/src/services/{mcp-tool-response-handlers/mcp-tool-response-handler-factory.service.ts → genai/mcp-handlers/mcp-handler-factory.service.ts} +5 -5
  130. package/src/services/genai/mcp-handlers/solid-add-fields-to-model-mcp-handler.service.ts +68 -0
  131. package/src/services/genai/mcp-handlers/solid-add-question-to-dashboard-mcp-handler.service.ts +43 -0
  132. package/src/services/genai/mcp-handlers/solid-add-variable-to-dashboard-mcp-handler.service.ts +44 -0
  133. package/src/services/genai/mcp-handlers/solid-create-computed-provider-mcp-handler.service.ts +71 -0
  134. 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} +11 -10
  135. 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
  136. 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
  137. 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
  138. 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
  139. 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
  140. 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
  141. package/src/services/import-transaction.service.ts +2 -2
  142. package/src/services/menu-item-metadata.service.ts +3 -7
  143. package/src/services/model-metadata.service.ts +0 -3
  144. package/src/services/module-metadata.service.ts +2 -3
  145. package/src/services/role-metadata.service.ts +22 -8
  146. package/src/services/solid-ts-morph.service.ts +263 -0
  147. package/src/solid-core.module.ts +29 -19
  148. package/dist/services/mcp-tool-response-handlers/mcp-tool-response-handler-factory.service.d.ts.map +0 -1
  149. package/dist/services/mcp-tool-response-handlers/mcp-tool-response-handler-factory.service.js.map +0 -1
  150. package/dist/services/mcp-tool-response-handlers/solid-add-field-mcp-tool-response-handler.service.d.ts +0 -16
  151. package/dist/services/mcp-tool-response-handlers/solid-add-field-mcp-tool-response-handler.service.d.ts.map +0 -1
  152. package/dist/services/mcp-tool-response-handlers/solid-add-field-mcp-tool-response-handler.service.js.map +0 -1
  153. package/dist/services/mcp-tool-response-handlers/solid-create-dashboard-mcp-tool-response-handler.service.d.ts.map +0 -1
  154. package/dist/services/mcp-tool-response-handlers/solid-create-dashboard-mcp-tool-response-handler.service.js.map +0 -1
  155. package/dist/services/mcp-tool-response-handlers/solid-create-dashboard-question-mcp-tool-response-handler.service.d.ts +0 -12
  156. package/dist/services/mcp-tool-response-handlers/solid-create-dashboard-question-mcp-tool-response-handler.service.d.ts.map +0 -1
  157. package/dist/services/mcp-tool-response-handlers/solid-create-dashboard-question-mcp-tool-response-handler.service.js.map +0 -1
  158. package/dist/services/mcp-tool-response-handlers/solid-create-dashboard-question-sql-dataset-config-mcp-tool-response-handler.service.d.ts.map +0 -1
  159. package/dist/services/mcp-tool-response-handlers/solid-create-dashboard-question-sql-dataset-config-mcp-tool-response-handler.service.js.map +0 -1
  160. package/dist/services/mcp-tool-response-handlers/solid-create-dashboard-widget-mcp-tool-response-handler.service.d.ts +0 -12
  161. package/dist/services/mcp-tool-response-handlers/solid-create-dashboard-widget-mcp-tool-response-handler.service.d.ts.map +0 -1
  162. package/dist/services/mcp-tool-response-handlers/solid-create-dashboard-widget-mcp-tool-response-handler.service.js.map +0 -1
  163. package/dist/services/mcp-tool-response-handlers/solid-create-model-with-fields-mcp-tool-response-handler.service.d.ts +0 -16
  164. package/dist/services/mcp-tool-response-handlers/solid-create-model-with-fields-mcp-tool-response-handler.service.d.ts.map +0 -1
  165. package/dist/services/mcp-tool-response-handlers/solid-create-model-with-fields-mcp-tool-response-handler.service.js.map +0 -1
  166. package/dist/services/mcp-tool-response-handlers/solid-create-module-mcp-tool-response-handler.service.d.ts.map +0 -1
  167. package/dist/services/mcp-tool-response-handlers/solid-create-module-mcp-tool-response-handler.service.js.map +0 -1
  168. package/dist/services/mcp-tool-response-handlers/solid-save-model-layout-mcp-tool-response-handler.service.d.ts.map +0 -1
  169. package/dist/services/mcp-tool-response-handlers/solid-save-model-layout-mcp-tool-response-handler.service.js.map +0 -1
  170. package/src/services/mcp-tool-response-handlers/solid-add-field-mcp-tool-response-handler.service.ts +0 -56
@@ -1 +1 @@
1
- {"version":3,"file":"chatter-message.service.js","sourceRoot":"","sources":["../../src/services/chatter-message.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { Injectable } from '@nestjs/common';\nimport { InjectEntityManager, InjectRepository } from '@nestjs/typeorm';\nimport { DiscoveryService, ModuleRef } from \"@nestjs/core\";\nimport { EntityManager, Repository, EntityMetadata } from 'typeorm';\n\nimport { CRUDService } from 'src/services/crud.service';\nimport { ModelMetadataService } from 'src/services/model-metadata.service';\nimport { ModuleMetadataService } from 'src/services/module-metadata.service';\nimport { ConfigService } from '@nestjs/config';\nimport { FileService } from 'src/services/file.service';\nimport { CrudHelperService } from 'src/services/crud-helper.service';\nimport { PostChatterMessageDto } from 'src/dtos/post-chatter-message.dto';\nimport { ChatterMessage } from '../entities/chatter-message.entity';\nimport { getMediaStorageProvider } from './mediaStorageProviders';\nimport { MediaStorageProviderType } from '../dtos/create-media-storage-provider-metadata.dto';\nimport { ChatterMessageDetails } from '../entities/chatter-message-details.entity';\nimport { ModelMetadata } from 'src/entities/model-metadata.entity';\nimport { RequestContextService } from './request-context.service';\nimport { ChatterMessageRepository } from 'src/repository/chatter-message.repository';\nimport { lowerFirst } from 'src/helpers/string.helper';\nimport { ModelMetadataHelperService } from 'src/helpers/model-metadata-helper.service';\nimport { ChatterMessageDetailsRepository } from 'src/repository/chatter-message-details.repository';\nimport { FieldMetadata } from 'src/entities/field-metadata.entity';\nimport { CHATTER_MESSAGE_TYPE, CHATTER_MESSAGE_SUBTYPE } from 'src/constants/chatter-message.constants';\nimport { classify } from '@angular-devkit/core/src/utils/strings';\n@Injectable()\nexport class ChatterMessageService extends CRUDService<ChatterMessage> {\n constructor(\n readonly modelMetadataService: ModelMetadataService,\n readonly moduleMetadataService: ModuleMetadataService,\n readonly configService: ConfigService,\n readonly fileService: FileService,\n readonly discoveryService: DiscoveryService,\n readonly crudHelperService: CrudHelperService,\n @InjectEntityManager()\n readonly entityManager: EntityManager,\n // @InjectRepository(ChatterMessage, 'default')\n readonly repo: ChatterMessageRepository,\n // @InjectRepository(ChatterMessageDetailsRepository, 'default')\n readonly chatterMessageDetailsRepo: ChatterMessageDetailsRepository,\n @InjectRepository(FieldMetadata, 'default')\n readonly fieldMetadataRepo: Repository<FieldMetadata>,\n readonly moduleRef: ModuleRef,\n @InjectRepository(ModelMetadata)\n private readonly modelMetadataRepo: Repository<ModelMetadata>,\n readonly requestContextService: RequestContextService,\n private readonly modelMetadataHelperService: ModelMetadataHelperService,\n ) {\n super(modelMetadataService, moduleMetadataService, configService, fileService, discoveryService, crudHelperService, entityManager, repo, 'chatterMessage', 'solid-core', moduleRef);\n }\n\n async postMessage(postDto: PostChatterMessageDto, files: Express.Multer.File[] = []) {\n const chatterMessage = new ChatterMessage();\n chatterMessage.messageType = CHATTER_MESSAGE_TYPE.CUSTOM;\n chatterMessage.messageSubType = postDto.messageSubType || CHATTER_MESSAGE_SUBTYPE.CUSTOM;\n chatterMessage.messageBody = postDto.messageBody;\n chatterMessage.coModelEntityId = postDto.coModelEntityId;\n chatterMessage.coModelName = postDto.coModelName;\n\n const activeUser = this.requestContextService.getActiveUser();\n\n if (activeUser) {\n const userId = activeUser?.sub;\n chatterMessage.user = { id: userId } as any;\n } else {\n chatterMessage.user = null;\n }\n\n const savedMessage = await this.repo.save(chatterMessage);\n\n if (files && files.length > 0) {\n const model = await this.modelMetadataService.findOneBySingularName('chatterMessage', {\n fields: {\n model: true,\n mediaStorageProvider: true,\n },\n module: true,\n });\n\n const mediaFields = model.fields.filter(field => field.type === 'mediaSingle' || field.type === 'mediaMultiple');\n\n for (const mediaField of mediaFields) {\n const media = files.filter(multerFile => multerFile.fieldname === mediaField.name);\n if (media.length > 0) {\n const storageProviderMetadata = mediaField.mediaStorageProvider;\n const storageProviderType = storageProviderMetadata.type as MediaStorageProviderType;\n const storageProvider = await getMediaStorageProvider(this.moduleRef, storageProviderType);\n await storageProvider.store(media, savedMessage, mediaField);\n }\n }\n }\n\n return savedMessage;\n }\n\n async postAuditMessageOnInsert(entity: any, metadata: EntityMetadata, messageQueue: boolean = false) {\n if (!entity) {\n return;\n }\n const model = await this.modelMetadataRepo.findOne({\n where: {\n singularName: lowerFirst(metadata.name)\n },\n relations: {\n fields: true,\n module: true,\n userKeyField: true\n }\n });\n\n if (!model || !model.enableAuditTracking) {\n return;\n }\n\n const auditFields = model.fields.filter(field =>\n field.enableAuditTracking &&\n !['mediaSingle', 'mediaMultiple', 'computed', 'richText', 'json'].includes(field.type) &&\n !(field.type === 'relation' && field.relationType === 'one-to-many')\n );\n\n const activeUser = this.requestContextService.getActiveUser();\n\n const chatterMessage = new ChatterMessage();\n chatterMessage.messageType = CHATTER_MESSAGE_TYPE.AUDIT;\n chatterMessage.messageSubType = CHATTER_MESSAGE_SUBTYPE.AUDIT_INSERT;\n chatterMessage.coModelEntityId = entity.id;\n chatterMessage.coModelName = model?.singularName;\n chatterMessage.modelDisplayName = model?.displayName;\n chatterMessage.modelUserKey = entity[model?.userKeyField?.name];\n chatterMessage.messageBody = `New ${model?.displayName} created`;\n\n if (activeUser) {\n const userId = activeUser?.sub;\n chatterMessage.user = { id: userId } as any;\n } else {\n chatterMessage.user = null;\n }\n\n const savedMessage = await this.repo.save(chatterMessage);\n\n for (const field of auditFields) {\n const fieldValue = entity[field.name];\n if (fieldValue !== undefined && fieldValue !== null && fieldValue !== '') {\n const messageDetail = new ChatterMessageDetails();\n messageDetail.chatterMessage = savedMessage;\n messageDetail.fieldName = field.name;\n messageDetail.fieldDisplayName = field.displayName;\n messageDetail.oldValue = null;\n messageDetail.oldValueDisplay = null;\n messageDetail.newValue = this.formatFieldValue(field, fieldValue);\n messageDetail.newValueDisplay = await this.formatFieldValueDisplay(field, fieldValue);\n await this.chatterMessageDetailsRepo.save(messageDetail);\n }\n }\n }\n\n async postAuditMessageOnUpdate(entity: any, metadata: EntityMetadata, databaseEntity: any, updatedColumns: any[] = [], messageQueue: boolean = false) {\n if (!databaseEntity || !entity) {\n return;\n }\n const model = await this.modelMetadataRepo.findOne({\n where: {\n singularName: lowerFirst(metadata.name)\n },\n relations: {\n fields: true,\n module: true,\n userKeyField: true\n }\n });\n\n if (!model || !model.enableAuditTracking) {\n return;\n }\n\n const modelFields = await this.modelMetadataHelperService.loadFieldHierarchy(model.singularName)\n\n const auditFields = modelFields.filter(field =>\n field.enableAuditTracking &&\n !['mediaSingle', 'mediaMultiple', 'computed', 'richText', 'json'].includes(field.type) &&\n !(field.type === 'relation' && field.relationType === 'one-to-many')\n );\n\n const updatedFieldNames = new Set(updatedColumns.map(col => col.propertyName));\n\n const allNonRelationFields = auditFields.filter(field => field.type !== 'relation');\n const allRelationFields = auditFields.filter(field => field.type === 'relation');\n\n let potentialNonRelationFields = [];\n\n if (updatedColumns.length > 0) {\n potentialNonRelationFields = allNonRelationFields.filter(field =>\n updatedFieldNames.has(field.name)\n );\n } else {\n potentialNonRelationFields = allNonRelationFields;\n }\n\n const potentialRelationFields = allRelationFields;\n\n const changedNonRelationFields = potentialNonRelationFields.filter(field => {\n const newValue = entity[field.name];\n const oldValue = databaseEntity[field.name];\n return this.hasValueChanged(newValue, oldValue);\n });\n\n const changedRelationFields = [];\n if (potentialRelationFields.length > 0) {\n const populatedOldEntity = await this.populateRelationFields(databaseEntity, potentialRelationFields, metadata);\n\n for (const field of potentialRelationFields) {\n const newValue = entity[field.name];\n const oldValue = populatedOldEntity[field.name];\n\n if (this.hasRelationValueChanged(field, newValue, oldValue)) {\n changedRelationFields.push({\n field,\n newValue,\n oldValue\n });\n }\n }\n }\n\n\n const allChangedFields = [\n ...changedNonRelationFields.map(field => ({\n field,\n newValue: entity[field.name],\n oldValue: databaseEntity[field.name]\n })),\n ...changedRelationFields\n ];\n\n if (allChangedFields.length === 0) {\n return;\n }\n\n const activeUser = this.requestContextService.getActiveUser();\n\n const chatterMessage = new ChatterMessage();\n chatterMessage.messageType = CHATTER_MESSAGE_TYPE.AUDIT;\n chatterMessage.messageSubType = CHATTER_MESSAGE_SUBTYPE.AUDIT_UPDATE;\n chatterMessage.coModelEntityId = entity?.id;\n chatterMessage.coModelName = model?.singularName;\n chatterMessage.modelDisplayName = model.displayName;\n chatterMessage.modelUserKey = entity[model?.userKeyField?.name];\n chatterMessage.messageBody = `${model?.displayName} updated`;\n\n if (activeUser) {\n const userId = activeUser?.sub;\n chatterMessage.user = { id: userId } as any;\n } else {\n chatterMessage.user = null;\n }\n\n const savedMessage = await this.repo.save(chatterMessage);\n\n for (const { field, newValue, oldValue } of allChangedFields) {\n const messageDetail = new ChatterMessageDetails();\n messageDetail.chatterMessage = savedMessage;\n messageDetail.fieldName = field.name;\n messageDetail.fieldDisplayName = field.displayName;\n messageDetail.oldValue = this.formatFieldValue(field, oldValue);\n messageDetail.newValue = this.formatFieldValue(field, newValue);\n messageDetail.oldValueDisplay = await this.formatFieldValueDisplay(field, oldValue);\n messageDetail.newValueDisplay = await this.formatFieldValueDisplay(field, newValue);\n await this.chatterMessageDetailsRepo.save(messageDetail);\n }\n }\n\n async postAuditMessageOnDelete(entity: any, metadata: EntityMetadata, databaseEntity: any, messageQueue: boolean = false) {\n const model = await this.modelMetadataRepo.findOne({\n where: {\n singularName: lowerFirst(metadata.name)\n },\n relations: {\n fields: true,\n module: true,\n userKeyField: true\n }\n });\n\n if (!model || !model.enableAuditTracking) {\n return;\n }\n\n const chatterMessage = new ChatterMessage();\n chatterMessage.messageType = CHATTER_MESSAGE_TYPE.AUDIT;\n chatterMessage.messageSubType = CHATTER_MESSAGE_SUBTYPE.AUDIT_DELETE;\n chatterMessage.coModelEntityId = databaseEntity?.id;\n chatterMessage.coModelName = model?.singularName;\n chatterMessage.modelDisplayName = model?.displayName;\n chatterMessage.modelUserKey = entity[model?.userKeyField?.name];\n chatterMessage.messageBody = `${model?.displayName} deleted`;\n\n const activeUser = this.requestContextService.getActiveUser();\n\n if (activeUser) {\n const userId = activeUser?.sub;\n chatterMessage.user = { id: userId } as any;\n } else {\n chatterMessage.user = null;\n }\n\n await this.repo.save(chatterMessage);\n }\n\n private formatFieldValue(field: any, value: any): string {\n if (value === null || value === undefined) {\n return '';\n }\n\n if (field.type === 'selectionStatic' || field.type === 'selectionDynamic') {\n return `${value}`;\n }\n\n if (field.type === 'relation') {\n if (field.relationType === \"many-to-one\") {\n return value.id;\n }\n if (field.relationType === 'many-to-many') {\n return value.map(item => item.id).join(', ');\n }\n }\n\n\n return value.toString();\n }\n\n private async formatFieldValueDisplay(field: any, value: any): Promise<string> {\n if (value === null || value === undefined) {\n return '';\n }\n\n if (field.type === 'selectionStatic' || field.type === 'selectionDynamic') {\n return `${value}`;\n }\n\n if (field.type === 'relation') {\n if (field.relationType === \"many-to-one\") {\n if (value.name) {\n return value.name;\n }\n \n try {\n const relatedModel = await this.modelMetadataRepo.findOne({\n where: { singularName: field.relationCoModelSingularName || field.relation },\n relations: { userKeyField: true }\n });\n \n if (relatedModel && relatedModel.userKeyField) {\n const userKeyFieldName = relatedModel.userKeyField.name;\n return value[userKeyFieldName] ? value[userKeyFieldName].toString() : '';\n }\n \n if (value.id) {\n return value.id.toString();\n }\n } catch (error) {\n console.error('Error fetching related model metadata:', error);\n return value.id ? value.id.toString() : '';\n }\n }\n\n if (field.relationType === 'many-to-many') {\n return value.map(item => item.name).join(', ');\n }\n }\n\n\n return value.toString();\n }\n\n private hasValueChanged(newValue: any, oldValue: any): boolean {\n if (newValue === oldValue) {\n return false;\n }\n\n if (newValue === null && oldValue === null) {\n return false;\n }\n\n if (newValue === undefined && oldValue === undefined) {\n return false;\n }\n\n if (newValue && oldValue && typeof newValue === 'object' && typeof oldValue === 'object') {\n if (newValue.id !== undefined && oldValue.id !== undefined) {\n return newValue.id !== oldValue.id;\n }\n\n if (Array.isArray(newValue) && Array.isArray(oldValue)) {\n if (newValue.length !== oldValue.length) {\n return true;\n }\n const newIds = newValue.map(item => item.id || item).sort();\n const oldIds = oldValue.map(item => item.id || item).sort();\n return JSON.stringify(newIds) !== JSON.stringify(oldIds);\n }\n }\n\n if (Array.isArray(newValue) && Array.isArray(oldValue)) {\n return JSON.stringify(newValue) !== JSON.stringify(oldValue);\n }\n\n return true;\n }\n\n private hasRelationValueChanged(field: any, newValue: any, oldValue: any): boolean {\n if (newValue === oldValue) {\n return false;\n }\n\n if ((newValue === null || newValue === undefined) && (oldValue === null || oldValue === undefined)) {\n return false;\n }\n\n if (field.relationType === 'many-to-one') {\n const newId = this.extractRelationId(newValue);\n const oldId = this.extractRelationId(oldValue);\n return newId !== oldId;\n }\n\n if (field.relationType === 'many-to-many') {\n const newIds = this.extractRelationIds(newValue);\n const oldIds = this.extractRelationIds(oldValue);\n\n if (newIds.length !== oldIds.length) {\n return true;\n }\n\n newIds.sort();\n oldIds.sort();\n\n return JSON.stringify(newIds) !== JSON.stringify(oldIds);\n }\n\n return this.hasValueChanged(newValue, oldValue);\n }\n\n private extractRelationId(value: any): any {\n if (value === null || value === undefined) {\n return null;\n }\n\n if (typeof value === 'string' || typeof value === 'number') {\n return value;\n }\n\n if (typeof value === 'object' && value.id !== undefined) {\n return value.id;\n }\n\n return null;\n }\n\n private extractRelationIds(value: any): any[] {\n if (!Array.isArray(value)) {\n const id = this.extractRelationId(value);\n return id !== null ? [id] : [];\n }\n\n return value.map(item => this.extractRelationId(item)).filter(id => id !== null);\n }\n\n private async populateRelationFields(databaseEntity: any, relationFields: any[], metadata: EntityMetadata): Promise<any> {\n const populatedEntity = { ...databaseEntity };\n\n for (const field of relationFields) {\n const relationValue = databaseEntity[field.name];\n\n if (relationValue === null || relationValue === undefined) {\n populatedEntity[field.name] = relationValue;\n continue;\n }\n\n const relationMetadata = metadata.relations.find(rel => rel.propertyName === field.name);\n if (!relationMetadata) {\n populatedEntity[field.name] = relationValue;\n continue;\n }\n\n const targetEntity = relationMetadata.inverseEntityMetadata || relationMetadata.type;\n\n if (field.relationType === 'many-to-one') {\n const relationId = this.extractRelationId(relationValue);\n if (relationId) {\n const relatedEntity = await this.entityManager.findOne(targetEntity as any, {\n where: { id: relationId }\n });\n populatedEntity[field.name] = relatedEntity;\n } else {\n populatedEntity[field.name] = relationValue;\n }\n } else if (field.relationType === 'many-to-many' || field.relationType === 'manyToMany') {\n const relationIds = this.extractRelationIds(relationValue);\n if (relationIds.length > 0) {\n const relatedEntities = await this.entityManager.findByIds(targetEntity as any, relationIds);\n populatedEntity[field.name] = relatedEntities;\n } else {\n populatedEntity[field.name] = relationValue;\n }\n } else {\n populatedEntity[field.name] = relationValue;\n }\n }\n\n return populatedEntity;\n }\n\n async getChatterMessages(\n entityId: number,\n entityName: string,\n query: any\n ) {\n const { limit = 25, offset = 0, sort, populate = [], populateMedia = [] } = query;\n\n const model = await this.modelMetadataRepo.findOne({\n where: {\n singularName: entityName\n },\n });\n const oneToManyFields = await this.fieldMetadataRepo.find({\n where: {\n model: { id: model.id },\n type: 'relation',\n relationType: 'one-to-many'\n }\n });\n\n const relatedEntitiesMap = new Map<string, number[]>();\n\n for (const field of oneToManyFields) {\n const coModelName = field.relationCoModelSingularName;\n const coModelFieldName = field.relationCoModelFieldName;\n\n const coModel = await this.modelMetadataRepo.findOne({\n where: { singularName: coModelName }\n });\n\n if (coModel) {\n const relatedEntityRepository = this.entityManager.getRepository(classify(coModelName));\n\n const relatedEntities = await relatedEntityRepository.find({\n where: { [coModelFieldName]: { id: entityId } }\n });\n\n const relatedIds = relatedEntities.map((entity: any) => entity.id);\n relatedEntitiesMap.set(field.name, relatedIds);\n }\n }\n\n const qb = this.repo.createQueryBuilder('entity');\n\n const orConditions: string[] = [];\n const parameters: any = {};\n\n orConditions.push('(entity.coModelName = :entityName AND entity.coModelEntityId = :entityId)');\n parameters.entityName = entityName;\n parameters.entityId = entityId;\n\n let paramIndex = 0;\n for (const [fieldName, relatedIds] of relatedEntitiesMap.entries()) {\n if (relatedIds.length > 0) {\n const field = oneToManyFields.find(f => f.name === fieldName);\n if (field) {\n const coModelName = field.relationCoModelSingularName;\n const idsParamName = `relatedIds${paramIndex}`;\n orConditions.push(`(entity.coModelName = :coModelName${paramIndex} AND entity.coModelEntityId IN (:...${idsParamName}))`);\n parameters[`coModelName${paramIndex}`] = coModelName;\n parameters[idsParamName] = relatedIds;\n paramIndex++;\n }\n }\n }\n\n qb.where(orConditions.join(' OR '), parameters);\n\n const relations = ['chatterMessageDetails', 'user'];\n if (populate && populate.length > 0) {\n const normalizedPopulate = this.crudHelperService.normalize(populate);\n relations.push(...normalizedPopulate.filter(rel => !relations.includes(rel)));\n }\n\n relations.forEach(relation => {\n qb.leftJoinAndSelect(`entity.${relation}`, relation);\n });\n\n qb.orderBy('entity.createdAt', 'DESC');\n\n qb.skip(offset).take(limit);\n\n const [entities, count] = await qb.getManyAndCount();\n\n if (populateMedia && populateMedia.length > 0) {\n const normalizedPopulateMedia = this.crudHelperService.normalize(populateMedia);\n await this['handlePopulateMedia'](normalizedPopulateMedia, entities);\n }\n\n const currentPage = Math.floor(offset / limit) + 1;\n const totalPages = Math.ceil(count / limit);\n const nextPage = currentPage < totalPages ? currentPage + 1 : null;\n const prevPage = currentPage > 1 ? currentPage - 1 : null;\n\n return {\n meta: {\n totalRecords: count,\n currentPage: currentPage,\n nextPage: nextPage,\n prevPage: prevPage,\n totalPages: totalPages,\n perPage: +limit,\n },\n records: entities\n };\n }\n}\n"]}
1
+ {"version":3,"file":"chatter-message.service.js","sourceRoot":"","sources":["../../src/services/chatter-message.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { Injectable } from '@nestjs/common';\nimport { InjectEntityManager, InjectRepository } from '@nestjs/typeorm';\nimport { DiscoveryService, ModuleRef } from \"@nestjs/core\";\nimport { EntityManager, Repository, EntityMetadata, Brackets } from 'typeorm';\n\nimport { CRUDService } from 'src/services/crud.service';\nimport { ModelMetadataService } from 'src/services/model-metadata.service';\nimport { ModuleMetadataService } from 'src/services/module-metadata.service';\nimport { ConfigService } from '@nestjs/config';\nimport { FileService } from 'src/services/file.service';\nimport { CrudHelperService } from 'src/services/crud-helper.service';\nimport { PostChatterMessageDto } from 'src/dtos/post-chatter-message.dto';\nimport { ChatterMessage } from '../entities/chatter-message.entity';\nimport { getMediaStorageProvider } from './mediaStorageProviders';\nimport { MediaStorageProviderType } from '../dtos/create-media-storage-provider-metadata.dto';\nimport { ChatterMessageDetails } from '../entities/chatter-message-details.entity';\nimport { ModelMetadata } from 'src/entities/model-metadata.entity';\nimport { RequestContextService } from './request-context.service';\nimport { ChatterMessageRepository } from 'src/repository/chatter-message.repository';\nimport { lowerFirst } from 'src/helpers/string.helper';\nimport { ModelMetadataHelperService } from 'src/helpers/model-metadata-helper.service';\nimport { ChatterMessageDetailsRepository } from 'src/repository/chatter-message-details.repository';\nimport { FieldMetadata } from 'src/entities/field-metadata.entity';\nimport { CHATTER_MESSAGE_TYPE, CHATTER_MESSAGE_SUBTYPE } from 'src/constants/chatter-message.constants';\nimport { classify } from '@angular-devkit/core/src/utils/strings';\n@Injectable()\nexport class ChatterMessageService extends CRUDService<ChatterMessage> {\n constructor(\n readonly modelMetadataService: ModelMetadataService,\n readonly moduleMetadataService: ModuleMetadataService,\n readonly configService: ConfigService,\n readonly fileService: FileService,\n readonly discoveryService: DiscoveryService,\n readonly crudHelperService: CrudHelperService,\n @InjectEntityManager()\n readonly entityManager: EntityManager,\n // @InjectRepository(ChatterMessage, 'default')\n readonly repo: ChatterMessageRepository,\n // @InjectRepository(ChatterMessageDetailsRepository, 'default')\n readonly chatterMessageDetailsRepo: ChatterMessageDetailsRepository,\n @InjectRepository(FieldMetadata, 'default')\n readonly fieldMetadataRepo: Repository<FieldMetadata>,\n readonly moduleRef: ModuleRef,\n @InjectRepository(ModelMetadata)\n private readonly modelMetadataRepo: Repository<ModelMetadata>,\n readonly requestContextService: RequestContextService,\n private readonly modelMetadataHelperService: ModelMetadataHelperService,\n ) {\n super(modelMetadataService, moduleMetadataService, configService, fileService, discoveryService, crudHelperService, entityManager, repo, 'chatterMessage', 'solid-core', moduleRef);\n }\n\n async postMessage(postDto: PostChatterMessageDto, files: Express.Multer.File[] = []) {\n const chatterMessage = new ChatterMessage();\n chatterMessage.messageType = CHATTER_MESSAGE_TYPE.CUSTOM;\n chatterMessage.messageSubType = postDto.messageSubType || CHATTER_MESSAGE_SUBTYPE.CUSTOM;\n chatterMessage.messageBody = postDto.messageBody;\n chatterMessage.coModelEntityId = postDto.coModelEntityId;\n chatterMessage.coModelName = postDto.coModelName;\n\n const activeUser = this.requestContextService.getActiveUser();\n\n if (activeUser) {\n const userId = activeUser?.sub;\n chatterMessage.user = { id: userId } as any;\n } else {\n chatterMessage.user = null;\n }\n\n const savedMessage = await this.repo.save(chatterMessage);\n\n if (files && files.length > 0) {\n const model = await this.modelMetadataService.findOneBySingularName('chatterMessage', {\n fields: {\n model: true,\n mediaStorageProvider: true,\n },\n module: true,\n });\n\n const mediaFields = model.fields.filter(field => field.type === 'mediaSingle' || field.type === 'mediaMultiple');\n\n for (const mediaField of mediaFields) {\n const media = files.filter(multerFile => multerFile.fieldname === mediaField.name);\n if (media.length > 0) {\n const storageProviderMetadata = mediaField.mediaStorageProvider;\n const storageProviderType = storageProviderMetadata.type as MediaStorageProviderType;\n const storageProvider = await getMediaStorageProvider(this.moduleRef, storageProviderType);\n await storageProvider.store(media, savedMessage, mediaField);\n }\n }\n }\n\n return savedMessage;\n }\n\n async postAuditMessageOnInsert(entity: any, metadata: EntityMetadata, messageQueue: boolean = false) {\n if (!entity) {\n return;\n }\n const model = await this.modelMetadataRepo.findOne({\n where: {\n singularName: lowerFirst(metadata.name)\n },\n relations: {\n fields: true,\n module: true,\n userKeyField: true\n }\n });\n\n if (!model || !model.enableAuditTracking) {\n return;\n }\n\n const auditFields = model.fields.filter(field =>\n field.enableAuditTracking &&\n !['mediaSingle', 'mediaMultiple', 'computed', 'richText', 'json'].includes(field.type) &&\n !(field.type === 'relation' && field.relationType === 'one-to-many')\n );\n\n const activeUser = this.requestContextService.getActiveUser();\n\n const chatterMessage = new ChatterMessage();\n chatterMessage.messageType = CHATTER_MESSAGE_TYPE.AUDIT;\n chatterMessage.messageSubType = CHATTER_MESSAGE_SUBTYPE.AUDIT_INSERT;\n chatterMessage.coModelEntityId = entity.id;\n chatterMessage.coModelName = model?.singularName;\n chatterMessage.modelDisplayName = model?.displayName;\n chatterMessage.modelUserKey = entity[model?.userKeyField?.name];\n chatterMessage.messageBody = `New ${model?.displayName} created`;\n\n if (activeUser) {\n const userId = activeUser?.sub;\n chatterMessage.user = { id: userId } as any;\n } else {\n chatterMessage.user = null;\n }\n\n const savedMessage = await this.repo.save(chatterMessage);\n\n for (const field of auditFields) {\n const fieldValue = entity[field.name];\n if (fieldValue !== undefined && fieldValue !== null && fieldValue !== '') {\n const messageDetail = new ChatterMessageDetails();\n messageDetail.chatterMessage = savedMessage;\n messageDetail.fieldName = field.name;\n messageDetail.fieldDisplayName = field.displayName;\n messageDetail.oldValue = null;\n messageDetail.oldValueDisplay = null;\n messageDetail.newValue = this.formatFieldValue(field, fieldValue);\n messageDetail.newValueDisplay = await this.formatFieldValueDisplay(field, fieldValue);\n await this.chatterMessageDetailsRepo.save(messageDetail);\n }\n }\n }\n\n async postAuditMessageOnUpdate(entity: any, metadata: EntityMetadata, databaseEntity: any, updatedColumns: any[] = [], messageQueue: boolean = false) {\n if (!databaseEntity || !entity) {\n return;\n }\n const model = await this.modelMetadataRepo.findOne({\n where: {\n singularName: lowerFirst(metadata.name)\n },\n relations: {\n fields: true,\n module: true,\n userKeyField: true\n }\n });\n\n if (!model || !model.enableAuditTracking) {\n return;\n }\n\n const modelFields = await this.modelMetadataHelperService.loadFieldHierarchy(model.singularName)\n\n const auditFields = modelFields.filter(field =>\n field.enableAuditTracking &&\n !['mediaSingle', 'mediaMultiple', 'computed', 'richText', 'json'].includes(field.type) &&\n !(field.type === 'relation' && field.relationType === 'one-to-many')\n );\n\n const updatedFieldNames = new Set(updatedColumns.map(col => col.propertyName));\n\n const allNonRelationFields = auditFields.filter(field => field.type !== 'relation');\n const allRelationFields = auditFields.filter(field => field.type === 'relation');\n\n let potentialNonRelationFields = [];\n\n if (updatedColumns.length > 0) {\n potentialNonRelationFields = allNonRelationFields.filter(field =>\n updatedFieldNames.has(field.name)\n );\n } else {\n potentialNonRelationFields = allNonRelationFields;\n }\n\n const potentialRelationFields = allRelationFields;\n\n const changedNonRelationFields = potentialNonRelationFields.filter(field => {\n const newValue = entity[field.name];\n const oldValue = databaseEntity[field.name];\n return this.hasValueChanged(newValue, oldValue);\n });\n\n const changedRelationFields = [];\n if (potentialRelationFields.length > 0) {\n const populatedOldEntity = await this.populateRelationFields(databaseEntity, potentialRelationFields, metadata);\n\n for (const field of potentialRelationFields) {\n const newValue = entity[field.name];\n const oldValue = populatedOldEntity[field.name];\n\n if (this.hasRelationValueChanged(field, newValue, oldValue)) {\n changedRelationFields.push({\n field,\n newValue,\n oldValue\n });\n }\n }\n }\n\n\n const allChangedFields = [\n ...changedNonRelationFields.map(field => ({\n field,\n newValue: entity[field.name],\n oldValue: databaseEntity[field.name]\n })),\n ...changedRelationFields\n ];\n\n if (allChangedFields.length === 0) {\n return;\n }\n\n const activeUser = this.requestContextService.getActiveUser();\n\n const chatterMessage = new ChatterMessage();\n chatterMessage.messageType = CHATTER_MESSAGE_TYPE.AUDIT;\n chatterMessage.messageSubType = CHATTER_MESSAGE_SUBTYPE.AUDIT_UPDATE;\n chatterMessage.coModelEntityId = entity?.id;\n chatterMessage.coModelName = model?.singularName;\n chatterMessage.modelDisplayName = model.displayName;\n chatterMessage.modelUserKey = entity[model?.userKeyField?.name];\n chatterMessage.messageBody = `${model?.displayName} updated`;\n\n if (activeUser) {\n const userId = activeUser?.sub;\n chatterMessage.user = { id: userId } as any;\n } else {\n chatterMessage.user = null;\n }\n\n const savedMessage = await this.repo.save(chatterMessage);\n\n for (const { field, newValue, oldValue } of allChangedFields) {\n const messageDetail = new ChatterMessageDetails();\n messageDetail.chatterMessage = savedMessage;\n messageDetail.fieldName = field.name;\n messageDetail.fieldDisplayName = field.displayName;\n messageDetail.oldValue = this.formatFieldValue(field, oldValue);\n messageDetail.newValue = this.formatFieldValue(field, newValue);\n messageDetail.oldValueDisplay = await this.formatFieldValueDisplay(field, oldValue);\n messageDetail.newValueDisplay = await this.formatFieldValueDisplay(field, newValue);\n await this.chatterMessageDetailsRepo.save(messageDetail);\n }\n }\n\n async postAuditMessageOnDelete(entity: any, metadata: EntityMetadata, databaseEntity: any, messageQueue: boolean = false) {\n const model = await this.modelMetadataRepo.findOne({\n where: {\n singularName: lowerFirst(metadata.name)\n },\n relations: {\n fields: true,\n module: true,\n userKeyField: true\n }\n });\n\n if (!model || !model.enableAuditTracking) {\n return;\n }\n\n const chatterMessage = new ChatterMessage();\n chatterMessage.messageType = CHATTER_MESSAGE_TYPE.AUDIT;\n chatterMessage.messageSubType = CHATTER_MESSAGE_SUBTYPE.AUDIT_DELETE;\n chatterMessage.coModelEntityId = databaseEntity?.id;\n chatterMessage.coModelName = model?.singularName;\n chatterMessage.modelDisplayName = model?.displayName;\n chatterMessage.modelUserKey = entity[model?.userKeyField?.name];\n chatterMessage.messageBody = `${model?.displayName} deleted`;\n\n const activeUser = this.requestContextService.getActiveUser();\n\n if (activeUser) {\n const userId = activeUser?.sub;\n chatterMessage.user = { id: userId } as any;\n } else {\n chatterMessage.user = null;\n }\n\n await this.repo.save(chatterMessage);\n }\n\n private formatFieldValue(field: any, value: any): string {\n if (value === null || value === undefined) {\n return '';\n }\n\n if (field.type === 'selectionStatic' || field.type === 'selectionDynamic') {\n return `${value}`;\n }\n\n if (field.type === 'relation') {\n if (field.relationType === \"many-to-one\") {\n return value.id;\n }\n if (field.relationType === 'many-to-many') {\n return value.map(item => item.id).join(', ');\n }\n }\n\n\n return value.toString();\n }\n\n private async formatFieldValueDisplay(field: any, value: any): Promise<string> {\n if (value === null || value === undefined) {\n return '';\n }\n\n if (field.type === 'selectionStatic' || field.type === 'selectionDynamic') {\n return `${value}`;\n }\n\n if (field.type === 'relation') {\n if (field.relationType === \"many-to-one\") {\n if (value.name) {\n return value.name;\n }\n \n try {\n const relatedModel = await this.modelMetadataRepo.findOne({\n where: { singularName: field.relationCoModelSingularName || field.relation },\n relations: { userKeyField: true }\n });\n \n if (relatedModel && relatedModel.userKeyField) {\n const userKeyFieldName = relatedModel.userKeyField.name;\n return value[userKeyFieldName] ? value[userKeyFieldName].toString() : '';\n }\n \n if (value.id) {\n return value.id.toString();\n }\n } catch (error) {\n console.error('Error fetching related model metadata:', error);\n return value.id ? value.id.toString() : '';\n }\n }\n\n if (field.relationType === 'many-to-many') {\n return value.map(item => item.name).join(', ');\n }\n }\n\n\n return value.toString();\n }\n\n private hasValueChanged(newValue: any, oldValue: any): boolean {\n if (newValue === oldValue) {\n return false;\n }\n\n if (newValue === null && oldValue === null) {\n return false;\n }\n\n if (newValue === undefined && oldValue === undefined) {\n return false;\n }\n\n if (newValue && oldValue && typeof newValue === 'object' && typeof oldValue === 'object') {\n if (newValue.id !== undefined && oldValue.id !== undefined) {\n return newValue.id !== oldValue.id;\n }\n\n if (Array.isArray(newValue) && Array.isArray(oldValue)) {\n if (newValue.length !== oldValue.length) {\n return true;\n }\n const newIds = newValue.map(item => item.id || item).sort();\n const oldIds = oldValue.map(item => item.id || item).sort();\n return JSON.stringify(newIds) !== JSON.stringify(oldIds);\n }\n }\n\n if (Array.isArray(newValue) && Array.isArray(oldValue)) {\n return JSON.stringify(newValue) !== JSON.stringify(oldValue);\n }\n\n return true;\n }\n\n private hasRelationValueChanged(field: any, newValue: any, oldValue: any): boolean {\n if (newValue === oldValue) {\n return false;\n }\n\n if ((newValue === null || newValue === undefined) && (oldValue === null || oldValue === undefined)) {\n return false;\n }\n\n if (field.relationType === 'many-to-one') {\n const newId = this.extractRelationId(newValue);\n const oldId = this.extractRelationId(oldValue);\n return newId !== oldId;\n }\n\n if (field.relationType === 'many-to-many') {\n const newIds = this.extractRelationIds(newValue);\n const oldIds = this.extractRelationIds(oldValue);\n\n if (newIds.length !== oldIds.length) {\n return true;\n }\n\n newIds.sort();\n oldIds.sort();\n\n return JSON.stringify(newIds) !== JSON.stringify(oldIds);\n }\n\n return this.hasValueChanged(newValue, oldValue);\n }\n\n private extractRelationId(value: any): any {\n if (value === null || value === undefined) {\n return null;\n }\n\n if (typeof value === 'string' || typeof value === 'number') {\n return value;\n }\n\n if (typeof value === 'object' && value.id !== undefined) {\n return value.id;\n }\n\n return null;\n }\n\n private extractRelationIds(value: any): any[] {\n if (!Array.isArray(value)) {\n const id = this.extractRelationId(value);\n return id !== null ? [id] : [];\n }\n\n return value.map(item => this.extractRelationId(item)).filter(id => id !== null);\n }\n\n private async populateRelationFields(databaseEntity: any, relationFields: any[], metadata: EntityMetadata): Promise<any> {\n const populatedEntity = { ...databaseEntity };\n\n for (const field of relationFields) {\n const relationValue = databaseEntity[field.name];\n\n if (relationValue === null || relationValue === undefined) {\n populatedEntity[field.name] = relationValue;\n continue;\n }\n\n const relationMetadata = metadata.relations.find(rel => rel.propertyName === field.name);\n if (!relationMetadata) {\n populatedEntity[field.name] = relationValue;\n continue;\n }\n\n const targetEntity = relationMetadata.inverseEntityMetadata || relationMetadata.type;\n\n if (field.relationType === 'many-to-one') {\n const relationId = this.extractRelationId(relationValue);\n if (relationId) {\n const relatedEntity = await this.entityManager.findOne(targetEntity as any, {\n where: { id: relationId }\n });\n populatedEntity[field.name] = relatedEntity;\n } else {\n populatedEntity[field.name] = relationValue;\n }\n } else if (field.relationType === 'many-to-many' || field.relationType === 'manyToMany') {\n const relationIds = this.extractRelationIds(relationValue);\n if (relationIds.length > 0) {\n const relatedEntities = await this.entityManager.findByIds(targetEntity as any, relationIds);\n populatedEntity[field.name] = relatedEntities;\n } else {\n populatedEntity[field.name] = relationValue;\n }\n } else {\n populatedEntity[field.name] = relationValue;\n }\n }\n\n return populatedEntity;\n }\n\n async getChatterMessages(\n entityId: number,\n entityName: string,\n query: any\n ) {\n const { limit = 25, offset = 0, populate = [], populateMedia = [], filters } = query;\n\n const model = await this.modelMetadataRepo.findOne({\n where: {\n singularName: entityName\n },\n });\n const oneToManyFields = await this.fieldMetadataRepo.find({\n where: {\n model: { id: model.id },\n type: 'relation',\n relationType: 'one-to-many'\n }\n });\n\n const relatedEntitiesMap = new Map<string, number[]>();\n\n for (const field of oneToManyFields) {\n const coModelName = field.relationCoModelSingularName;\n const coModelFieldName = field.relationCoModelFieldName;\n\n const coModel = await this.modelMetadataRepo.findOne({\n where: { singularName: coModelName }\n });\n\n if (coModel) {\n const relatedEntityRepository = this.entityManager.getRepository(classify(coModelName));\n\n const relatedEntities = await relatedEntityRepository.find({\n where: { [coModelFieldName]: { id: entityId } }\n });\n\n const relatedIds = relatedEntities.map((entity: any) => entity.id);\n relatedEntitiesMap.set(field.name, relatedIds);\n }\n }\n\n const qb = this.repo.createQueryBuilder('entity');\n\n const orConditions: string[] = [];\n const parameters: any = {};\n\n orConditions.push('(entity.coModelName = :entityName AND entity.coModelEntityId = :entityId)');\n parameters.entityName = entityName;\n parameters.entityId = entityId;\n\n let paramIndex = 0;\n for (const [fieldName, relatedIds] of relatedEntitiesMap.entries()) {\n if (relatedIds.length > 0) {\n const field = oneToManyFields.find(f => f.name === fieldName);\n if (field) {\n const coModelName = field.relationCoModelSingularName;\n const idsParamName = `relatedIds${paramIndex}`;\n orConditions.push(`(entity.coModelName = :coModelName${paramIndex} AND entity.coModelEntityId IN (:...${idsParamName}))`);\n parameters[`coModelName${paramIndex}`] = coModelName;\n parameters[idsParamName] = relatedIds;\n paramIndex++;\n }\n }\n }\n\n qb.where(new Brackets(qb => {\n qb.where(orConditions.join(' OR '), parameters);\n }));\n\n const relations = ['chatterMessageDetails', 'user'];\n if (populate && populate.length > 0) {\n const normalizedPopulate = this.crudHelperService.normalize(populate);\n relations.push(...normalizedPopulate.filter(rel => !relations.includes(rel)));\n }\n\n relations.forEach(relation => {\n qb.leftJoinAndSelect(`entity.${relation}`, relation);\n });\n\n if (filters) {\n qb.andWhere(new Brackets(whereQb => {\n this.crudHelperService.applyFilters(whereQb, filters, 'entity', qb);\n }));\n }\n\n qb.orderBy('entity.createdAt', 'DESC');\n\n qb.skip(offset).take(limit);\n\n const [entities, count] = await qb.getManyAndCount();\n\n if (populateMedia && populateMedia.length > 0) {\n const normalizedPopulateMedia = this.crudHelperService.normalize(populateMedia);\n await this['handlePopulateMedia'](normalizedPopulateMedia, entities);\n }\n\n const currentPage = Math.floor(offset / limit) + 1;\n const totalPages = Math.ceil(count / limit);\n const nextPage = currentPage < totalPages ? currentPage + 1 : null;\n const prevPage = currentPage > 1 ? currentPage - 1 : null;\n\n return {\n meta: {\n totalRecords: count,\n currentPage: currentPage,\n nextPage: nextPage,\n prevPage: prevPage,\n totalPages: totalPages,\n perPage: +limit,\n },\n records: entities\n };\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"ingest-metadata.service.d.ts","sourceRoot":"","sources":["../../../src/services/genai/ingest-metadata.service.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAKxD,MAAM,MAAM,kBAAkB,GAAG;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,kBAAkB,EAAE,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACjC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IAGtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IAGtB,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB,UAAU,CAAC,EAAE,MAAM,CAAC;IAGpB,MAAM,EAAE,kBAAkB,EAAE,CAAC;CAChC,CAAC;AAEF,qBACa,qBAAqB;IAK1B,OAAO,CAAC,QAAQ,CAAC,UAAU;IAJ/B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA0C;IACjE,OAAO,CAAC,SAAS,CAAY;gBAGR,UAAU,EAAE,gBAAgB;IAajD,OAAO,CAAC,aAAa;IAerB,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,UAAU;IAMZ,MAAM;YAyEE,6BAA6B;YAoC7B,gDAAgD;YAqDhD,6BAA6B;YAgF7B,4BAA4B;IA6G1C,OAAO,CAAC,0BAA0B;YA+NpB,4BAA4B;CA4D7C"}
1
+ {"version":3,"file":"ingest-metadata.service.d.ts","sourceRoot":"","sources":["../../../src/services/genai/ingest-metadata.service.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAKxD,MAAM,MAAM,kBAAkB,GAAG;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,kBAAkB,EAAE,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACjC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IAGtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IAGtB,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB,UAAU,CAAC,EAAE,MAAM,CAAC;IAGpB,MAAM,EAAE,kBAAkB,EAAE,CAAC;CAChC,CAAC;AAEF,qBACa,qBAAqB;IAK1B,OAAO,CAAC,QAAQ,CAAC,UAAU;IAJ/B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA0C;IACjE,OAAO,CAAC,SAAS,CAAY;gBAGR,UAAU,EAAE,gBAAgB;IAajD,OAAO,CAAC,aAAa;IAerB,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,UAAU;IAMZ,MAAM;YAuFE,6BAA6B;YAmD7B,gDAAgD;YAqDhD,6BAA6B;YAuG7B,4BAA4B;IAqI1C,OAAO,CAAC,0BAA0B;YA+NpB,4BAA4B;CA4D7C"}
@@ -100,29 +100,23 @@ let IngestMetadataService = IngestMetadataService_1 = class IngestMetadataServic
100
100
  }
101
101
  async resolveRagCollectionForModule(ingestionInfo, moduleName) {
102
102
  this.logger.debug(`Resolving RAG collection for module: ${moduleName}`);
103
- let existingCollection = null;
104
- if (ingestionInfo.collectionId) {
105
- const r = await this.ragClient.collections.list({
106
- ids: [
107
- ingestionInfo.collectionId
108
- ]
109
- });
110
- if (r) {
111
- if (r.results.length === 1) {
112
- existingCollection = r.results[0];
113
- }
114
- if (r.results.length > 1) {
115
- }
103
+ const collectionName = `${moduleName}-rag-collection`;
104
+ const existingCollection = await this.ragClient.collections.retrieveByName({
105
+ name: collectionName
106
+ });
107
+ if (existingCollection) {
108
+ try {
109
+ await this.ragClient.collections.delete({ id: existingCollection.results.id });
110
+ }
111
+ catch (e) {
112
+ this.logger.warn(`[Warn] Failed deleteByFilter for collection': ${String(e)}`);
116
113
  }
117
114
  }
118
- if (!existingCollection) {
119
- const r = await this.ragClient.collections.create({
120
- name: `${moduleName}-rag-collection`,
121
- description: `Collection created to group all documents, chunks related to module: ${moduleName}`
122
- });
123
- return r.results.id;
124
- }
125
- return existingCollection.id;
115
+ const r = await this.ragClient.collections.create({
116
+ name: collectionName,
117
+ description: `Collection created to group all documents, chunks related to module: ${moduleName}`
118
+ });
119
+ return r.results.id;
126
120
  }
127
121
  async deleteInsertRagDocumentForModuleMetadataJsonFile(ingestionInfo, fullPath, fileName) {
128
122
  this.logger.debug(`Ingesting file: ${fullPath}`);
@@ -195,13 +189,21 @@ Usage: Use this chunk to choose the correct model/field chunks for code generati
195
189
  schemaHash,
196
190
  models: models.map((m) => m?.singularName).filter(Boolean),
197
191
  };
198
- if (ingestionInfo.moduleChunkId) {
199
- try {
200
- await this.ragClient.documents.delete({ id: ingestionInfo.moduleChunkId });
201
- }
202
- catch (e) {
203
- this.logger.warn(`[Warn] Failed deleting old module chunk (${ingestionInfo.moduleChunkId}): ${String(e)}`);
204
- }
192
+ try {
193
+ const deleteResult = await this.ragClient.documents.deleteByFilter({
194
+ filters: {
195
+ "$and": [
196
+ { 'metadata.kind': { $eq: 'solidx-metadata' } },
197
+ { 'metadata.type': { $eq: 'module' } },
198
+ { 'metadata.moduleName': { $eq: moduleName } },
199
+ { 'metadata.collectionName': { $eq: `${moduleName}-rag-collection` } },
200
+ ]
201
+ },
202
+ });
203
+ this.logger.log(`Deleted existing module document for moduleName: ${moduleName}. Got response:`, deleteResult);
204
+ }
205
+ catch (e) {
206
+ this.logger.warn(`[Warn] Failed deleteByFilter for module '${moduleName}': ${String(e)}`);
205
207
  }
206
208
  const r = await this.ragClient.documents.create({
207
209
  chunks: [text],
@@ -281,13 +283,22 @@ ${JSON.stringify(model)}
281
283
  hasTimestamps: !!fields.find((f) => ['time', 'date', 'datetime'].includes(f.type)),
282
284
  schemaHash,
283
285
  };
284
- if (modelEntry.modelChunkId) {
285
- try {
286
- await this.ragClient.documents.delete({ id: modelEntry.modelChunkId });
287
- }
288
- catch (e) {
289
- this.logger.warn(`[Warn] Failed deleting old model chunk (${modelEntry.modelChunkId}): ${String(e)}`);
290
- }
286
+ try {
287
+ const deleteResult = await this.ragClient.documents.deleteByFilter({
288
+ filters: {
289
+ "$and": [
290
+ { 'metadata.kind': { $eq: 'solidx-metadata' } },
291
+ { 'metadata.type': { $eq: 'model' } },
292
+ { 'metadata.moduleName': { $eq: moduleName } },
293
+ { 'metadata.modelName': { $eq: modelName } },
294
+ { 'metadata.collectionName': { $eq: `${moduleName}-rag-collection` } },
295
+ ]
296
+ },
297
+ });
298
+ this.logger.log(`Deleted existing model document for modelName: ${modelName}. Got response:`, deleteResult);
299
+ }
300
+ catch (e) {
301
+ this.logger.warn(`[Warn] Failed deleteByFilter for module '${moduleName}': ${String(e)}`);
291
302
  }
292
303
  const r = await this.ragClient.documents.create({
293
304
  chunks: [text],
@@ -1 +1 @@
1
- {"version":3,"file":"ingest-metadata.service.js","sourceRoot":"","sources":["../../../src/services/genai/ingest-metadata.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { Injectable, Logger } from '@nestjs/common';\nimport * as crypto from 'crypto';\nimport * as fs from 'fs';\nimport * as path from 'path';\n\nimport { getDynamicModuleNames } from 'src/helpers/module.helper';\nimport { CreateModuleMetadataDto } from 'src/dtos/create-module-metadata.dto';\nimport { R2RHelperService } from './r2r-helper.service';\nimport { CollectionResponse, r2rClient } from 'r2r-js';\nimport { CreateModelMetadataDto } from 'src/dtos/create-model-metadata.dto';\nimport { CreateFieldMetadataDto } from 'src/dtos/create-field-metadata.dto';\n\nexport type FieldIngestionInfo = {\n fieldName: string;\n fieldChunkId?: string;\n fieldHash?: string;\n};\n\nexport type ModelIngestionInfo = {\n modelName: string;\n modelChunkId?: string;\n modelHash?: string;\n fields: FieldIngestionInfo[];\n};\n\nexport type ModuleRAGIngestionInfo = {\n moduleName?: string;\n collectionId?: string;\n\n // Full json document is also uploaded so we track references...\n documentId?: string;\n documentHash?: string;\n\n // module references\n moduleChunkId?: string;\n // track a hash of module metadata to skip unchanged\n moduleHash?: string;\n\n // model references...\n models: ModelIngestionInfo[];\n};\n\n@Injectable()\nexport class IngestMetadataService {\n private readonly logger = new Logger(IngestMetadataService.name);\n private ragClient: r2rClient;\n\n constructor(\n private readonly r2rService: R2RHelperService,\n ) { }\n\n // Stable stringify so hashes/ids don't flap\n // private stableStringify(obj: any): string {\n // return JSON.stringify(obj, Object.keys(obj).sort(), 2);\n // }\n // private sha256(input: string): string {\n // return crypto.createHash('sha256').update(input).digest('hex');\n // }\n // private hashSchema(obj: any): string {\n // return this.sha256(this.stableStringify(obj));\n // }\n private _sha256OfJson(obj: any): string {\n const s = JSON.stringify(obj);\n return crypto.createHash('sha256').update(s).digest('hex');\n }\n // // Small natural-language one-liners for relations\n // private relationSig(model: any): string[] {\n // const rels: string[] = [];\n // for (const f of model.fields ?? []) {\n // if (f.relation?.targetModel) {\n // rels.push(`${model.singularName}.${f.name} -> ${f.relation.targetModel}(${f.relation.targetField ?? 'id'})`);\n // }\n // }\n // return rels;\n // }\n\n private _oneLineBool(b?: boolean): 'yes' | 'no' {\n return b ? 'yes' : 'no';\n }\n\n private _shortList(arr?: string[] | null, max = 10): string {\n if (!Array.isArray(arr) || arr.length === 0) return 'none';\n const a = arr.slice(0, max);\n return `${a.join(', ')}${arr.length > max ? ', …' : ''}`;\n }\n\n async ingest() {\n // Create a new ragClient...\n this.ragClient = await this.r2rService.getClient();\n\n // const allModuleMetadataJson = [];\n this.logger.debug(`getting dynamics modules`);\n const enabledModules = getDynamicModuleNames();\n this.logger.log(`ingesting metadata`);\n\n for (let i = 0; i < enabledModules.length; i++) {\n const enabledModule = enabledModules[i];\n const fileName = `${enabledModule}-metadata.json`;\n const enabledModuleSeedFile = `module-metadata/${enabledModule}/${fileName}`;\n const fullPath = path.join(process.cwd(), enabledModuleSeedFile);\n const overallMetadata: any = JSON.parse(fs.readFileSync(fullPath, 'utf-8').toString());\n\n const moduleMetadata: CreateModuleMetadataDto = overallMetadata.moduleMetadata;\n\n // Manage all the ingestion info file paths...\n const enabledModulIngestionInfoFile = `module-metadata/${enabledModule}/genai/${enabledModule}-ingested-info.json`;\n const enabledModulIngestionInfoFullPath = path.join(process.cwd(), enabledModulIngestionInfoFile);\n const ingestionInfo: ModuleRAGIngestionInfo = fs.existsSync(enabledModulIngestionInfoFullPath) ? JSON.parse(fs.readFileSync(enabledModulIngestionInfoFullPath, 'utf-8').toString()) : {};\n const enabledModulIngestionInfoDir = path.dirname(enabledModulIngestionInfoFullPath);\n if (!fs.existsSync(enabledModulIngestionInfoDir)) {\n fs.mkdirSync(enabledModulIngestionInfoDir, { recursive: true });\n }\n\n ingestionInfo.moduleName = enabledModule\n\n // Process module metadata first. \n this.logger.log(`[Start] Processing module metadata for ${moduleMetadata.name}`)\n\n // Create or use an existing collection...\n const collectionId = await this.resolveRagCollectionForModule(ingestionInfo, enabledModule)\n ingestionInfo.collectionId = collectionId;\n\n // Delete and re-insert a document representing the full json...\n // await this.deleteInsertRagDocumentForModuleMetadataJsonFile(ingestionInfo, fullPath, fileName)\n\n // Delete and re-insert a chunk representing the module.\n await this.deleteInsertRagChunkForModule(ingestionInfo, moduleMetadata);\n\n // Delete and re-insert chunks representing each model.\n for (const model of moduleMetadata.models) {\n await this.deleteInsertRagChunkForModel(ingestionInfo, enabledModule, model);\n\n // Disabling this for now...\n // for (const field of model.fields) {\n // await this.deleteInsertRagChunkForField(ingestionInfo, enabledModule, model.singularName, field);\n // }\n }\n\n // TODO: Delete and re-insert chunks representing roles\n\n // TODO: Delete and re-insert chunks representing menus \n\n // TODO: Delete and re-insert chunks representing actions\n\n // TODO: Delete and re-insert chunks representing list views \n\n // TODO: Delete and re-insert chunks representing kanban views \n\n // TODO: Delete and re-insert chunks representing form views\n\n // TODO: Delete and re-insert chunks representing security rules\n\n // TODO: Delete and re-insert chunks representing scheduled jobs\n\n // Save ingestion info to disk...\n fs.writeFileSync(enabledModulIngestionInfoFullPath, JSON.stringify({ ...ingestionInfo }, null, 2), 'utf8');\n }\n }\n\n private async resolveRagCollectionForModule(ingestionInfo: ModuleRAGIngestionInfo, moduleName: string): Promise<string> {\n this.logger.debug(`Resolving RAG collection for module: ${moduleName}`);\n\n let existingCollection: CollectionResponse = null;\n if (ingestionInfo.collectionId) {\n // See if collection already exists... \n const r = await this.ragClient.collections.list({\n ids: [\n ingestionInfo.collectionId\n ]\n });\n\n if (r) {\n if (r.results.length === 1) {\n existingCollection = r.results[0];\n }\n if (r.results.length > 1) {\n // TODO: do something that will print a meaningful error on the console...\n }\n }\n }\n\n if (!existingCollection) {\n const r = await this.ragClient.collections.create({\n name: `${moduleName}-rag-collection`,\n description: `Collection created to group all documents, chunks related to module: ${moduleName}`\n });\n\n // TODO: for some reason if we are unable to create a collection then fail with a visible error message in the console...\n\n return r.results.id;\n }\n\n return existingCollection.id;\n }\n\n private async deleteInsertRagDocumentForModuleMetadataJsonFile(ingestionInfo: ModuleRAGIngestionInfo, fullPath: string, fileName: string): Promise<void> {\n this.logger.debug(`Ingesting file: ${fullPath}`);\n\n // 1) Compute hash of the entire JSON string (as-is)\n const jsonStr = fs.readFileSync(fullPath, 'utf-8');\n const contentHash = this._sha256OfJson(JSON.parse(jsonStr));\n\n // 2) Short-circuit if unchanged and we still have a documentId\n if (ingestionInfo.documentHash === contentHash && ingestionInfo.documentId) {\n this.logger.log(`[Skip] Unchanged: ${fileName} (hash=${contentHash.slice(0, 8)}…)`);\n return;\n // return ingestionInfo.documentId;\n }\n\n // 3) Delete the previous doc if present\n if (ingestionInfo.documentId) {\n try {\n await this.ragClient.documents.delete({ id: ingestionInfo.documentId });\n } catch (e) {\n this.logger.warn(\n `[Warn] Failed deleting prior document ${ingestionInfo.documentId}: ${String(e)}`\n );\n }\n }\n\n // 4) Create a fresh document; attach the hash into metadata for traceability\n const ingestResult = await this.ragClient.documents.create({\n file: {\n path: fullPath,\n name: fileName\n },\n collectionIds: [ingestionInfo.collectionId],\n metadata: {\n contentHash,\n fileName\n },\n });\n // console.log(\"file ingest result:\", JSON.stringify(ingestResult, null, 2));\n\n const newId = ingestResult?.results?.documentId;\n if (!newId) {\n throw new Error(`R2R did not return a documentId for ${fileName}`);\n }\n\n // 5) Persist identifiers + hash on our side\n ingestionInfo.documentId = newId;\n ingestionInfo.documentHash = contentHash;\n\n this.logger.log(`[OK] Ingested ${fileName} → id=${newId}, hash=${contentHash.slice(0, 8)}…`);\n // return newId;\n\n }\n\n private async deleteInsertRagChunkForModule(ingestionInfo: ModuleRAGIngestionInfo, moduleMetadata: CreateModuleMetadataDto): Promise<void> {\n const moduleName: string = moduleMetadata?.name;\n\n // Hash the meaningful parts of the module to detect changes and skip re-ingest.\n const schemaHash = this._sha256OfJson({\n name: moduleMetadata?.name ?? null,\n description: moduleMetadata?.description ?? null,\n\n // Keep model names + brief shape so module-level hash changes when models change.\n models: (moduleMetadata?.models ?? []).map((m: any) => ({\n singularName: m?.singularName ?? null,\n description: m?.description ?? null,\n\n // Include field names to detect field-level changes at module granularity - maybe remove this later?\n // fields: Array.isArray(m?.fields) ? m.fields.map((f: any) => f?.name ?? null) : [],\n })),\n });\n\n // Skip unchanged module\n if (ingestionInfo.moduleHash === schemaHash && ingestionInfo.moduleChunkId) {\n this.logger.log(`[Skip] Module unchanged: ${moduleName}`);\n return;\n // return ingestionInfo.moduleChunkId;\n }\n\n const models: any[] = moduleMetadata?.models ?? [];\n const modelLines = models.map((m) => {\n const name = m?.singularName;\n const desc = m?.description ? `: ${m.description}` : '';\n return `- ${name}${desc}`;\n });\n\n const text = `SolidX Module: ${moduleName}\nPurpose: ${moduleMetadata?.description ?? 'N/A'}\n\nModels (${models.length}):\n${modelLines.join('\\n')}\n\nUsage: Use this chunk to choose the correct model/field chunks for code generation or metadata edits.`;\n\n // metadata has to be concise and queryable\n const metadata = {\n collectionName: `${moduleName}-rag-collection`,\n kind: 'solidx-metadata',\n type: 'module',\n moduleName,\n modelCount: models.length,\n schemaHash,\n models: models.map((m) => m?.singularName).filter(Boolean),\n };\n\n // Delete previous chunk if we have one\n if (ingestionInfo.moduleChunkId) {\n try {\n await this.ragClient.documents.delete({ id: ingestionInfo.moduleChunkId });\n } catch (e) {\n this.logger.warn(`[Warn] Failed deleting old module chunk (${ingestionInfo.moduleChunkId}): ${String(e)}`);\n }\n }\n\n const r = await this.ragClient.documents.create({\n chunks: [text],\n // raw_text: text,\n metadata: metadata,\n collectionIds: [ingestionInfo.collectionId],\n });\n\n const newId = r?.results?.documentId;\n if (!newId) {\n throw new Error(`R2R did not return a documentId while creating module chunk for module name ${moduleName}`);\n }\n\n // Update ingestion info for persistence by the caller\n ingestionInfo.moduleChunkId = r.results?.documentId;\n ingestionInfo.moduleHash = schemaHash;\n\n this.logger.log(`[OK] Ingested module ${moduleName} → id=${newId}, hash=${schemaHash.slice(0, 8)}…`);\n\n }\n\n private async deleteInsertRagChunkForModel(ingestionInfo: ModuleRAGIngestionInfo, moduleName: string, model: CreateModelMetadataDto): Promise<void> {\n const modelName: string = model?.singularName;\n\n // 1) Hash full JSON (as-is) to detect changes and skip re-ingest\n const schemaHash = this._sha256OfJson(model);\n\n // Ensure ingestionInfo.models[] has an entry for this model\n const modelsArr = ingestionInfo.models ?? (ingestionInfo.models = []);\n let modelEntry = modelsArr.find(m => m.modelName === modelName);\n if (!modelEntry) {\n modelEntry = { modelName, fields: [] };\n modelsArr.push(modelEntry);\n }\n\n // 2) Short-circuit if unchanged\n if (modelEntry.modelHash === schemaHash && modelEntry.modelChunkId) {\n this.logger.log(`[Skip] Model unchanged: ${moduleName}.${modelName}`);\n return;\n // return modelEntry.modelChunkId;\n }\n\n // 3) Build retrieval-friendly text (concise)\n const fields: CreateFieldMetadataDto[] = Array.isArray(model?.fields) ? model.fields : [];\n const userkey = fields.find((f: CreateFieldMetadataDto) => f?.isUserKey)?.name ?? 'id';\n const uniques = fields.filter((f: CreateFieldMetadataDto) => f?.unique).map((f: any) => f.name);\n const required = fields.filter((f: CreateFieldMetadataDto) => f?.required).map((f: any) => f.name);\n const rels = fields\n .filter((f: CreateFieldMetadataDto) => f.type === 'relation')\n .map((f: CreateFieldMetadataDto) => `${modelName}.${f.name} -> ${f.relationCoModelSingularName}.${f.relationCoModelColumnName ?? 'id'}`);\n\n const fieldSummaryLines = fields.slice(0, 30).map((f: CreateFieldMetadataDto) => {\n const bits = [\n `${f.name}:${f.type}`,\n f.required ? 'req' : '',\n f.unique ? 'unique' : '',\n f.isUserKey ? 'userkey' : '',\n f.relationCoModelSingularName ? `rel->${f.relationCoModelSingularName}` : '',\n ].filter(Boolean).join('|');\n return `- ${bits}`;\n });\n\n const text =\n `SolidX Model: ${modelName}\nModule: ${moduleName}\nPurpose: ${model?.description ?? 'N/A'}\n\nSignature:\n- Primary: ${userkey}\n- Unique: ${uniques.length ? uniques.join(', ') : 'none'}\n- Required (${required.length}): ${required.slice(0, 12).join(', ')}${required.length > 12 ? '…' : ''}\n\nRelations (${rels.length}):\n${rels.length ? `- ${rels.join('\\n- ')}` : 'None'}\n\nFields (${fields.length}) [name:type|flags]:\n${fieldSummaryLines.join('\\n')}\n\nUsage: Use this chunk to generate DTOs, subscribers, custom service methods, and CRUD handlers for ${modelName}.\n\nFull model metadata json: \n${JSON.stringify(model)}\n\n`;\n\n // 4) Metadata (concise & queryable)\n const metadata = {\n collectionName: `${moduleName}-rag-collection`,\n kind: 'solidx-metadata',\n type: 'model',\n moduleName,\n modelName,\n fieldCount: fields.length,\n requiredCount: required.length,\n relationCount: rels.length,\n userkey: userkey,\n uniqueFields: uniques,\n hasTimestamps: !!fields.find((f: CreateFieldMetadataDto) => ['time', 'date', 'datetime'].includes(f.type)),\n schemaHash,\n };\n\n // 5) Delete previous chunk if present\n if (modelEntry.modelChunkId) {\n try {\n await this.ragClient.documents.delete({ id: modelEntry.modelChunkId });\n } catch (e) {\n this.logger.warn(`[Warn] Failed deleting old model chunk (${modelEntry.modelChunkId}): ${String(e)}`);\n }\n }\n\n // 6) Create new document (R2R auto-generates the ID)\n const r = await this.ragClient.documents.create({\n chunks: [text],\n metadata,\n collectionIds: [ingestionInfo.collectionId],\n });\n\n const newId = r?.results?.documentId;\n if (!newId) {\n throw new Error(`R2R did not return a documentId while creating model chunk for ${moduleName}.${modelName}`);\n }\n\n // 7) Update ingestionInfo for persistence\n modelEntry.modelChunkId = newId;\n modelEntry.modelHash = schemaHash;\n\n this.logger.log(`[OK] Ingested model ${moduleName}.${modelName} → id=${newId}, hash=${schemaHash.slice(0, 8)}…`);\n // return newId;\n }\n\n private _buildFieldTextAndMetadata(moduleName: string, modelName: string, f: CreateFieldMetadataDto) {\n // Identity\n const name = f?.name;\n const displayName = f?.displayName ?? name;\n const description = f?.description ?? 'N/A';\n\n // Types\n const type = f?.type;\n const ormType = f?.ormType ?? null;\n\n // Constraints / validation\n const required = !!f?.required;\n const unique = !!f?.unique;\n const index = !!f?.index;\n const length = f?.length ?? null;\n const min = f?.min ?? null;\n const max = f?.max ?? null;\n const defaultValue = f?.defaultValue ?? null;\n const regex = f?.regexPattern ?? null;\n const regexErr = f?.regexPatternNotMatchingErrorMsg ?? null;\n\n // Relation\n const relationType = f?.relationType ?? null; // e.g., many-to-one, many-to-many, one-to-many\n const relModule = f?.relationModelModuleName ?? null;\n const relModel = f?.relationCoModelSingularName ?? null;\n const relField = f?.relationCoModelFieldName ?? 'id';\n // const relOwner = f?.isRelationManyToManyOwner ?? null;\n // const relJoinTable = f?.relationJoinTableName ?? null;\n // const relCreateInverse = !!f?.relationCreateInverse;\n const relCascade = f?.relationCascade ?? null;\n const relFixedFilter = f?.relationFieldFixedFilter ?? null;\n\n // Selection (dropdowns)\n const selectionDynProvider = f?.selectionDynamicProvider ?? null;\n const selectionDynCtxt = f?.selectionDynamicProviderCtxt ?? null;\n const selectionStatic = Array.isArray(f?.selectionStaticValues) ? f.selectionStaticValues : null;\n const selectionValueType = f?.selectionValueType ?? null;\n const isMultiSelect = !!f?.isMultiSelect;\n\n // Media (uploads)\n const mediaTypes = Array.isArray(f?.mediaTypes) ? f.mediaTypes : null;\n const mediaMaxSizeKb = f?.mediaMaxSizeKb ?? null;\n const mediaStorageProvider = f?.mediaStorageProviderUserKey ?? null; // likely object/id in your JSON\n\n // Computed fields\n const computedProvider = f?.computedFieldValueProvider ?? null;\n const computedProviderCtxt = f?.computedFieldValueProviderCtxt ?? null;\n const computedValueType = f?.computedFieldValueType ?? null;\n const computedTriggerCfg = f?.computedFieldTriggerConfig ?? null;\n\n // Security / privacy / audit\n // const encrypt = !!f?.encrypt;\n // const encryptionType = f?.encryptionType ?? null;\n // const decryptWhen = f?.decryptWhen ?? null;\n const isPrivate = !!f?.private;\n const enableAuditTracking = !!f?.enableAuditTracking;\n\n // Keys / system flags / mapping\n const isUserKey = !!f?.isUserKey;\n const isSystem = !!f?.isSystem;\n const isMarkedForRemoval = !!f?.isMarkedForRemoval;\n const columnName = f?.columnName ?? null;\n const relCoModelColumn = f?.relationCoModelColumnName ?? null;\n const uuid = f?.uuid ?? null;\n\n const relationSummary = (() => {\n if (!relationType || !relModel) return 'none';\n const parts = [\n `type=${relationType}`,\n relModule ? `module=${relModule}` : null,\n `model=${relModel}`,\n relField ? `field=${relField}` : null,\n // relOwner !== null ? `m2mOwner=${relOwner}` : null,\n // relCreateInverse ? 'createInverse=yes' : null,\n relCascade ? `cascade=${relCascade}` : null,\n // relJoinTable ? `joinTable=${relJoinTable}` : null,\n relFixedFilter ? `fixedFilter=${relFixedFilter}` : null,\n ].filter(Boolean);\n return parts.join(', ');\n })();\n\n const selectionSummary = (() => {\n const parts: string[] = [];\n if (selectionDynProvider) parts.push(`dynamicProvider=${selectionDynProvider}`);\n if (selectionDynCtxt) parts.push(`dynamicCtxt=${selectionDynCtxt}`);\n if (selectionStatic?.length) parts.push(`static=[${this._shortList(selectionStatic, 12)}]`);\n if (selectionValueType) parts.push(`valueType=${selectionValueType}`);\n parts.push(`multiSelect=${this._oneLineBool(isMultiSelect)}`);\n return parts.length ? parts.join(', ') : 'none';\n })();\n\n const mediaSummary = (() => {\n const parts: string[] = [];\n if (mediaTypes?.length) parts.push(`types=[${this._shortList(mediaTypes, 12)}]`);\n if (mediaMaxSizeKb) parts.push(`maxSizeKb=${mediaMaxSizeKb}`);\n if (mediaStorageProvider) parts.push(`storageProvider=${typeof mediaStorageProvider === 'string' ? mediaStorageProvider : 'set'}`);\n return parts.length ? parts.join(', ') : 'none';\n })();\n\n const computedSummary = (() => {\n const parts: string[] = [];\n if (computedProvider) parts.push(`provider=${computedProvider}`);\n if (computedProviderCtxt) parts.push(`providerCtxt=${computedProviderCtxt}`);\n if (computedValueType) parts.push(`valueType=${computedValueType}`);\n if (computedTriggerCfg?.length) parts.push(`triggers=${computedTriggerCfg.length}`);\n return parts.length ? parts.join(', ') : 'none';\n })();\n\n const securitySummary = [\n // `encrypt=${this.oneLineBool(encrypt)}`,\n // encryptionType ? `encType=${encryptionType}` : null,\n // decryptWhen ? `decryptWhen=${decryptWhen}` : null,\n `private=${this._oneLineBool(isPrivate)}`,\n `auditTracking=${this._oneLineBool(enableAuditTracking)}`\n ].filter(Boolean).join(', ');\n\n const constraintSummary = [\n `required=${this._oneLineBool(required)}`,\n `unique=${this._oneLineBool(unique)}`,\n `index=${this._oneLineBool(index)}`,\n length !== null ? `length=${length}` : null,\n min !== null ? `min=${min}` : null,\n max !== null ? `max=${max}` : null,\n defaultValue !== null ? `default=${defaultValue}` : null,\n regex ? `regex=${regex}${regexErr ? ` (${regexErr})` : ''}` : null\n ].filter(Boolean).join(', ');\n\n const mappingSummary = [\n columnName ? `column=${columnName}` : null,\n relCoModelColumn ? `relColumn=${relCoModelColumn}` : null,\n uuid ? `uuid=${uuid}` : null,\n `userKey=${this._oneLineBool(isUserKey)}`,\n `system=${this._oneLineBool(isSystem)}`,\n `markedForRemoval=${this._oneLineBool(isMarkedForRemoval)}`\n ].filter(Boolean).join(', ');\n\n const text = [\n `SolidX Field: ${name} (${displayName})`,\n `Model: ${modelName}`,\n `Module: ${moduleName}`,\n ``,\n `Type: ${type}${ormType ? ` (orm=${ormType})` : ''}`,\n `Description: ${description}`,\n ``,\n `Constraints: ${constraintSummary || 'none'}`,\n `Relation: ${relationSummary}`,\n `Selection: ${selectionSummary}`,\n `Media: ${mediaSummary}`,\n `Computed: ${computedSummary}`,\n `Security/Privacy/Audit: ${securitySummary}`,\n `Mapping/Flags: ${mappingSummary || 'none'}`,\n ``,\n `Usage: Use this chunk to generate exact field contracts (DTO, form control, DB column), `,\n `validation rules, relation wiring, and UI widgets (selection/media/computed).`,\n ].join('\\n');\n\n const metadata = {\n kind: 'solidx-metadata',\n type: 'field',\n moduleName,\n modelName,\n fieldName: name,\n displayName,\n description,\n dataType: type,\n ormType,\n required,\n unique,\n index,\n defaultValue,\n length,\n min,\n max,\n regexPattern: regex,\n regexPatternNotMatchingErrorMsg: regexErr,\n\n // relation\n relationType,\n relationModelModuleName: relModule,\n relationCoModelSingularName: relModel,\n relationCoModelFieldName: relField,\n // isRelationManyToManyOwner: relOwner,\n // relationJoinTableName: relJoinTable,\n // relationCreateInverse: relCreateInverse,\n relationCascade: relCascade,\n relationFieldFixedFilter: relFixedFilter,\n\n // selection\n selectionDynProvider,\n selectionDynCtxt,\n selectionStaticValues: selectionStatic,\n selectionValueType,\n isMultiSelect,\n\n // media\n mediaTypes,\n mediaMaxSizeKb,\n mediaStorageProvider: mediaStorageProvider ? (typeof mediaStorageProvider === 'string' ? mediaStorageProvider : 'set') : null,\n\n // computed\n computedFieldValueProvider: computedProvider,\n computedFieldValueProviderCtxt: computedProviderCtxt,\n computedFieldValueType: computedValueType,\n computedFieldTriggerConfigCount: Array.isArray(computedTriggerCfg) ? computedTriggerCfg.length : 0,\n\n // security/privacy/audit\n // encrypt,\n // encryptionType,\n // decryptWhen,\n private: isPrivate,\n enableAuditTracking,\n\n // mapping/flags\n columnName,\n relationCoModelColumnName: relCoModelColumn,\n isUserKey,\n isSystem,\n isMarkedForRemoval,\n };\n\n return { text, metadata };\n }\n\n private async deleteInsertRagChunkForField(ingestionInfo: ModuleRAGIngestionInfo, moduleName: string, modelName: string, field: CreateFieldMetadataDto,): Promise<string> {\n const fieldName: string = field?.name ?? 'unknown_field';\n\n // 1) Full JSON hash (as-is)\n const schemaHash = this._sha256OfJson(field);\n\n // 2) Ensure ingestionInfo entry for the model & field\n const modelsArr = ingestionInfo.models ?? (ingestionInfo.models = []);\n let modelEntry = modelsArr.find(m => m.modelName === modelName);\n if (!modelEntry) {\n modelEntry = { modelName, fields: [] };\n modelsArr.push(modelEntry);\n }\n const fieldsArr = modelEntry.fields ?? (modelEntry.fields = []);\n let fieldEntry = fieldsArr.find(f => f.fieldName === fieldName);\n if (!fieldEntry) {\n fieldEntry = { fieldName };\n fieldsArr.push(fieldEntry);\n }\n\n // 3) Skip if unchanged\n if (fieldEntry.fieldHash === schemaHash && fieldEntry.fieldChunkId) {\n this.logger.log(`[Skip] Field unchanged: ${moduleName}.${modelName}.${fieldName}`);\n return fieldEntry.fieldChunkId;\n }\n\n // 4) Build text + metadata tailored to FieldMetadata\n const { text, metadata } = this._buildFieldTextAndMetadata(moduleName, modelName, field);\n\n // also keep the hash in metadata for audit/debug\n (metadata as any).schemaHash = schemaHash;\n\n // 5) Delete previous chunk if present\n if (fieldEntry.fieldChunkId) {\n try {\n await this.ragClient.documents.delete({ id: fieldEntry.fieldChunkId });\n } catch (e) {\n this.logger.warn(`[Warn] Failed deleting old field chunk (${fieldEntry.fieldChunkId}): ${String(e)}`);\n }\n }\n\n // 6) Create new document (R2R auto-generates the ID)\n const r = await this.ragClient.documents.create({\n raw_text: text,\n metadata,\n collectionIds: [ingestionInfo.collectionId],\n });\n\n const newId = r?.results?.documentId;\n if (!newId) {\n throw new Error(`R2R did not return a documentId while creating field chunk for ${moduleName}.${modelName}.${fieldName}`);\n }\n\n // 7) Update ingestion info\n fieldEntry.fieldChunkId = newId;\n fieldEntry.fieldHash = schemaHash;\n\n this.logger.log(`[OK] Ingested field ${moduleName}.${modelName}.${fieldName} → id=${newId}, hash=${schemaHash.slice(0, 8)}…`);\n return newId;\n }\n}"]}
1
+ {"version":3,"file":"ingest-metadata.service.js","sourceRoot":"","sources":["../../../src/services/genai/ingest-metadata.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,2CAAoD;AACpD,+CAAiC;AACjC,uCAAyB;AACzB,2CAA6B;AAE7B,+DAAkE;AAElE,6DAAwD;AAoCjD,IAAM,qBAAqB,6BAA3B,MAAM,qBAAqB;IAI9B,YACqB,UAA4B;QAA5B,eAAU,GAAV,UAAU,CAAkB;QAJhC,WAAM,GAAG,IAAI,eAAM,CAAC,uBAAqB,CAAC,IAAI,CAAC,CAAC;IAK7D,CAAC;IAYG,aAAa,CAAC,GAAQ;QAC1B,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QAC9B,OAAO,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC/D,CAAC;IAYO,YAAY,CAAC,CAAW;QAC5B,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;IAC5B,CAAC;IAEO,UAAU,CAAC,GAAqB,EAAE,GAAG,GAAG,EAAE;QAC9C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,MAAM,CAAC;QAC3D,MAAM,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAC5B,OAAO,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;IAC7D,CAAC;IAED,KAAK,CAAC,MAAM;QAER,IAAI,CAAC,SAAS,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC;QAGnD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAC9C,MAAM,cAAc,GAAG,IAAA,qCAAqB,GAAE,CAAC;QAC/C,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;QAEtC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,cAAc,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC7C,MAAM,aAAa,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;YACxC,MAAM,QAAQ,GAAG,GAAG,aAAa,gBAAgB,CAAC;YAClD,MAAM,qBAAqB,GAAG,mBAAmB,aAAa,IAAI,QAAQ,EAAE,CAAC;YAC7E,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,qBAAqB,CAAC,CAAC;YACjE,MAAM,eAAe,GAAQ,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;YAEvF,MAAM,cAAc,GAA4B,eAAe,CAAC,cAAc,CAAC;YAG/E,MAAM,6BAA6B,GAAG,mBAAmB,aAAa,UAAU,aAAa,qBAAqB,CAAC;YACnH,MAAM,iCAAiC,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,6BAA6B,CAAC,CAAC;YAClG,MAAM,aAAa,GAA2B,EAAE,CAAC,UAAU,CAAC,iCAAiC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,iCAAiC,EAAE,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACzL,MAAM,4BAA4B,GAAG,IAAI,CAAC,OAAO,CAAC,iCAAiC,CAAC,CAAC;YACrF,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,4BAA4B,CAAC,EAAE,CAAC;gBAC/C,EAAE,CAAC,SAAS,CAAC,4BAA4B,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACpE,CAAC;YAED,aAAa,CAAC,UAAU,GAAG,aAAa,CAAA;YAGxC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,0CAA0C,cAAc,CAAC,IAAI,EAAE,CAAC,CAAA;YAGhF,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,6BAA6B,CAAC,aAAa,EAAE,aAAa,CAAC,CAAA;YAC3F,aAAa,CAAC,YAAY,GAAG,YAAY,CAAC;YAoB1C,MAAM,IAAI,CAAC,6BAA6B,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC;YAGxE,KAAK,MAAM,KAAK,IAAI,cAAc,CAAC,MAAM,EAAE,CAAC;gBACxC,MAAM,IAAI,CAAC,4BAA4B,CAAC,aAAa,EAAE,aAAa,EAAE,KAAK,CAAC,CAAC;YAMjF,CAAC;YAmBD,EAAE,CAAC,aAAa,CAAC,iCAAiC,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,aAAa,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QAC/G,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,6BAA6B,CAAC,aAAqC,EAAE,UAAkB;QACjG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,wCAAwC,UAAU,EAAE,CAAC,CAAC;QAExE,MAAM,cAAc,GAAG,GAAG,UAAU,iBAAiB,CAAC;QAItD,MAAM,kBAAkB,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,cAAc,CAAC;YACvE,IAAI,EAAE,cAAc;SACvB,CAAC,CAAC;QAEH,IAAI,kBAAkB,EAAE,CAAC;YACrB,IAAI,CAAC;gBACD,MAAM,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,kBAAkB,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;YACnF,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACT,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,iDAAiD,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACnF,CAAC;QACL,CAAC;QAuBD,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,MAAM,CAAC;YAC9C,IAAI,EAAE,cAAc;YACpB,WAAW,EAAE,wEAAwE,UAAU,EAAE;SACpG,CAAC,CAAC;QAGH,OAAO,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IAGxB,CAAC;IAEO,KAAK,CAAC,gDAAgD,CAAC,aAAqC,EAAE,QAAgB,EAAE,QAAgB;QACpI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,mBAAmB,QAAQ,EAAE,CAAC,CAAC;QAGjD,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACnD,MAAM,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QAG5D,IAAI,aAAa,CAAC,YAAY,KAAK,WAAW,IAAI,aAAa,CAAC,UAAU,EAAE,CAAC;YACzE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,qBAAqB,QAAQ,UAAU,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;YACpF,OAAO;QAEX,CAAC;QAGD,IAAI,aAAa,CAAC,UAAU,EAAE,CAAC;YAC3B,IAAI,CAAC;gBACD,MAAM,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,aAAa,CAAC,UAAU,EAAE,CAAC,CAAC;YAC5E,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACT,IAAI,CAAC,MAAM,CAAC,IAAI,CACZ,yCAAyC,aAAa,CAAC,UAAU,KAAK,MAAM,CAAC,CAAC,CAAC,EAAE,CACpF,CAAC;YACN,CAAC;QACL,CAAC;QAGD,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC;YACvD,IAAI,EAAE;gBACF,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,QAAQ;aACjB;YACD,aAAa,EAAE,CAAC,aAAa,CAAC,YAAY,CAAC;YAC3C,QAAQ,EAAE;gBACN,WAAW;gBACX,QAAQ;aACX;SACJ,CAAC,CAAC;QAGH,MAAM,KAAK,GAAG,YAAY,EAAE,OAAO,EAAE,UAAU,CAAC;QAChD,IAAI,CAAC,KAAK,EAAE,CAAC;YACT,MAAM,IAAI,KAAK,CAAC,uCAAuC,QAAQ,EAAE,CAAC,CAAC;QACvE,CAAC;QAGD,aAAa,CAAC,UAAU,GAAG,KAAK,CAAC;QACjC,aAAa,CAAC,YAAY,GAAG,WAAW,CAAC;QAEzC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,iBAAiB,QAAQ,SAAS,KAAK,UAAU,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;IAGjG,CAAC;IAEO,KAAK,CAAC,6BAA6B,CAAC,aAAqC,EAAE,cAAuC;QACtH,MAAM,UAAU,GAAW,cAAc,EAAE,IAAI,CAAC;QAGhD,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC;YAClC,IAAI,EAAE,cAAc,EAAE,IAAI,IAAI,IAAI;YAClC,WAAW,EAAE,cAAc,EAAE,WAAW,IAAI,IAAI;YAGhD,MAAM,EAAE,CAAC,cAAc,EAAE,MAAM,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC;gBACpD,YAAY,EAAE,CAAC,EAAE,YAAY,IAAI,IAAI;gBACrC,WAAW,EAAE,CAAC,EAAE,WAAW,IAAI,IAAI;aAItC,CAAC,CAAC;SACN,CAAC,CAAC;QAGH,IAAI,aAAa,CAAC,UAAU,KAAK,UAAU,IAAI,aAAa,CAAC,aAAa,EAAE,CAAC;YACzE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,4BAA4B,UAAU,EAAE,CAAC,CAAC;YAC1D,OAAO;QAEX,CAAC;QAED,MAAM,MAAM,GAAU,cAAc,EAAE,MAAM,IAAI,EAAE,CAAC;QACnD,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YAChC,MAAM,IAAI,GAAG,CAAC,EAAE,YAAY,CAAC;YAC7B,MAAM,IAAI,GAAG,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACxD,OAAO,KAAK,IAAI,GAAG,IAAI,EAAE,CAAC;QAC9B,CAAC,CAAC,CAAC;QAEH,MAAM,IAAI,GAAG,kBAAkB,UAAU;WACtC,cAAc,EAAE,WAAW,IAAI,KAAK;;UAErC,MAAM,CAAC,MAAM;EACrB,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC;;sGAE+E,CAAC;QAG/F,MAAM,QAAQ,GAAG;YACb,cAAc,EAAE,GAAG,UAAU,iBAAiB;YAC9C,IAAI,EAAE,iBAAiB;YACvB,IAAI,EAAE,QAAQ;YACd,UAAU;YACV,UAAU,EAAE,MAAM,CAAC,MAAM;YACzB,UAAU;YACV,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;SAC7D,CAAC;QAaF,IAAI,CAAC;YACD,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,cAAc,CAAC;gBAC/D,OAAO,EAAE;oBAEL,MAAM,EAAE;wBACJ,EAAE,eAAe,EAAE,EAAE,GAAG,EAAE,iBAAiB,EAAE,EAAE;wBAC/C,EAAE,eAAe,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAE;wBACtC,EAAE,qBAAqB,EAAE,EAAE,GAAG,EAAE,UAAU,EAAE,EAAE;wBAE9C,EAAE,yBAAyB,EAAE,EAAE,GAAG,EAAE,GAAG,UAAU,iBAAiB,EAAE,EAAE;qBACzE;iBACJ;aACJ,CAAC,CAAC;YAEH,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,oDAAoD,UAAU,iBAAiB,EAAE,YAAY,CAAC,CAAC;QAEnH,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACT,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,4CAA4C,UAAU,MAAM,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAE9F,CAAC;QAED,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC;YAC5C,MAAM,EAAE,CAAC,IAAI,CAAC;YAEd,QAAQ,EAAE,QAAQ;YAClB,aAAa,EAAE,CAAC,aAAa,CAAC,YAAY,CAAC;SAC9C,CAAC,CAAC;QAEH,MAAM,KAAK,GAAG,CAAC,EAAE,OAAO,EAAE,UAAU,CAAC;QACrC,IAAI,CAAC,KAAK,EAAE,CAAC;YACT,MAAM,IAAI,KAAK,CAAC,+EAA+E,UAAU,EAAE,CAAC,CAAC;QACjH,CAAC;QAGD,aAAa,CAAC,aAAa,GAAG,CAAC,CAAC,OAAO,EAAE,UAAU,CAAC;QACpD,aAAa,CAAC,UAAU,GAAG,UAAU,CAAC;QAEtC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,wBAAwB,UAAU,SAAS,KAAK,UAAU,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;IAEzG,CAAC;IAEO,KAAK,CAAC,4BAA4B,CAAC,aAAqC,EAAE,UAAkB,EAAE,KAA6B;QAC/H,MAAM,SAAS,GAAW,KAAK,EAAE,YAAY,CAAC;QAG9C,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAG7C,MAAM,SAAS,GAAG,aAAa,CAAC,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;QACtE,IAAI,UAAU,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC;QAChE,IAAI,CAAC,UAAU,EAAE,CAAC;YACd,UAAU,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;YACvC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC/B,CAAC;QAGD,IAAI,UAAU,CAAC,SAAS,KAAK,UAAU,IAAI,UAAU,CAAC,YAAY,EAAE,CAAC;YACjE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,2BAA2B,UAAU,IAAI,SAAS,EAAE,CAAC,CAAC;YACtE,OAAO;QAEX,CAAC;QAGD,MAAM,MAAM,GAA6B,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1F,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAyB,EAAE,EAAE,CAAC,CAAC,EAAE,SAAS,CAAC,EAAE,IAAI,IAAI,IAAI,CAAC;QACvF,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAyB,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAChG,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAyB,EAAE,EAAE,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACnG,MAAM,IAAI,GAAG,MAAM;aACd,MAAM,CAAC,CAAC,CAAyB,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC;aAC5D,GAAG,CAAC,CAAC,CAAyB,EAAE,EAAE,CAAC,GAAG,SAAS,IAAI,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,2BAA2B,IAAI,CAAC,CAAC,yBAAyB,IAAI,IAAI,EAAE,CAAC,CAAC;QAE7I,MAAM,iBAAiB,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAyB,EAAE,EAAE;YAC5E,MAAM,IAAI,GAAG;gBACT,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,EAAE;gBACrB,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;gBACvB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE;gBACxB,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE;gBAC5B,CAAC,CAAC,2BAA2B,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,2BAA2B,EAAE,CAAC,CAAC,CAAC,EAAE;aAC/E,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC5B,OAAO,KAAK,IAAI,EAAE,CAAC;QACvB,CAAC,CAAC,CAAC;QAEH,MAAM,IAAI,GACN,iBAAiB,SAAS;UAC5B,UAAU;WACT,KAAK,EAAE,WAAW,IAAI,KAAK;;;aAGzB,OAAO;YACR,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM;cAC1C,QAAQ,CAAC,MAAM,MAAM,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;;aAExF,IAAI,CAAC,MAAM;EACtB,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM;;UAEvC,MAAM,CAAC,MAAM;EACrB,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC;;qGAEuE,SAAS;;;EAG5G,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;;CAEtB,CAAC;QAGM,MAAM,QAAQ,GAAG;YACb,cAAc,EAAE,GAAG,UAAU,iBAAiB;YAC9C,IAAI,EAAE,iBAAiB;YACvB,IAAI,EAAE,OAAO;YACb,UAAU;YACV,SAAS;YACT,UAAU,EAAE,MAAM,CAAC,MAAM;YACzB,aAAa,EAAE,QAAQ,CAAC,MAAM;YAC9B,aAAa,EAAE,IAAI,CAAC,MAAM;YAC1B,OAAO,EAAE,OAAO;YAChB,YAAY,EAAE,OAAO;YACrB,aAAa,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAyB,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAC1G,UAAU;SACb,CAAC;QAaF,IAAI,CAAC;YACD,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,cAAc,CAAC;gBAC/D,OAAO,EAAE;oBAEL,MAAM,EAAE;wBACJ,EAAE,eAAe,EAAE,EAAE,GAAG,EAAE,iBAAiB,EAAE,EAAE;wBAC/C,EAAE,eAAe,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE;wBACrC,EAAE,qBAAqB,EAAE,EAAE,GAAG,EAAE,UAAU,EAAE,EAAE;wBAC9C,EAAE,oBAAoB,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE;wBAE5C,EAAE,yBAAyB,EAAE,EAAE,GAAG,EAAE,GAAG,UAAU,iBAAiB,EAAE,EAAE;qBACzE;iBACJ;aACJ,CAAC,CAAC;YAEH,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,kDAAkD,SAAS,iBAAiB,EAAE,YAAY,CAAC,CAAC;QAEhH,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACT,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,4CAA4C,UAAU,MAAM,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAE9F,CAAC;QAGD,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC;YAC5C,MAAM,EAAE,CAAC,IAAI,CAAC;YACd,QAAQ;YACR,aAAa,EAAE,CAAC,aAAa,CAAC,YAAY,CAAC;SAC9C,CAAC,CAAC;QAEH,MAAM,KAAK,GAAG,CAAC,EAAE,OAAO,EAAE,UAAU,CAAC;QACrC,IAAI,CAAC,KAAK,EAAE,CAAC;YACT,MAAM,IAAI,KAAK,CAAC,kEAAkE,UAAU,IAAI,SAAS,EAAE,CAAC,CAAC;QACjH,CAAC;QAGD,UAAU,CAAC,YAAY,GAAG,KAAK,CAAC;QAChC,UAAU,CAAC,SAAS,GAAG,UAAU,CAAC;QAElC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,uBAAuB,UAAU,IAAI,SAAS,SAAS,KAAK,UAAU,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;IAErH,CAAC;IAEO,0BAA0B,CAAC,UAAkB,EAAE,SAAiB,EAAE,CAAyB;QAE/F,MAAM,IAAI,GAAG,CAAC,EAAE,IAAI,CAAC;QACrB,MAAM,WAAW,GAAG,CAAC,EAAE,WAAW,IAAI,IAAI,CAAC;QAC3C,MAAM,WAAW,GAAG,CAAC,EAAE,WAAW,IAAI,KAAK,CAAC;QAG5C,MAAM,IAAI,GAAG,CAAC,EAAE,IAAI,CAAC;QACrB,MAAM,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,IAAI,CAAC;QAGnC,MAAM,QAAQ,GAAG,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC;QAC/B,MAAM,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC;QAC3B,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC;QACzB,MAAM,MAAM,GAAG,CAAC,EAAE,MAAM,IAAI,IAAI,CAAC;QACjC,MAAM,GAAG,GAAG,CAAC,EAAE,GAAG,IAAI,IAAI,CAAC;QAC3B,MAAM,GAAG,GAAG,CAAC,EAAE,GAAG,IAAI,IAAI,CAAC;QAC3B,MAAM,YAAY,GAAG,CAAC,EAAE,YAAY,IAAI,IAAI,CAAC;QAC7C,MAAM,KAAK,GAAG,CAAC,EAAE,YAAY,IAAI,IAAI,CAAC;QACtC,MAAM,QAAQ,GAAG,CAAC,EAAE,+BAA+B,IAAI,IAAI,CAAC;QAG5D,MAAM,YAAY,GAAG,CAAC,EAAE,YAAY,IAAI,IAAI,CAAC;QAC7C,MAAM,SAAS,GAAG,CAAC,EAAE,uBAAuB,IAAI,IAAI,CAAC;QACrD,MAAM,QAAQ,GAAG,CAAC,EAAE,2BAA2B,IAAI,IAAI,CAAC;QACxD,MAAM,QAAQ,GAAG,CAAC,EAAE,wBAAwB,IAAI,IAAI,CAAC;QAIrD,MAAM,UAAU,GAAG,CAAC,EAAE,eAAe,IAAI,IAAI,CAAC;QAC9C,MAAM,cAAc,GAAG,CAAC,EAAE,wBAAwB,IAAI,IAAI,CAAC;QAG3D,MAAM,oBAAoB,GAAG,CAAC,EAAE,wBAAwB,IAAI,IAAI,CAAC;QACjE,MAAM,gBAAgB,GAAG,CAAC,EAAE,4BAA4B,IAAI,IAAI,CAAC;QACjE,MAAM,eAAe,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,IAAI,CAAC;QACjG,MAAM,kBAAkB,GAAG,CAAC,EAAE,kBAAkB,IAAI,IAAI,CAAC;QACzD,MAAM,aAAa,GAAG,CAAC,CAAC,CAAC,EAAE,aAAa,CAAC;QAGzC,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC;QACtE,MAAM,cAAc,GAAG,CAAC,EAAE,cAAc,IAAI,IAAI,CAAC;QACjD,MAAM,oBAAoB,GAAG,CAAC,EAAE,2BAA2B,IAAI,IAAI,CAAC;QAGpE,MAAM,gBAAgB,GAAG,CAAC,EAAE,0BAA0B,IAAI,IAAI,CAAC;QAC/D,MAAM,oBAAoB,GAAG,CAAC,EAAE,8BAA8B,IAAI,IAAI,CAAC;QACvE,MAAM,iBAAiB,GAAG,CAAC,EAAE,sBAAsB,IAAI,IAAI,CAAC;QAC5D,MAAM,kBAAkB,GAAG,CAAC,EAAE,0BAA0B,IAAI,IAAI,CAAC;QAMjE,MAAM,SAAS,GAAG,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC;QAC/B,MAAM,mBAAmB,GAAG,CAAC,CAAC,CAAC,EAAE,mBAAmB,CAAC;QAGrD,MAAM,SAAS,GAAG,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC;QACjC,MAAM,QAAQ,GAAG,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC;QAC/B,MAAM,kBAAkB,GAAG,CAAC,CAAC,CAAC,EAAE,kBAAkB,CAAC;QACnD,MAAM,UAAU,GAAG,CAAC,EAAE,UAAU,IAAI,IAAI,CAAC;QACzC,MAAM,gBAAgB,GAAG,CAAC,EAAE,yBAAyB,IAAI,IAAI,CAAC;QAC9D,MAAM,IAAI,GAAG,CAAC,EAAE,IAAI,IAAI,IAAI,CAAC;QAE7B,MAAM,eAAe,GAAG,CAAC,GAAG,EAAE;YAC1B,IAAI,CAAC,YAAY,IAAI,CAAC,QAAQ;gBAAE,OAAO,MAAM,CAAC;YAC9C,MAAM,KAAK,GAAG;gBACV,QAAQ,YAAY,EAAE;gBACtB,SAAS,CAAC,CAAC,CAAC,UAAU,SAAS,EAAE,CAAC,CAAC,CAAC,IAAI;gBACxC,SAAS,QAAQ,EAAE;gBACnB,QAAQ,CAAC,CAAC,CAAC,SAAS,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI;gBAGrC,UAAU,CAAC,CAAC,CAAC,WAAW,UAAU,EAAE,CAAC,CAAC,CAAC,IAAI;gBAE3C,cAAc,CAAC,CAAC,CAAC,eAAe,cAAc,EAAE,CAAC,CAAC,CAAC,IAAI;aAC1D,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAClB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC,CAAC,EAAE,CAAC;QAEL,MAAM,gBAAgB,GAAG,CAAC,GAAG,EAAE;YAC3B,MAAM,KAAK,GAAa,EAAE,CAAC;YAC3B,IAAI,oBAAoB;gBAAE,KAAK,CAAC,IAAI,CAAC,mBAAmB,oBAAoB,EAAE,CAAC,CAAC;YAChF,IAAI,gBAAgB;gBAAE,KAAK,CAAC,IAAI,CAAC,eAAe,gBAAgB,EAAE,CAAC,CAAC;YACpE,IAAI,eAAe,EAAE,MAAM;gBAAE,KAAK,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,UAAU,CAAC,eAAe,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;YAC5F,IAAI,kBAAkB;gBAAE,KAAK,CAAC,IAAI,CAAC,aAAa,kBAAkB,EAAE,CAAC,CAAC;YACtE,KAAK,CAAC,IAAI,CAAC,eAAe,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;YAC9D,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QACpD,CAAC,CAAC,EAAE,CAAC;QAEL,MAAM,YAAY,GAAG,CAAC,GAAG,EAAE;YACvB,MAAM,KAAK,GAAa,EAAE,CAAC;YAC3B,IAAI,UAAU,EAAE,MAAM;gBAAE,KAAK,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;YACjF,IAAI,cAAc;gBAAE,KAAK,CAAC,IAAI,CAAC,aAAa,cAAc,EAAE,CAAC,CAAC;YAC9D,IAAI,oBAAoB;gBAAE,KAAK,CAAC,IAAI,CAAC,mBAAmB,OAAO,oBAAoB,KAAK,QAAQ,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;YACnI,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QACpD,CAAC,CAAC,EAAE,CAAC;QAEL,MAAM,eAAe,GAAG,CAAC,GAAG,EAAE;YAC1B,MAAM,KAAK,GAAa,EAAE,CAAC;YAC3B,IAAI,gBAAgB;gBAAE,KAAK,CAAC,IAAI,CAAC,YAAY,gBAAgB,EAAE,CAAC,CAAC;YACjE,IAAI,oBAAoB;gBAAE,KAAK,CAAC,IAAI,CAAC,gBAAgB,oBAAoB,EAAE,CAAC,CAAC;YAC7E,IAAI,iBAAiB;gBAAE,KAAK,CAAC,IAAI,CAAC,aAAa,iBAAiB,EAAE,CAAC,CAAC;YACpE,IAAI,kBAAkB,EAAE,MAAM;gBAAE,KAAK,CAAC,IAAI,CAAC,YAAY,kBAAkB,CAAC,MAAM,EAAE,CAAC,CAAC;YACpF,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QACpD,CAAC,CAAC,EAAE,CAAC;QAEL,MAAM,eAAe,GAAG;YAIpB,WAAW,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,EAAE;YACzC,iBAAiB,IAAI,CAAC,YAAY,CAAC,mBAAmB,CAAC,EAAE;SAC5D,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAE7B,MAAM,iBAAiB,GAAG;YACtB,YAAY,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE;YACzC,UAAU,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE;YACrC,SAAS,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE;YACnC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,UAAU,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI;YAC3C,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI;YAClC,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI;YAClC,YAAY,KAAK,IAAI,CAAC,CAAC,CAAC,WAAW,YAAY,EAAE,CAAC,CAAC,CAAC,IAAI;YACxD,KAAK,CAAC,CAAC,CAAC,SAAS,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,KAAK,QAAQ,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI;SACrE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAE7B,MAAM,cAAc,GAAG;YACnB,UAAU,CAAC,CAAC,CAAC,UAAU,UAAU,EAAE,CAAC,CAAC,CAAC,IAAI;YAC1C,gBAAgB,CAAC,CAAC,CAAC,aAAa,gBAAgB,EAAE,CAAC,CAAC,CAAC,IAAI;YACzD,IAAI,CAAC,CAAC,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI;YAC5B,WAAW,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,EAAE;YACzC,UAAU,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE;YACvC,oBAAoB,IAAI,CAAC,YAAY,CAAC,kBAAkB,CAAC,EAAE;SAC9D,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAE7B,MAAM,IAAI,GAAG;YACT,iBAAiB,IAAI,KAAK,WAAW,GAAG;YACxC,UAAU,SAAS,EAAE;YACrB,WAAW,UAAU,EAAE;YACvB,EAAE;YACF,SAAS,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,SAAS,OAAO,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YACpD,gBAAgB,WAAW,EAAE;YAC7B,EAAE;YACF,gBAAgB,iBAAiB,IAAI,MAAM,EAAE;YAC7C,aAAa,eAAe,EAAE;YAC9B,cAAc,gBAAgB,EAAE;YAChC,UAAU,YAAY,EAAE;YACxB,aAAa,eAAe,EAAE;YAC9B,2BAA2B,eAAe,EAAE;YAC5C,kBAAkB,cAAc,IAAI,MAAM,EAAE;YAC5C,EAAE;YACF,0FAA0F;YAC1F,+EAA+E;SAClF,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEb,MAAM,QAAQ,GAAG;YACb,IAAI,EAAE,iBAAiB;YACvB,IAAI,EAAE,OAAO;YACb,UAAU;YACV,SAAS;YACT,SAAS,EAAE,IAAI;YACf,WAAW;YACX,WAAW;YACX,QAAQ,EAAE,IAAI;YACd,OAAO;YACP,QAAQ;YACR,MAAM;YACN,KAAK;YACL,YAAY;YACZ,MAAM;YACN,GAAG;YACH,GAAG;YACH,YAAY,EAAE,KAAK;YACnB,+BAA+B,EAAE,QAAQ;YAGzC,YAAY;YACZ,uBAAuB,EAAE,SAAS;YAClC,2BAA2B,EAAE,QAAQ;YACrC,wBAAwB,EAAE,QAAQ;YAIlC,eAAe,EAAE,UAAU;YAC3B,wBAAwB,EAAE,cAAc;YAGxC,oBAAoB;YACpB,gBAAgB;YAChB,qBAAqB,EAAE,eAAe;YACtC,kBAAkB;YAClB,aAAa;YAGb,UAAU;YACV,cAAc;YACd,oBAAoB,EAAE,oBAAoB,CAAC,CAAC,CAAC,CAAC,OAAO,oBAAoB,KAAK,QAAQ,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI;YAG7H,0BAA0B,EAAE,gBAAgB;YAC5C,8BAA8B,EAAE,oBAAoB;YACpD,sBAAsB,EAAE,iBAAiB;YACzC,+BAA+B,EAAE,KAAK,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YAMlG,OAAO,EAAE,SAAS;YAClB,mBAAmB;YAGnB,UAAU;YACV,yBAAyB,EAAE,gBAAgB;YAC3C,SAAS;YACT,QAAQ;YACR,kBAAkB;SACrB,CAAC;QAEF,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IAC9B,CAAC;IAEO,KAAK,CAAC,4BAA4B,CAAC,aAAqC,EAAE,UAAkB,EAAE,SAAiB,EAAE,KAA6B;QAClJ,MAAM,SAAS,GAAW,KAAK,EAAE,IAAI,IAAI,eAAe,CAAC;QAGzD,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAG7C,MAAM,SAAS,GAAG,aAAa,CAAC,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;QACtE,IAAI,UAAU,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC;QAChE,IAAI,CAAC,UAAU,EAAE,CAAC;YACd,UAAU,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;YACvC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC/B,CAAC;QACD,MAAM,SAAS,GAAG,UAAU,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;QAChE,IAAI,UAAU,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC;QAChE,IAAI,CAAC,UAAU,EAAE,CAAC;YACd,UAAU,GAAG,EAAE,SAAS,EAAE,CAAC;YAC3B,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC/B,CAAC;QAGD,IAAI,UAAU,CAAC,SAAS,KAAK,UAAU,IAAI,UAAU,CAAC,YAAY,EAAE,CAAC;YACjE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,2BAA2B,UAAU,IAAI,SAAS,IAAI,SAAS,EAAE,CAAC,CAAC;YACnF,OAAO,UAAU,CAAC,YAAY,CAAC;QACnC,CAAC;QAGD,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,0BAA0B,CAAC,UAAU,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;QAGxF,QAAgB,CAAC,UAAU,GAAG,UAAU,CAAC;QAG1C,IAAI,UAAU,CAAC,YAAY,EAAE,CAAC;YAC1B,IAAI,CAAC;gBACD,MAAM,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,UAAU,CAAC,YAAY,EAAE,CAAC,CAAC;YAC3E,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACT,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,2CAA2C,UAAU,CAAC,YAAY,MAAM,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAC1G,CAAC;QACL,CAAC;QAGD,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC;YAC5C,QAAQ,EAAE,IAAI;YACd,QAAQ;YACR,aAAa,EAAE,CAAC,aAAa,CAAC,YAAY,CAAC;SAC9C,CAAC,CAAC;QAEH,MAAM,KAAK,GAAG,CAAC,EAAE,OAAO,EAAE,UAAU,CAAC;QACrC,IAAI,CAAC,KAAK,EAAE,CAAC;YACT,MAAM,IAAI,KAAK,CAAC,kEAAkE,UAAU,IAAI,SAAS,IAAI,SAAS,EAAE,CAAC,CAAC;QAC9H,CAAC;QAGD,UAAU,CAAC,YAAY,GAAG,KAAK,CAAC;QAChC,UAAU,CAAC,SAAS,GAAG,UAAU,CAAC;QAElC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,uBAAuB,UAAU,IAAI,SAAS,IAAI,SAAS,SAAS,KAAK,UAAU,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;QAC9H,OAAO,KAAK,CAAC;IACjB,CAAC;CACJ,CAAA;AAjvBY,sDAAqB;gCAArB,qBAAqB;IADjC,IAAA,mBAAU,GAAE;qCAMwB,qCAAgB;GALxC,qBAAqB,CAivBjC","sourcesContent":["import { Injectable, Logger } from '@nestjs/common';\nimport * as crypto from 'crypto';\nimport * as fs from 'fs';\nimport * as path from 'path';\n\nimport { getDynamicModuleNames } from 'src/helpers/module.helper';\nimport { CreateModuleMetadataDto } from 'src/dtos/create-module-metadata.dto';\nimport { R2RHelperService } from './r2r-helper.service';\nimport { CollectionResponse, r2rClient } from 'r2r-js';\nimport { CreateModelMetadataDto } from 'src/dtos/create-model-metadata.dto';\nimport { CreateFieldMetadataDto } from 'src/dtos/create-field-metadata.dto';\n\nexport type FieldIngestionInfo = {\n fieldName: string;\n fieldChunkId?: string;\n fieldHash?: string;\n};\n\nexport type ModelIngestionInfo = {\n modelName: string;\n modelChunkId?: string;\n modelHash?: string;\n fields: FieldIngestionInfo[];\n};\n\nexport type ModuleRAGIngestionInfo = {\n moduleName?: string;\n collectionId?: string;\n\n // Full json document is also uploaded so we track references...\n documentId?: string;\n documentHash?: string;\n\n // module references\n moduleChunkId?: string;\n // track a hash of module metadata to skip unchanged\n moduleHash?: string;\n\n // model references...\n models: ModelIngestionInfo[];\n};\n\n@Injectable()\nexport class IngestMetadataService {\n private readonly logger = new Logger(IngestMetadataService.name);\n private ragClient: r2rClient;\n\n constructor(\n private readonly r2rService: R2RHelperService,\n ) { }\n\n // Stable stringify so hashes/ids don't flap\n // private stableStringify(obj: any): string {\n // return JSON.stringify(obj, Object.keys(obj).sort(), 2);\n // }\n // private sha256(input: string): string {\n // return crypto.createHash('sha256').update(input).digest('hex');\n // }\n // private hashSchema(obj: any): string {\n // return this.sha256(this.stableStringify(obj));\n // }\n private _sha256OfJson(obj: any): string {\n const s = JSON.stringify(obj);\n return crypto.createHash('sha256').update(s).digest('hex');\n }\n // // Small natural-language one-liners for relations\n // private relationSig(model: any): string[] {\n // const rels: string[] = [];\n // for (const f of model.fields ?? []) {\n // if (f.relation?.targetModel) {\n // rels.push(`${model.singularName}.${f.name} -> ${f.relation.targetModel}(${f.relation.targetField ?? 'id'})`);\n // }\n // }\n // return rels;\n // }\n\n private _oneLineBool(b?: boolean): 'yes' | 'no' {\n return b ? 'yes' : 'no';\n }\n\n private _shortList(arr?: string[] | null, max = 10): string {\n if (!Array.isArray(arr) || arr.length === 0) return 'none';\n const a = arr.slice(0, max);\n return `${a.join(', ')}${arr.length > max ? ', …' : ''}`;\n }\n\n async ingest() {\n // Create a new ragClient...\n this.ragClient = await this.r2rService.getClient();\n\n // const allModuleMetadataJson = [];\n this.logger.debug(`getting dynamics modules`);\n const enabledModules = getDynamicModuleNames();\n this.logger.log(`ingesting metadata`);\n\n for (let i = 0; i < enabledModules.length; i++) {\n const enabledModule = enabledModules[i];\n const fileName = `${enabledModule}-metadata.json`;\n const enabledModuleSeedFile = `module-metadata/${enabledModule}/${fileName}`;\n const fullPath = path.join(process.cwd(), enabledModuleSeedFile);\n const overallMetadata: any = JSON.parse(fs.readFileSync(fullPath, 'utf-8').toString());\n\n const moduleMetadata: CreateModuleMetadataDto = overallMetadata.moduleMetadata;\n\n // Manage all the ingestion info file paths...\n const enabledModulIngestionInfoFile = `module-metadata/${enabledModule}/genai/${enabledModule}-ingested-info.json`;\n const enabledModulIngestionInfoFullPath = path.join(process.cwd(), enabledModulIngestionInfoFile);\n const ingestionInfo: ModuleRAGIngestionInfo = fs.existsSync(enabledModulIngestionInfoFullPath) ? JSON.parse(fs.readFileSync(enabledModulIngestionInfoFullPath, 'utf-8').toString()) : {};\n const enabledModulIngestionInfoDir = path.dirname(enabledModulIngestionInfoFullPath);\n if (!fs.existsSync(enabledModulIngestionInfoDir)) {\n fs.mkdirSync(enabledModulIngestionInfoDir, { recursive: true });\n }\n\n ingestionInfo.moduleName = enabledModule\n\n // Process module metadata first. \n this.logger.log(`[Start] Processing module metadata for ${moduleMetadata.name}`)\n\n // Create or use an existing collection...\n const collectionId = await this.resolveRagCollectionForModule(ingestionInfo, enabledModule)\n ingestionInfo.collectionId = collectionId;\n\n // Delete and re-insert a document representing the full json...\n // await this.deleteInsertRagDocumentForModuleMetadataJsonFile(ingestionInfo, fullPath, fileName)\n\n // Delete all metadata chunks. \n // const collectionName = `${enabledModule}-rag-collection`;\n // const deleteResult = await this.ragClient.documents.deleteByFilter({\n // filters: {\n // // AND semantics across fields:\n // \"$and\": [\n // { 'metadata.kind': { $eq: 'solidx-metadata' } },\n // { 'metadata.collectionName': { $eq: collectionName } },\n // { 'title': { $like: '%Ingested Chunks%' } },\n // ]\n // },\n // });\n // this.logger.log(`Deleted existing documents for collectionName: ${collectionName}. Got response:`, deleteResult);\n\n // Delete and re-insert a chunk representing the module.\n await this.deleteInsertRagChunkForModule(ingestionInfo, moduleMetadata);\n\n // Delete and re-insert chunks representing each model.\n for (const model of moduleMetadata.models) {\n await this.deleteInsertRagChunkForModel(ingestionInfo, enabledModule, model);\n\n // Disabling this for now...\n // for (const field of model.fields) {\n // await this.deleteInsertRagChunkForField(ingestionInfo, enabledModule, model.singularName, field);\n // }\n }\n\n // TODO: Delete and re-insert chunks representing roles\n\n // TODO: Delete and re-insert chunks representing menus \n\n // TODO: Delete and re-insert chunks representing actions\n\n // TODO: Delete and re-insert chunks representing list views \n\n // TODO: Delete and re-insert chunks representing kanban views \n\n // TODO: Delete and re-insert chunks representing form views\n\n // TODO: Delete and re-insert chunks representing security rules\n\n // TODO: Delete and re-insert chunks representing scheduled jobs\n\n // Save ingestion info to disk...\n fs.writeFileSync(enabledModulIngestionInfoFullPath, JSON.stringify({ ...ingestionInfo }, null, 2), 'utf8');\n }\n }\n\n private async resolveRagCollectionForModule(ingestionInfo: ModuleRAGIngestionInfo, moduleName: string): Promise<string> {\n this.logger.debug(`Resolving RAG collection for module: ${moduleName}`);\n\n const collectionName = `${moduleName}-rag-collection`;\n\n // delete and recreate \n // if (alwaysRecreate === true) {\n const existingCollection = await this.ragClient.collections.retrieveByName({\n name: collectionName\n });\n\n if (existingCollection) {\n try {\n await this.ragClient.collections.delete({ id: existingCollection.results.id });\n } catch (e) {\n this.logger.warn(`[Warn] Failed deleteByFilter for collection': ${String(e)}`);\n }\n }\n // }\n\n // let existingCollection: CollectionResponse = null;\n // if (ingestionInfo.collectionId) {\n // // See if collection already exists... \n // const r = await this.ragClient.collections.list({\n // ids: [\n // ingestionInfo.collectionId\n // ]\n // });\n\n // if (r) {\n // if (r.results.length === 1) {\n // existingCollection = r.results[0];\n // }\n // if (r.results.length > 1) {\n // // TODO: do something that will print a meaningful error on the console...\n // }\n // }\n // }\n\n // if (!existingCollection) {\n const r = await this.ragClient.collections.create({\n name: collectionName,\n description: `Collection created to group all documents, chunks related to module: ${moduleName}`\n });\n\n // TODO: for some reason if we are unable to create a collection then fail with a visible error message in the console...\n return r.results.id;\n // }\n // return existingCollection.id;\n }\n\n private async deleteInsertRagDocumentForModuleMetadataJsonFile(ingestionInfo: ModuleRAGIngestionInfo, fullPath: string, fileName: string): Promise<void> {\n this.logger.debug(`Ingesting file: ${fullPath}`);\n\n // 1) Compute hash of the entire JSON string (as-is)\n const jsonStr = fs.readFileSync(fullPath, 'utf-8');\n const contentHash = this._sha256OfJson(JSON.parse(jsonStr));\n\n // 2) Short-circuit if unchanged and we still have a documentId\n if (ingestionInfo.documentHash === contentHash && ingestionInfo.documentId) {\n this.logger.log(`[Skip] Unchanged: ${fileName} (hash=${contentHash.slice(0, 8)}…)`);\n return;\n // return ingestionInfo.documentId;\n }\n\n // 3) Delete the previous doc if present\n if (ingestionInfo.documentId) {\n try {\n await this.ragClient.documents.delete({ id: ingestionInfo.documentId });\n } catch (e) {\n this.logger.warn(\n `[Warn] Failed deleting prior document ${ingestionInfo.documentId}: ${String(e)}`\n );\n }\n }\n\n // 4) Create a fresh document; attach the hash into metadata for traceability\n const ingestResult = await this.ragClient.documents.create({\n file: {\n path: fullPath,\n name: fileName\n },\n collectionIds: [ingestionInfo.collectionId],\n metadata: {\n contentHash,\n fileName\n },\n });\n // console.log(\"file ingest result:\", JSON.stringify(ingestResult, null, 2));\n\n const newId = ingestResult?.results?.documentId;\n if (!newId) {\n throw new Error(`R2R did not return a documentId for ${fileName}`);\n }\n\n // 5) Persist identifiers + hash on our side\n ingestionInfo.documentId = newId;\n ingestionInfo.documentHash = contentHash;\n\n this.logger.log(`[OK] Ingested ${fileName} → id=${newId}, hash=${contentHash.slice(0, 8)}…`);\n // return newId;\n\n }\n\n private async deleteInsertRagChunkForModule(ingestionInfo: ModuleRAGIngestionInfo, moduleMetadata: CreateModuleMetadataDto): Promise<void> {\n const moduleName: string = moduleMetadata?.name;\n\n // Hash the meaningful parts of the module to detect changes and skip re-ingest.\n const schemaHash = this._sha256OfJson({\n name: moduleMetadata?.name ?? null,\n description: moduleMetadata?.description ?? null,\n\n // Keep model names + brief shape so module-level hash changes when models change.\n models: (moduleMetadata?.models ?? []).map((m: any) => ({\n singularName: m?.singularName ?? null,\n description: m?.description ?? null,\n\n // Include field names to detect field-level changes at module granularity - maybe remove this later?\n // fields: Array.isArray(m?.fields) ? m.fields.map((f: any) => f?.name ?? null) : [],\n })),\n });\n\n // Skip unchanged module\n if (ingestionInfo.moduleHash === schemaHash && ingestionInfo.moduleChunkId) {\n this.logger.log(`[Skip] Module unchanged: ${moduleName}`);\n return;\n // return ingestionInfo.moduleChunkId;\n }\n\n const models: any[] = moduleMetadata?.models ?? [];\n const modelLines = models.map((m) => {\n const name = m?.singularName;\n const desc = m?.description ? `: ${m.description}` : '';\n return `- ${name}${desc}`;\n });\n\n const text = `SolidX Module: ${moduleName}\nPurpose: ${moduleMetadata?.description ?? 'N/A'}\n\nModels (${models.length}):\n${modelLines.join('\\n')}\n\nUsage: Use this chunk to choose the correct model/field chunks for code generation or metadata edits.`;\n\n // metadata has to be concise and queryable\n const metadata = {\n collectionName: `${moduleName}-rag-collection`,\n kind: 'solidx-metadata',\n type: 'module',\n moduleName,\n modelCount: models.length,\n schemaHash,\n models: models.map((m) => m?.singularName).filter(Boolean),\n };\n\n // Delete previous chunk if we have one\n // if (ingestionInfo.moduleChunkId) {\n // try {\n // await this.ragClient.documents.delete({ id: ingestionInfo.moduleChunkId });\n // } catch (e) {\n // this.logger.warn(`[Warn] Failed deleting old module chunk (${ingestionInfo.moduleChunkId}): ${String(e)}`);\n // }\n // }\n\n // We changed the approach to delete and re-create using metadata.\n // delete any existing module records by metadata (idempotent)\n try {\n const deleteResult = await this.ragClient.documents.deleteByFilter({\n filters: {\n // AND semantics across fields:\n \"$and\": [\n { 'metadata.kind': { $eq: 'solidx-metadata' } },\n { 'metadata.type': { $eq: 'module' } },\n { 'metadata.moduleName': { $eq: moduleName } },\n // (optional but nice to constrain tightly if you always set it)\n { 'metadata.collectionName': { $eq: `${moduleName}-rag-collection` } },\n ]\n },\n });\n\n this.logger.log(`Deleted existing module document for moduleName: ${moduleName}. Got response:`, deleteResult);\n\n } catch (e) {\n this.logger.warn(`[Warn] Failed deleteByFilter for module '${moduleName}': ${String(e)}`);\n // Non-fatal: we can still proceed to create; caller’s auth will limit scope anyway\n }\n\n const r = await this.ragClient.documents.create({\n chunks: [text],\n // raw_text: text,\n metadata: metadata,\n collectionIds: [ingestionInfo.collectionId],\n });\n\n const newId = r?.results?.documentId;\n if (!newId) {\n throw new Error(`R2R did not return a documentId while creating module chunk for module name ${moduleName}`);\n }\n\n // Update ingestion info for persistence by the caller\n ingestionInfo.moduleChunkId = r.results?.documentId;\n ingestionInfo.moduleHash = schemaHash;\n\n this.logger.log(`[OK] Ingested module ${moduleName} → id=${newId}, hash=${schemaHash.slice(0, 8)}…`);\n\n }\n\n private async deleteInsertRagChunkForModel(ingestionInfo: ModuleRAGIngestionInfo, moduleName: string, model: CreateModelMetadataDto): Promise<void> {\n const modelName: string = model?.singularName;\n\n // 1) Hash full JSON (as-is) to detect changes and skip re-ingest\n const schemaHash = this._sha256OfJson(model);\n\n // Ensure ingestionInfo.models[] has an entry for this model\n const modelsArr = ingestionInfo.models ?? (ingestionInfo.models = []);\n let modelEntry = modelsArr.find(m => m.modelName === modelName);\n if (!modelEntry) {\n modelEntry = { modelName, fields: [] };\n modelsArr.push(modelEntry);\n }\n\n // 2) Short-circuit if unchanged\n if (modelEntry.modelHash === schemaHash && modelEntry.modelChunkId) {\n this.logger.log(`[Skip] Model unchanged: ${moduleName}.${modelName}`);\n return;\n // return modelEntry.modelChunkId;\n }\n\n // 3) Build retrieval-friendly text (concise)\n const fields: CreateFieldMetadataDto[] = Array.isArray(model?.fields) ? model.fields : [];\n const userkey = fields.find((f: CreateFieldMetadataDto) => f?.isUserKey)?.name ?? 'id';\n const uniques = fields.filter((f: CreateFieldMetadataDto) => f?.unique).map((f: any) => f.name);\n const required = fields.filter((f: CreateFieldMetadataDto) => f?.required).map((f: any) => f.name);\n const rels = fields\n .filter((f: CreateFieldMetadataDto) => f.type === 'relation')\n .map((f: CreateFieldMetadataDto) => `${modelName}.${f.name} -> ${f.relationCoModelSingularName}.${f.relationCoModelColumnName ?? 'id'}`);\n\n const fieldSummaryLines = fields.slice(0, 30).map((f: CreateFieldMetadataDto) => {\n const bits = [\n `${f.name}:${f.type}`,\n f.required ? 'req' : '',\n f.unique ? 'unique' : '',\n f.isUserKey ? 'userkey' : '',\n f.relationCoModelSingularName ? `rel->${f.relationCoModelSingularName}` : '',\n ].filter(Boolean).join('|');\n return `- ${bits}`;\n });\n\n const text =\n `SolidX Model: ${modelName}\nModule: ${moduleName}\nPurpose: ${model?.description ?? 'N/A'}\n\nSignature:\n- Primary: ${userkey}\n- Unique: ${uniques.length ? uniques.join(', ') : 'none'}\n- Required (${required.length}): ${required.slice(0, 12).join(', ')}${required.length > 12 ? '…' : ''}\n\nRelations (${rels.length}):\n${rels.length ? `- ${rels.join('\\n- ')}` : 'None'}\n\nFields (${fields.length}) [name:type|flags]:\n${fieldSummaryLines.join('\\n')}\n\nUsage: Use this chunk to generate DTOs, subscribers, custom service methods, and CRUD handlers for ${modelName}.\n\nFull model metadata json: \n${JSON.stringify(model)}\n\n`;\n\n // 4) Metadata (concise & queryable)\n const metadata = {\n collectionName: `${moduleName}-rag-collection`,\n kind: 'solidx-metadata',\n type: 'model',\n moduleName,\n modelName,\n fieldCount: fields.length,\n requiredCount: required.length,\n relationCount: rels.length,\n userkey: userkey,\n uniqueFields: uniques,\n hasTimestamps: !!fields.find((f: CreateFieldMetadataDto) => ['time', 'date', 'datetime'].includes(f.type)),\n schemaHash,\n };\n\n // 5) Delete previous chunk if present\n // if (modelEntry.modelChunkId) {\n // try {\n // await this.ragClient.documents.delete({ id: modelEntry.modelChunkId });\n // } catch (e) {\n // this.logger.warn(`[Warn] Failed deleting old model chunk (${modelEntry.modelChunkId}): ${String(e)}`);\n // }\n // }\n\n // We changed the approach to delete and re-create using metadata.\n // delete any existing module records by metadata (idempotent)\n try {\n const deleteResult = await this.ragClient.documents.deleteByFilter({\n filters: {\n // AND semantics across fields:\n \"$and\": [\n { 'metadata.kind': { $eq: 'solidx-metadata' } },\n { 'metadata.type': { $eq: 'model' } },\n { 'metadata.moduleName': { $eq: moduleName } },\n { 'metadata.modelName': { $eq: modelName } },\n // (optional but nice to constrain tightly if you always set it)\n { 'metadata.collectionName': { $eq: `${moduleName}-rag-collection` } },\n ]\n },\n });\n\n this.logger.log(`Deleted existing model document for modelName: ${modelName}. Got response:`, deleteResult);\n\n } catch (e) {\n this.logger.warn(`[Warn] Failed deleteByFilter for module '${moduleName}': ${String(e)}`);\n // Non-fatal: we can still proceed to create; caller’s auth will limit scope anyway\n }\n\n // 6) Create new document (R2R auto-generates the ID)\n const r = await this.ragClient.documents.create({\n chunks: [text],\n metadata,\n collectionIds: [ingestionInfo.collectionId],\n });\n\n const newId = r?.results?.documentId;\n if (!newId) {\n throw new Error(`R2R did not return a documentId while creating model chunk for ${moduleName}.${modelName}`);\n }\n\n // 7) Update ingestionInfo for persistence\n modelEntry.modelChunkId = newId;\n modelEntry.modelHash = schemaHash;\n\n this.logger.log(`[OK] Ingested model ${moduleName}.${modelName} → id=${newId}, hash=${schemaHash.slice(0, 8)}…`);\n // return newId;\n }\n\n private _buildFieldTextAndMetadata(moduleName: string, modelName: string, f: CreateFieldMetadataDto) {\n // Identity\n const name = f?.name;\n const displayName = f?.displayName ?? name;\n const description = f?.description ?? 'N/A';\n\n // Types\n const type = f?.type;\n const ormType = f?.ormType ?? null;\n\n // Constraints / validation\n const required = !!f?.required;\n const unique = !!f?.unique;\n const index = !!f?.index;\n const length = f?.length ?? null;\n const min = f?.min ?? null;\n const max = f?.max ?? null;\n const defaultValue = f?.defaultValue ?? null;\n const regex = f?.regexPattern ?? null;\n const regexErr = f?.regexPatternNotMatchingErrorMsg ?? null;\n\n // Relation\n const relationType = f?.relationType ?? null; // e.g., many-to-one, many-to-many, one-to-many\n const relModule = f?.relationModelModuleName ?? null;\n const relModel = f?.relationCoModelSingularName ?? null;\n const relField = f?.relationCoModelFieldName ?? 'id';\n // const relOwner = f?.isRelationManyToManyOwner ?? null;\n // const relJoinTable = f?.relationJoinTableName ?? null;\n // const relCreateInverse = !!f?.relationCreateInverse;\n const relCascade = f?.relationCascade ?? null;\n const relFixedFilter = f?.relationFieldFixedFilter ?? null;\n\n // Selection (dropdowns)\n const selectionDynProvider = f?.selectionDynamicProvider ?? null;\n const selectionDynCtxt = f?.selectionDynamicProviderCtxt ?? null;\n const selectionStatic = Array.isArray(f?.selectionStaticValues) ? f.selectionStaticValues : null;\n const selectionValueType = f?.selectionValueType ?? null;\n const isMultiSelect = !!f?.isMultiSelect;\n\n // Media (uploads)\n const mediaTypes = Array.isArray(f?.mediaTypes) ? f.mediaTypes : null;\n const mediaMaxSizeKb = f?.mediaMaxSizeKb ?? null;\n const mediaStorageProvider = f?.mediaStorageProviderUserKey ?? null; // likely object/id in your JSON\n\n // Computed fields\n const computedProvider = f?.computedFieldValueProvider ?? null;\n const computedProviderCtxt = f?.computedFieldValueProviderCtxt ?? null;\n const computedValueType = f?.computedFieldValueType ?? null;\n const computedTriggerCfg = f?.computedFieldTriggerConfig ?? null;\n\n // Security / privacy / audit\n // const encrypt = !!f?.encrypt;\n // const encryptionType = f?.encryptionType ?? null;\n // const decryptWhen = f?.decryptWhen ?? null;\n const isPrivate = !!f?.private;\n const enableAuditTracking = !!f?.enableAuditTracking;\n\n // Keys / system flags / mapping\n const isUserKey = !!f?.isUserKey;\n const isSystem = !!f?.isSystem;\n const isMarkedForRemoval = !!f?.isMarkedForRemoval;\n const columnName = f?.columnName ?? null;\n const relCoModelColumn = f?.relationCoModelColumnName ?? null;\n const uuid = f?.uuid ?? null;\n\n const relationSummary = (() => {\n if (!relationType || !relModel) return 'none';\n const parts = [\n `type=${relationType}`,\n relModule ? `module=${relModule}` : null,\n `model=${relModel}`,\n relField ? `field=${relField}` : null,\n // relOwner !== null ? `m2mOwner=${relOwner}` : null,\n // relCreateInverse ? 'createInverse=yes' : null,\n relCascade ? `cascade=${relCascade}` : null,\n // relJoinTable ? `joinTable=${relJoinTable}` : null,\n relFixedFilter ? `fixedFilter=${relFixedFilter}` : null,\n ].filter(Boolean);\n return parts.join(', ');\n })();\n\n const selectionSummary = (() => {\n const parts: string[] = [];\n if (selectionDynProvider) parts.push(`dynamicProvider=${selectionDynProvider}`);\n if (selectionDynCtxt) parts.push(`dynamicCtxt=${selectionDynCtxt}`);\n if (selectionStatic?.length) parts.push(`static=[${this._shortList(selectionStatic, 12)}]`);\n if (selectionValueType) parts.push(`valueType=${selectionValueType}`);\n parts.push(`multiSelect=${this._oneLineBool(isMultiSelect)}`);\n return parts.length ? parts.join(', ') : 'none';\n })();\n\n const mediaSummary = (() => {\n const parts: string[] = [];\n if (mediaTypes?.length) parts.push(`types=[${this._shortList(mediaTypes, 12)}]`);\n if (mediaMaxSizeKb) parts.push(`maxSizeKb=${mediaMaxSizeKb}`);\n if (mediaStorageProvider) parts.push(`storageProvider=${typeof mediaStorageProvider === 'string' ? mediaStorageProvider : 'set'}`);\n return parts.length ? parts.join(', ') : 'none';\n })();\n\n const computedSummary = (() => {\n const parts: string[] = [];\n if (computedProvider) parts.push(`provider=${computedProvider}`);\n if (computedProviderCtxt) parts.push(`providerCtxt=${computedProviderCtxt}`);\n if (computedValueType) parts.push(`valueType=${computedValueType}`);\n if (computedTriggerCfg?.length) parts.push(`triggers=${computedTriggerCfg.length}`);\n return parts.length ? parts.join(', ') : 'none';\n })();\n\n const securitySummary = [\n // `encrypt=${this.oneLineBool(encrypt)}`,\n // encryptionType ? `encType=${encryptionType}` : null,\n // decryptWhen ? `decryptWhen=${decryptWhen}` : null,\n `private=${this._oneLineBool(isPrivate)}`,\n `auditTracking=${this._oneLineBool(enableAuditTracking)}`\n ].filter(Boolean).join(', ');\n\n const constraintSummary = [\n `required=${this._oneLineBool(required)}`,\n `unique=${this._oneLineBool(unique)}`,\n `index=${this._oneLineBool(index)}`,\n length !== null ? `length=${length}` : null,\n min !== null ? `min=${min}` : null,\n max !== null ? `max=${max}` : null,\n defaultValue !== null ? `default=${defaultValue}` : null,\n regex ? `regex=${regex}${regexErr ? ` (${regexErr})` : ''}` : null\n ].filter(Boolean).join(', ');\n\n const mappingSummary = [\n columnName ? `column=${columnName}` : null,\n relCoModelColumn ? `relColumn=${relCoModelColumn}` : null,\n uuid ? `uuid=${uuid}` : null,\n `userKey=${this._oneLineBool(isUserKey)}`,\n `system=${this._oneLineBool(isSystem)}`,\n `markedForRemoval=${this._oneLineBool(isMarkedForRemoval)}`\n ].filter(Boolean).join(', ');\n\n const text = [\n `SolidX Field: ${name} (${displayName})`,\n `Model: ${modelName}`,\n `Module: ${moduleName}`,\n ``,\n `Type: ${type}${ormType ? ` (orm=${ormType})` : ''}`,\n `Description: ${description}`,\n ``,\n `Constraints: ${constraintSummary || 'none'}`,\n `Relation: ${relationSummary}`,\n `Selection: ${selectionSummary}`,\n `Media: ${mediaSummary}`,\n `Computed: ${computedSummary}`,\n `Security/Privacy/Audit: ${securitySummary}`,\n `Mapping/Flags: ${mappingSummary || 'none'}`,\n ``,\n `Usage: Use this chunk to generate exact field contracts (DTO, form control, DB column), `,\n `validation rules, relation wiring, and UI widgets (selection/media/computed).`,\n ].join('\\n');\n\n const metadata = {\n kind: 'solidx-metadata',\n type: 'field',\n moduleName,\n modelName,\n fieldName: name,\n displayName,\n description,\n dataType: type,\n ormType,\n required,\n unique,\n index,\n defaultValue,\n length,\n min,\n max,\n regexPattern: regex,\n regexPatternNotMatchingErrorMsg: regexErr,\n\n // relation\n relationType,\n relationModelModuleName: relModule,\n relationCoModelSingularName: relModel,\n relationCoModelFieldName: relField,\n // isRelationManyToManyOwner: relOwner,\n // relationJoinTableName: relJoinTable,\n // relationCreateInverse: relCreateInverse,\n relationCascade: relCascade,\n relationFieldFixedFilter: relFixedFilter,\n\n // selection\n selectionDynProvider,\n selectionDynCtxt,\n selectionStaticValues: selectionStatic,\n selectionValueType,\n isMultiSelect,\n\n // media\n mediaTypes,\n mediaMaxSizeKb,\n mediaStorageProvider: mediaStorageProvider ? (typeof mediaStorageProvider === 'string' ? mediaStorageProvider : 'set') : null,\n\n // computed\n computedFieldValueProvider: computedProvider,\n computedFieldValueProviderCtxt: computedProviderCtxt,\n computedFieldValueType: computedValueType,\n computedFieldTriggerConfigCount: Array.isArray(computedTriggerCfg) ? computedTriggerCfg.length : 0,\n\n // security/privacy/audit\n // encrypt,\n // encryptionType,\n // decryptWhen,\n private: isPrivate,\n enableAuditTracking,\n\n // mapping/flags\n columnName,\n relationCoModelColumnName: relCoModelColumn,\n isUserKey,\n isSystem,\n isMarkedForRemoval,\n };\n\n return { text, metadata };\n }\n\n private async deleteInsertRagChunkForField(ingestionInfo: ModuleRAGIngestionInfo, moduleName: string, modelName: string, field: CreateFieldMetadataDto,): Promise<string> {\n const fieldName: string = field?.name ?? 'unknown_field';\n\n // 1) Full JSON hash (as-is)\n const schemaHash = this._sha256OfJson(field);\n\n // 2) Ensure ingestionInfo entry for the model & field\n const modelsArr = ingestionInfo.models ?? (ingestionInfo.models = []);\n let modelEntry = modelsArr.find(m => m.modelName === modelName);\n if (!modelEntry) {\n modelEntry = { modelName, fields: [] };\n modelsArr.push(modelEntry);\n }\n const fieldsArr = modelEntry.fields ?? (modelEntry.fields = []);\n let fieldEntry = fieldsArr.find(f => f.fieldName === fieldName);\n if (!fieldEntry) {\n fieldEntry = { fieldName };\n fieldsArr.push(fieldEntry);\n }\n\n // 3) Skip if unchanged\n if (fieldEntry.fieldHash === schemaHash && fieldEntry.fieldChunkId) {\n this.logger.log(`[Skip] Field unchanged: ${moduleName}.${modelName}.${fieldName}`);\n return fieldEntry.fieldChunkId;\n }\n\n // 4) Build text + metadata tailored to FieldMetadata\n const { text, metadata } = this._buildFieldTextAndMetadata(moduleName, modelName, field);\n\n // also keep the hash in metadata for audit/debug\n (metadata as any).schemaHash = schemaHash;\n\n // 5) Delete previous chunk if present\n if (fieldEntry.fieldChunkId) {\n try {\n await this.ragClient.documents.delete({ id: fieldEntry.fieldChunkId });\n } catch (e) {\n this.logger.warn(`[Warn] Failed deleting old field chunk (${fieldEntry.fieldChunkId}): ${String(e)}`);\n }\n }\n\n // 6) Create new document (R2R auto-generates the ID)\n const r = await this.ragClient.documents.create({\n raw_text: text,\n metadata,\n collectionIds: [ingestionInfo.collectionId],\n });\n\n const newId = r?.results?.documentId;\n if (!newId) {\n throw new Error(`R2R did not return a documentId while creating field chunk for ${moduleName}.${modelName}.${fieldName}`);\n }\n\n // 7) Update ingestion info\n fieldEntry.fieldChunkId = newId;\n fieldEntry.fieldHash = schemaHash;\n\n this.logger.log(`[OK] Ingested field ${moduleName}.${modelName}.${fieldName} → id=${newId}, hash=${schemaHash.slice(0, 8)}…`);\n return newId;\n }\n}"]}
@@ -1,9 +1,9 @@
1
1
  import { IMcpToolResponseHandler } from 'src/interfaces';
2
- import { SolidIntrospectService } from '../solid-introspect.service';
3
- export declare class McpToolResponseHandlerFactory {
2
+ import { SolidIntrospectService } from '../../solid-introspect.service';
3
+ export declare class McpHandlerFactory {
4
4
  private readonly solidIntrospectionService;
5
5
  private readonly logger;
6
6
  constructor(solidIntrospectionService: SolidIntrospectService);
7
7
  getInstance(toolInvoked: string): IMcpToolResponseHandler;
8
8
  }
9
- //# sourceMappingURL=mcp-tool-response-handler-factory.service.d.ts.map
9
+ //# sourceMappingURL=mcp-handler-factory.service.d.ts.map