@solidstarters/solid-core 1.2.178 → 1.2.180

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 (42) hide show
  1. package/dist/controllers/ai-interaction.controller.js.map +1 -1
  2. package/dist/controllers/service.controller.d.ts +8 -1
  3. package/dist/controllers/service.controller.d.ts.map +1 -1
  4. package/dist/controllers/service.controller.js +39 -2
  5. package/dist/controllers/service.controller.js.map +1 -1
  6. package/dist/helpers/date.helper.d.ts +2 -0
  7. package/dist/helpers/date.helper.d.ts.map +1 -0
  8. package/dist/helpers/date.helper.js +18 -0
  9. package/dist/helpers/date.helper.js.map +1 -0
  10. package/dist/jobs/database/trigger-mcp-client-subscriber-database.service.d.ts.map +1 -1
  11. package/dist/jobs/database/trigger-mcp-client-subscriber-database.service.js +23 -17
  12. package/dist/jobs/database/trigger-mcp-client-subscriber-database.service.js.map +1 -1
  13. package/dist/seeders/seed-data/solid-core-metadata.json +2 -1
  14. package/dist/services/ai-interaction.service.d.ts.map +1 -1
  15. package/dist/services/ai-interaction.service.js +11 -3
  16. package/dist/services/ai-interaction.service.js.map +1 -1
  17. package/dist/services/excel.service.js +2 -2
  18. package/dist/services/excel.service.js.map +1 -1
  19. package/dist/services/genai/ingest-metadata.service.d.ts.map +1 -1
  20. package/dist/services/genai/ingest-metadata.service.js +9 -8
  21. package/dist/services/genai/ingest-metadata.service.js.map +1 -1
  22. package/dist/services/import-transaction.service.d.ts.map +1 -1
  23. package/dist/services/import-transaction.service.js +37 -10
  24. package/dist/services/import-transaction.service.js.map +1 -1
  25. package/dist/services/mcp-tool-response-handlers/solid-create-model-with-fields-mcp-tool-response-handler.service.d.ts.map +1 -1
  26. package/dist/services/mcp-tool-response-handlers/solid-create-model-with-fields-mcp-tool-response-handler.service.js +2 -2
  27. package/dist/services/mcp-tool-response-handlers/solid-create-model-with-fields-mcp-tool-response-handler.service.js.map +1 -1
  28. package/dist/services/mcp-tool-response-handlers/solid-create-module-mcp-tool-response-handler.service.js +2 -2
  29. package/dist/services/mcp-tool-response-handlers/solid-create-module-mcp-tool-response-handler.service.js.map +1 -1
  30. package/dist/tsconfig.tsbuildinfo +1 -1
  31. package/package.json +3 -2
  32. package/src/controllers/ai-interaction.controller.ts +1 -1
  33. package/src/controllers/service.controller.ts +40 -2
  34. package/src/helpers/date.helper.ts +13 -0
  35. package/src/jobs/database/trigger-mcp-client-subscriber-database.service.ts +27 -18
  36. package/src/seeders/seed-data/solid-core-metadata.json +3 -1
  37. package/src/services/ai-interaction.service.ts +14 -7
  38. package/src/services/excel.service.ts +2 -2
  39. package/src/services/genai/ingest-metadata.service.ts +34 -8
  40. package/src/services/import-transaction.service.ts +46 -11
  41. package/src/services/mcp-tool-response-handlers/solid-create-model-with-fields-mcp-tool-response-handler.service.ts +3 -2
  42. package/src/services/mcp-tool-response-handlers/solid-create-module-mcp-tool-response-handler.service.ts +2 -2
@@ -91,13 +91,9 @@ let IngestMetadataService = IngestMetadataService_1 = class IngestMetadataServic
91
91
  this.logger.log(`[Start] Processing module metadata for ${moduleMetadata.name}`);
92
92
  const collectionId = await this.resolveRagCollectionForModule(ingestionInfo, enabledModule);
93
93
  ingestionInfo.collectionId = collectionId;
94
- await this.deleteInsertRagDocumentForModuleMetadataJsonFile(ingestionInfo, fullPath, fileName);
95
94
  await this.deleteInsertRagChunkForModule(ingestionInfo, moduleMetadata);
96
95
  for (const model of moduleMetadata.models) {
97
96
  await this.deleteInsertRagChunkForModel(ingestionInfo, enabledModule, model);
98
- for (const field of model.fields) {
99
- await this.deleteInsertRagChunkForField(ingestionInfo, enabledModule, model.singularName, field);
100
- }
101
97
  }
102
98
  fs.writeFileSync(enabledModulIngestionInfoFullPath, JSON.stringify({ ...ingestionInfo }, null, 2), 'utf8');
103
99
  }
@@ -171,7 +167,6 @@ let IngestMetadataService = IngestMetadataService_1 = class IngestMetadataServic
171
167
  models: (moduleMetadata?.models ?? []).map((m) => ({
172
168
  singularName: m?.singularName ?? null,
173
169
  description: m?.description ?? null,
174
- fields: Array.isArray(m?.fields) ? m.fields.map((f) => f?.name ?? null) : [],
175
170
  })),
176
171
  });
177
172
  if (ingestionInfo.moduleHash === schemaHash && ingestionInfo.moduleChunkId) {
@@ -192,6 +187,7 @@ ${modelLines.join('\n')}
192
187
 
193
188
  Usage: Use this chunk to choose the correct model/field chunks for code generation or metadata edits.`;
194
189
  const metadata = {
190
+ collectionName: `${moduleName}-rag-collection`,
195
191
  kind: 'solidx-metadata',
196
192
  type: 'module',
197
193
  moduleName,
@@ -208,7 +204,7 @@ Usage: Use this chunk to choose the correct model/field chunks for code generati
208
204
  }
209
205
  }
210
206
  const r = await this.ragClient.documents.create({
211
- raw_text: text,
207
+ chunks: [text],
212
208
  metadata: metadata,
213
209
  collectionIds: [ingestionInfo.collectionId],
214
210
  });
@@ -266,8 +262,13 @@ Fields (${fields.length}) [name:type|flags]:
266
262
  ${fieldSummaryLines.join('\n')}
267
263
 
268
264
  Usage: Use this chunk to generate DTOs, subscribers, custom service methods, and CRUD handlers for ${modelName}.
269
- For exact constraints (enum/min/max/regex/default), consult the individual field chunks.`;
265
+
266
+ Full model metadata json:
267
+ ${JSON.stringify(model)}
268
+
269
+ `;
270
270
  const metadata = {
271
+ collectionName: `${moduleName}-rag-collection`,
271
272
  kind: 'solidx-metadata',
272
273
  type: 'model',
273
274
  moduleName,
@@ -289,7 +290,7 @@ For exact constraints (enum/min/max/regex/default), consult the individual field
289
290
  }
290
291
  }
291
292
  const r = await this.ragClient.documents.create({
292
- raw_text: text,
293
+ chunks: [text],
293
294
  metadata,
294
295
  collectionIds: [ingestionInfo.collectionId],
295
296
  });
@@ -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 for (const field of model.fields) {\n await this.deleteInsertRagChunkForField(ingestionInfo, enabledModule, model.singularName, field);\n }\n }\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 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 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}.\nFor exact constraints (enum/min/max/regex/default), consult the individual field chunks.`;\n\n // 4) Metadata (concise & queryable)\n const metadata = {\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 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 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 // 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":"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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 +1 @@
1
- {"version":3,"file":"import-transaction.service.d.ts","sourceRoot":"","sources":["../../src/services/import-transaction.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"import-transaction.service.d.ts","sourceRoot":"","sources":["../../src/services/import-transaction.service.ts"],"names":[],"mappings":"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"}
@@ -34,6 +34,7 @@ const csv_service_1 = require("./csv.service");
34
34
  const excel_service_1 = require("./excel.service");
35
35
  const solid_introspect_service_1 = require("./solid-introspect.service");
36
36
  const error_messages_1 = require("../constants/error-messages");
37
+ const date_helper_1 = require("../helpers/date.helper");
37
38
  var ImportFormat;
38
39
  (function (ImportFormat) {
39
40
  ImportFormat["CSV"] = "csv";
@@ -414,7 +415,8 @@ let ImportTransactionService = ImportTransactionService_1 = class ImportTransact
414
415
  return await this.populateDtoForRelations(fieldMetadata, record, key, dtoRecord);
415
416
  }
416
417
  case create_field_metadata_dto_1.SolidFieldType.date:
417
- case create_field_metadata_dto_1.SolidFieldType.datetime: return this.populateDtoForDate(record, key, fieldMetadata, dtoRecord);
418
+ case create_field_metadata_dto_1.SolidFieldType.datetime:
419
+ return this.populateDtoForDate(record, key, fieldMetadata, dtoRecord);
418
420
  case create_field_metadata_dto_1.SolidFieldType.int:
419
421
  case create_field_metadata_dto_1.SolidFieldType.bigint:
420
422
  case create_field_metadata_dto_1.SolidFieldType.decimal:
@@ -424,14 +426,22 @@ let ImportTransactionService = ImportTransactionService_1 = class ImportTransact
424
426
  case create_field_metadata_dto_1.SolidFieldType.selectionStatic:
425
427
  case create_field_metadata_dto_1.SolidFieldType.selectionDynamic:
426
428
  return this.populateDtoForSelectionValues(dtoRecord, fieldMetadata, record, key);
427
- default:
429
+ case create_field_metadata_dto_1.SolidFieldType.email:
430
+ case create_field_metadata_dto_1.SolidFieldType.shortText:
431
+ case create_field_metadata_dto_1.SolidFieldType.longtext:
432
+ case create_field_metadata_dto_1.SolidFieldType.richText: {
433
+ dtoRecord[fieldMetadata.name] = record[key] ? String(record[key]).trim() : null;
434
+ return dtoRecord;
435
+ }
436
+ default: {
428
437
  dtoRecord[fieldMetadata.name] = record[key];
429
438
  return dtoRecord;
439
+ }
430
440
  }
431
441
  }
432
442
  populateDtoForSelectionValues(dtoRecord, fieldMetadata, record, key) {
433
443
  const rawValue = record[key];
434
- if (rawValue == null) {
444
+ if (rawValue == null || rawValue === '' || (typeof rawValue === 'string' && rawValue.trim() === '')) {
435
445
  dtoRecord[fieldMetadata.name] = null;
436
446
  return dtoRecord;
437
447
  }
@@ -449,15 +459,25 @@ let ImportTransactionService = ImportTransactionService_1 = class ImportTransact
449
459
  return dtoRecord;
450
460
  }
451
461
  populateDtoForBoolean(dtoRecord, fieldMetadata, record, key) {
452
- const booleanValue = Boolean(record[key]);
453
- if (typeof booleanValue !== 'boolean') {
454
- throw new Error(`Invalid boolean value for cell ${key} with value ${record[key]}`);
462
+ const cellValue = record[key];
463
+ if (cellValue === null || cellValue === undefined || cellValue === '') {
464
+ dtoRecord[fieldMetadata.name] = null;
465
+ return dtoRecord;
466
+ }
467
+ const booleanValue = (String(cellValue).toLowerCase() === 'true' || String(cellValue) === '1' || String(cellValue).toLowerCase() === 'yes') ? true : (String(cellValue).toLowerCase() === 'false' || String(cellValue) === '0' || String(cellValue).toLowerCase() === 'no') ? false : null;
468
+ if (booleanValue === null) {
469
+ throw new Error(`Invalid boolean value for cell ${key} with value ${cellValue}`);
455
470
  }
456
471
  dtoRecord[fieldMetadata.name] = booleanValue;
457
472
  return dtoRecord;
458
473
  }
459
474
  populateDtoForNumber(dtoRecord, fieldMetadata, record, key) {
460
- const numberValue = Number(record[key]);
475
+ const cellValue = record[key];
476
+ if (cellValue === null || cellValue === undefined || cellValue === '') {
477
+ dtoRecord[fieldMetadata.name] = null;
478
+ return dtoRecord;
479
+ }
480
+ const numberValue = Number(cellValue);
461
481
  if (isNaN(numberValue)) {
462
482
  throw new Error(`Invalid number value for cell ${key} with value ${record[key]}`);
463
483
  }
@@ -466,9 +486,16 @@ let ImportTransactionService = ImportTransactionService_1 = class ImportTransact
466
486
  }
467
487
  populateDtoForDate(record, key, fieldMetadata, dtoRecord) {
468
488
  {
469
- const dateValue = new Date(record[key]);
470
- if (isNaN(dateValue.getTime())) {
471
- throw new Error(`Invalid date value for cell ${key} with value ${record[key]}`);
489
+ const cellValue = record[key];
490
+ if (!cellValue) {
491
+ dtoRecord[fieldMetadata.name] = null;
492
+ return dtoRecord;
493
+ }
494
+ console.log(cellValue, 'cellValue');
495
+ const dateValue = (0, date_helper_1.parseFlexibleDate)(cellValue);
496
+ console.log(dateValue, 'dateValue');
497
+ if (!dateValue) {
498
+ throw new Error(`Invalid date value for cell ${key} with value ${cellValue}`);
472
499
  }
473
500
  dtoRecord[fieldMetadata.name] = dateValue;
474
501
  return dtoRecord;