@solidstarters/solid-core 1.2.178 → 1.2.179
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/controllers/ai-interaction.controller.js.map +1 -1
- package/dist/jobs/database/trigger-mcp-client-subscriber-database.service.d.ts.map +1 -1
- package/dist/jobs/database/trigger-mcp-client-subscriber-database.service.js +5 -3
- package/dist/jobs/database/trigger-mcp-client-subscriber-database.service.js.map +1 -1
- package/dist/seeders/seed-data/solid-core-metadata.json +2 -1
- package/dist/services/ai-interaction.service.d.ts.map +1 -1
- package/dist/services/ai-interaction.service.js +1 -0
- package/dist/services/ai-interaction.service.js.map +1 -1
- package/dist/services/genai/ingest-metadata.service.d.ts.map +1 -1
- package/dist/services/genai/ingest-metadata.service.js +9 -8
- package/dist/services/genai/ingest-metadata.service.js.map +1 -1
- package/dist/services/import-transaction.service.d.ts.map +1 -1
- package/dist/services/import-transaction.service.js +32 -8
- package/dist/services/import-transaction.service.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/src/controllers/ai-interaction.controller.ts +1 -1
- package/src/jobs/database/trigger-mcp-client-subscriber-database.service.ts +9 -4
- package/src/seeders/seed-data/solid-core-metadata.json +3 -1
- package/src/services/ai-interaction.service.ts +1 -0
- package/src/services/genai/ingest-metadata.service.ts +34 -8
- package/src/services/import-transaction.service.ts +36 -9
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai-interaction.controller.js","sourceRoot":"","sources":["../../src/controllers/ai-interaction.controller.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAA+H;AAC/H,+DAA+D;AAC/D,6CAAmE;AACnE,+EAA0E;AAC1E,iFAA2E;AAC3E,iFAA2E;AAC3E,uEAAiE;AACjE,+EAAkE;AAGlE,IAAK,eAGJ;AAHD,WAAK,eAAe;IAClB,0CAAuB,CAAA;IACvB,0CAAuB,CAAA;AACzB,CAAC,EAHI,eAAe,KAAf,eAAe,QAGnB;AAIM,IAAM,uBAAuB,GAA7B,MAAM,uBAAuB;IAClC,YAA6B,OAA6B;QAA7B,YAAO,GAAP,OAAO,CAAsB;IAAI,CAAC;IAK/D,MAAM,CAAS,SAAiC,EAAmB,KAAiC;QAClG,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IAC/C,CAAC;IAKD,UAAU,CAAS,UAAoC,EAAmB,aAAsC,EAAE;QAChH,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IACzD,CAAC;IAMD,MAAM,CAAc,EAAU,EAAU,SAAiC,EAAmB,KAAiC;QAC3H,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;IACnD,CAAC;IAKD,aAAa,CAAc,EAAU,EAAU,SAAiC,EAAmB,KAAiC;QAClI,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;IACzD,CAAC;IAIK,AAAN,KAAK,CAAC,WAAW,CAAS,GAAa;QACrC,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACvC,CAAC;IAIK,AAAN,KAAK,CAAC,OAAO,CAAc,EAAU;QACnC,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAClC,CAAC;IAaK,AAAN,KAAK,CAAC,QAAQ,CAAU,KAAU;QAChC,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClC,CAAC;IAIK,AAAN,KAAK,CAAC,OAAO,CAAc,EAAU,EAAW,KAAU;QACxD,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;IAC1C,CAAC;IAIK,AAAN,KAAK,CAAC,UAAU,CAAS,GAAa;QACpC,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IACtC,CAAC;IAIK,AAAN,KAAK,CAAC,MAAM,CAAc,EAAU;QAClC,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACjC,CAAC;IAIK,AAAN,KAAK,CAAC,mBAAmB,CAAS,GAAsB,EAAgB,UAA0B;QAChG,OAAO,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,GAAG,
|
|
1
|
+
{"version":3,"file":"ai-interaction.controller.js","sourceRoot":"","sources":["../../src/controllers/ai-interaction.controller.ts"],"names":[],"mappings":"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","sourcesContent":["import { Controller, Post, Body, Param, UploadedFiles, UseInterceptors, Put, Get, Query, Delete, Patch } from '@nestjs/common';\nimport { AnyFilesInterceptor } from \"@nestjs/platform-express\";\nimport { ApiBearerAuth, ApiQuery, ApiTags } from '@nestjs/swagger';\nimport { AiInteractionService } from '../services/ai-interaction.service';\nimport { CreateAiInteractionDto } from '../dtos/create-ai-interaction.dto';\nimport { UpdateAiInteractionDto } from '../dtos/update-ai-interaction.dto';\nimport { InvokeAiPromptDto } from '../dtos/invoke-ai-prompt.dto';\nimport { ActiveUser } from 'src/decorators/active-user.decorator';\nimport { ActiveUserData } from 'src/interfaces/active-user-data.interface';\n\nenum ShowSoftDeleted {\n INCLUSIVE = \"inclusive\",\n EXCLUSIVE = \"exclusive\",\n}\n\n@ApiTags('Solid Core')\n@Controller('ai-interaction')\nexport class AiInteractionController {\n constructor(private readonly service: AiInteractionService) { }\n\n @ApiBearerAuth(\"jwt\")\n @Post()\n @UseInterceptors(AnyFilesInterceptor())\n create(@Body() createDto: CreateAiInteractionDto, @UploadedFiles() files: Array<Express.Multer.File>) {\n return this.service.create(createDto, files);\n }\n\n @ApiBearerAuth(\"jwt\")\n @Post('/bulk')\n @UseInterceptors(AnyFilesInterceptor())\n insertMany(@Body() createDtos: CreateAiInteractionDto[], @UploadedFiles() filesArray: Express.Multer.File[][] = []) {\n return this.service.insertMany(createDtos, filesArray);\n }\n\n\n @ApiBearerAuth(\"jwt\")\n @Put(':id')\n @UseInterceptors(AnyFilesInterceptor())\n update(@Param('id') id: number, @Body() updateDto: UpdateAiInteractionDto, @UploadedFiles() files: Array<Express.Multer.File>) {\n return this.service.update(id, updateDto, files);\n }\n\n @ApiBearerAuth(\"jwt\")\n @Patch(':id')\n @UseInterceptors(AnyFilesInterceptor())\n partialUpdate(@Param('id') id: number, @Body() updateDto: UpdateAiInteractionDto, @UploadedFiles() files: Array<Express.Multer.File>) {\n return this.service.update(id, updateDto, files, true);\n }\n\n @ApiBearerAuth(\"jwt\")\n @Post('/bulk-recover')\n async recoverMany(@Body() ids: number[]) {\n return this.service.recoverMany(ids);\n }\n\n @ApiBearerAuth(\"jwt\")\n @Get('/recover/:id')\n async recover(@Param('id') id: number) {\n return this.service.recover(id);\n }\n\n @ApiBearerAuth(\"jwt\")\n @ApiQuery({ name: 'showSoftDeleted', required: false, enum: ShowSoftDeleted })\n @ApiQuery({ name: 'limit', required: false, type: Number })\n @ApiQuery({ name: 'offset', required: false, type: Number })\n @ApiQuery({ name: 'fields', required: false, type: Array })\n @ApiQuery({ name: 'sort', required: false, type: Array })\n @ApiQuery({ name: 'groupBy', required: false, type: Array })\n @ApiQuery({ name: 'populate', required: false, type: Array })\n @ApiQuery({ name: 'populateMedia', required: false, type: Array })\n @ApiQuery({ name: 'filters', required: false, type: Array })\n @Get()\n async findMany(@Query() query: any) {\n return this.service.find(query);\n }\n\n @ApiBearerAuth(\"jwt\")\n @Get(':id')\n async findOne(@Param('id') id: string, @Query() query: any) {\n return this.service.findOne(+id, query);\n }\n\n @ApiBearerAuth(\"jwt\")\n @Delete('/bulk')\n async deleteMany(@Body() ids: number[]) {\n return this.service.deleteMany(ids);\n }\n\n @ApiBearerAuth(\"jwt\")\n @Delete(':id')\n async delete(@Param('id') id: number) {\n return this.service.delete(id);\n }\n\n @ApiBearerAuth(\"jwt\")\n @Post('/trigger-mcp-client-job')\n async triggerMcpClientJob(@Body() dto: InvokeAiPromptDto, @ActiveUser() activeUser: ActiveUserData) {\n return this.service.triggerMcpClientJob(dto, activeUser.sub);\n }\n\n @ApiBearerAuth(\"jwt\")\n @Post(':id/apply-solid-ai-interaction')\n async applySolidAiInteraction(@Param('id') id: number) {\n return this.service.applySolidAiInteraction(+id);\n }\n\n @ApiBearerAuth(\"jwt\")\n @Post('/run-mcp-prompt')\n async runMcpPrompt(@Body() dto: InvokeAiPromptDto) {\n return this.service.runMcpPrompt(dto.prompt);\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trigger-mcp-client-subscriber-database.service.d.ts","sourceRoot":"","sources":["../../../src/jobs/database/trigger-mcp-client-subscriber-database.service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AACrE,OAAO,EAAE,qBAAqB,EAAE,MAAM,yCAAyC,CAAC;AAChF,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAC7F,OAAO,EAAE,kBAAkB,EAAE,MAAM,iDAAiD,CAAC;AAErF,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAC3E,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAE5D,qBACa,kCAAmC,SAAQ,kBAAkB,CAAC,uBAAuB,CAAC;IAI3F,QAAQ,CAAC,gBAAgB,EAAE,gBAAgB;IAC3C,QAAQ,CAAC,qBAAqB,EAAE,qBAAqB;IACrD,QAAQ,CAAC,MAAM,EAAE,aAAa;IAC9B,QAAQ,CAAC,oBAAoB,EAAE,oBAAoB;IANvD,OAAO,CAAC,QAAQ,CAAC,gCAAgC,CAAuD;gBAG3F,gBAAgB,EAAE,gBAAgB,EAClC,qBAAqB,EAAE,qBAAqB,EAC5C,MAAM,EAAE,aAAa,EACrB,oBAAoB,EAAE,oBAAoB;IAKvD,OAAO,IAAI,mBAAmB;IAM9B,mBAAmB,CAAC,UAAU,EAAE,WAAW;IA8BrC,SAAS,CAAC,OAAO,EAAE,YAAY,CAAC,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"trigger-mcp-client-subscriber-database.service.d.ts","sourceRoot":"","sources":["../../../src/jobs/database/trigger-mcp-client-subscriber-database.service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AACrE,OAAO,EAAE,qBAAqB,EAAE,MAAM,yCAAyC,CAAC;AAChF,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAC7F,OAAO,EAAE,kBAAkB,EAAE,MAAM,iDAAiD,CAAC;AAErF,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAC3E,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAE5D,qBACa,kCAAmC,SAAQ,kBAAkB,CAAC,uBAAuB,CAAC;IAI3F,QAAQ,CAAC,gBAAgB,EAAE,gBAAgB;IAC3C,QAAQ,CAAC,qBAAqB,EAAE,qBAAqB;IACrD,QAAQ,CAAC,MAAM,EAAE,aAAa;IAC9B,QAAQ,CAAC,oBAAoB,EAAE,oBAAoB;IANvD,OAAO,CAAC,QAAQ,CAAC,gCAAgC,CAAuD;gBAG3F,gBAAgB,EAAE,gBAAgB,EAClC,qBAAqB,EAAE,qBAAqB,EAC5C,MAAM,EAAE,aAAa,EACrB,oBAAoB,EAAE,oBAAoB;IAKvD,OAAO,IAAI,mBAAmB;IAM9B,mBAAmB,CAAC,UAAU,EAAE,WAAW;IA8BrC,SAAS,CAAC,OAAO,EAAE,YAAY,CAAC,uBAAuB,CAAC;CAmIjE"}
|
|
@@ -85,7 +85,7 @@ let TriggerMcpClientSubscriberDatabase = TriggerMcpClientSubscriberDatabase_1 =
|
|
|
85
85
|
responseTimeMs: 0,
|
|
86
86
|
metadata: '',
|
|
87
87
|
isApplied: false,
|
|
88
|
-
status: ''
|
|
88
|
+
status: 'pending'
|
|
89
89
|
});
|
|
90
90
|
const finalPrompt = `
|
|
91
91
|
# User Prompt:
|
|
@@ -117,12 +117,14 @@ let TriggerMcpClientSubscriberDatabase = TriggerMcpClientSubscriberDatabase_1 =
|
|
|
117
117
|
throw new Error(errorsStr);
|
|
118
118
|
}
|
|
119
119
|
else {
|
|
120
|
+
let nestedResponse = this.cleanNestedResponse(aiResponse);
|
|
121
|
+
const errorsStr = nestedResponse.status == "error" && nestedResponse.errors.join('\n ');
|
|
120
122
|
await this.aiInteractionService.update(genAiInteraction.id, {
|
|
121
|
-
errorMessage:
|
|
123
|
+
errorMessage: nestedResponse.status == "error" ? `${errorsStr}` : "",
|
|
122
124
|
modelUsed: aiResponse.model,
|
|
123
125
|
responseTimeMs: aiResponse.duration_ms,
|
|
124
126
|
isApplied: aiInteraction.isApplied,
|
|
125
|
-
status: aiResponse.success ? 'succeeded' : 'failed'
|
|
127
|
+
status: aiResponse.success && nestedResponse.status == "success" ? 'succeeded' : 'failed'
|
|
126
128
|
}, [], true);
|
|
127
129
|
if (aiInteraction.isAutoApply) {
|
|
128
130
|
this.aiInteractionService.applySolidAiInteraction(genAiInteraction.id);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trigger-mcp-client-subscriber-database.service.js","sourceRoot":"","sources":["../../../src/jobs/database/trigger-mcp-client-subscriber-database.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { Injectable, Logger } from '@nestjs/common';\n\nimport { QueueMessage } from 'src/interfaces/mq';\nimport { MqMessageService } from '../../services/mq-message.service';\nimport { MqMessageQueueService } from '../../services/mq-message-queue.service';\nimport { McpResponse, QueuesModuleOptions, TriggerMcpClientOptions } from \"../../interfaces\";\nimport { DatabaseSubscriber } from 'src/services/queues/database-subscriber.service';\nimport triggerMcpClientQueueOptions from \"./trigger-mcp-client-queue-options\";\nimport { AiInteractionService } from 'src/services/ai-interaction.service';\nimport { PollerService } from 'src/services/poller.service';\n\n@Injectable()\nexport class TriggerMcpClientSubscriberDatabase extends DatabaseSubscriber<TriggerMcpClientOptions> {\n private readonly triggerMcpClientSubscriberLogger = new Logger(TriggerMcpClientSubscriberDatabase.name);\n\n constructor(\n readonly mqMessageService: MqMessageService,\n readonly mqMessageQueueService: MqMessageQueueService,\n readonly poller: PollerService,\n readonly aiInteractionService: AiInteractionService,\n ) {\n super(mqMessageService, mqMessageQueueService, poller);\n }\n\n options(): QueuesModuleOptions {\n return {\n ...triggerMcpClientQueueOptions\n }\n }\n\n cleanNestedResponse(aiResponse: McpResponse) {\n let nestedResponse: any;\n\n try {\n let raw = aiResponse.response;\n\n if (typeof raw === \"string\") {\n raw = raw.trim();\n try {\n // Try to parse as JSON\n nestedResponse = JSON.parse(raw);\n } catch {\n // Not JSON, just keep as string\n nestedResponse = raw;\n }\n } else if (typeof raw === \"object\" && raw !== null) {\n // Already JSON\n nestedResponse = raw;\n } else {\n // Fallback\n nestedResponse = String(raw);\n }\n } catch (err) {\n this.triggerMcpClientSubscriberLogger.error(\"Error processing AI response:\", err);\n nestedResponse = `Error handling response: ${err?.message || String(err)}`;\n }\n\n return nestedResponse;\n }\n\n async subscribe(message: QueueMessage<TriggerMcpClientOptions>) {\n this.triggerMcpClientSubscriberLogger.debug(`Received message: ${JSON.stringify(message)}`);\n\n const codeGnerationOptions = message.payload;\n\n const aiInteraction = await this.aiInteractionService.findOne(codeGnerationOptions.aiInteractionId, {\n populate: ['user']\n });\n if (!aiInteraction) {\n const m = `Unable to identified the aiInteraction entry that triggered this job... using id: ${codeGnerationOptions.aiInteractionId}`\n this.triggerMcpClientSubscriberLogger.log(m);\n throw new Error(m);\n }\n\n // The message contains the users prompt.\n const prompt = aiInteraction.message;\n\n // Use this to invoke our mcp client\n // TODO: try / catch ... \n // Handle the rejection gracefully...\n\n // We create the aiInteraction entry first \n const genAiInteraction = await this.aiInteractionService.create({\n userId: aiInteraction.user.id,\n threadId: aiInteraction.threadId,\n parentInteractionId: aiInteraction.id,\n role: 'gen-ai',\n message: '...', // Updated in the tool\n contentType: '', // Updated in the tool\n errorMessage: '', // Updated after we receive the response\n modelUsed: '', // Updated after we receive the response\n responseTimeMs: 0, // Updated after we receive the response\n metadata: '', // Updated in the tool\n isApplied: false, // Updated after we receive the response\n status: '' // Updated after we receive the response\n });\n\n const finalPrompt = `\n # User Prompt: \n ${prompt}\n \n # System Instructions:\n - aiInteractionId: ${genAiInteraction.id}\n - moduleName:${message.payload.moduleName}\n - You will be invoking tools if needed.\n - If a tool is invoked, you must return **exactly** the raw output from the tool, without any additional formatting, commentary, or text.\n - Do not wrap the result in quotes, JSON, or markdown fences.\n - Do not explain what the result means.\n - Your final response must be identical to the tool output.\n `\n\n const aiResponse = await this.aiInteractionService.runMcpPrompt(finalPrompt);\n this.triggerMcpClientSubscriberLogger.log(`aiResponse: `);\n this.triggerMcpClientSubscriberLogger.log(JSON.stringify(aiResponse));\n\n if (!aiResponse.success) {\n this.triggerMcpClientSubscriberLogger.log(`Gen ai has returned with a false status code`);\n\n const errorsStr = aiResponse.errors.join('\\n ');\n const errorTrace = aiResponse.error_trace.join('\\n');\n\n // await this.aiInteractionService.create({\n // userId: aiInteraction.user.id,\n // threadId: aiInteraction.threadId,\n // parentInteractionId: aiInteraction.id,\n // role: 'gen-ai',\n // message: '-',\n // contentType: aiResponse.content_type,\n // errorMessage: errorsStr,\n // modelUsed: aiResponse.model,\n // responseTimeMs: aiResponse.duration_ms,\n // metadata: JSON.stringify(aiResponse, null, 2),\n // isApplied: aiInteraction.isApplied,\n // status: aiResponse.success ? 'succeeded' : 'failed'\n // });\n\n // TODO: Update the previously created genAiInteraction record with the respective error fields and save to DB\n await this.aiInteractionService.update(genAiInteraction.id, {\n // contentType: aiResponse.content_type,\n errorMessage: `${errorsStr}\\n\\n${errorTrace}`,\n modelUsed: aiResponse.model,\n responseTimeMs: aiResponse.duration_ms,\n isApplied: aiInteraction.isApplied,\n status: aiResponse.success ? 'succeeded' : 'failed'\n }, [], true);\n\n // update the job entry with failure... raising an error will lead the job to be marked as failed...\n throw new Error(errorsStr);\n }\n else {\n // let nestedResponse = this.cleanNestedResponse(aiResponse);\n\n // const genAiInteraction = await this.aiInteractionService.create({\n // userId: aiInteraction.user.id,\n // threadId: aiInteraction.threadId,\n // parentInteractionId: aiInteraction.id,\n // role: 'gen-ai',\n // message: nestedResponse,\n // contentType: aiResponse.content_type,\n // errorMessage: '',\n // modelUsed: aiResponse.model,\n // responseTimeMs: aiResponse.duration_ms,\n // metadata: JSON.stringify(aiResponse, null, 2),\n // isApplied: aiInteraction.isApplied,\n // status: aiResponse.success ? 'succeeded' : 'failed'\n // });\n\n // TODO: Update the previously created genAiInteraction record with the respective success fields and save to DB\n await this.aiInteractionService.update(genAiInteraction.id, {\n // contentType: aiResponse.content_type,\n errorMessage: '',\n // message: nestedResponse,\n modelUsed: aiResponse.model,\n responseTimeMs: aiResponse.duration_ms,\n isApplied: aiInteraction.isApplied,\n status: aiResponse.success ? 'succeeded' : 'failed'\n }, [], true);\n\n // If the human interaction was with isAutoApply=true, then we can go ahead and autoApply.\n if (aiInteraction.isAutoApply) {\n this.aiInteractionService.applySolidAiInteraction(genAiInteraction.id);\n }\n }\n\n return aiResponse;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"trigger-mcp-client-subscriber-database.service.js","sourceRoot":"","sources":["../../../src/jobs/database/trigger-mcp-client-subscriber-database.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { Injectable, Logger } from '@nestjs/common';\n\nimport { QueueMessage } from 'src/interfaces/mq';\nimport { MqMessageService } from '../../services/mq-message.service';\nimport { MqMessageQueueService } from '../../services/mq-message-queue.service';\nimport { McpResponse, QueuesModuleOptions, TriggerMcpClientOptions } from \"../../interfaces\";\nimport { DatabaseSubscriber } from 'src/services/queues/database-subscriber.service';\nimport triggerMcpClientQueueOptions from \"./trigger-mcp-client-queue-options\";\nimport { AiInteractionService } from 'src/services/ai-interaction.service';\nimport { PollerService } from 'src/services/poller.service';\n\n@Injectable()\nexport class TriggerMcpClientSubscriberDatabase extends DatabaseSubscriber<TriggerMcpClientOptions> {\n private readonly triggerMcpClientSubscriberLogger = new Logger(TriggerMcpClientSubscriberDatabase.name);\n\n constructor(\n readonly mqMessageService: MqMessageService,\n readonly mqMessageQueueService: MqMessageQueueService,\n readonly poller: PollerService,\n readonly aiInteractionService: AiInteractionService,\n ) {\n super(mqMessageService, mqMessageQueueService, poller);\n }\n\n options(): QueuesModuleOptions {\n return {\n ...triggerMcpClientQueueOptions\n }\n }\n\n cleanNestedResponse(aiResponse: McpResponse) {\n let nestedResponse: any;\n\n try {\n let raw = aiResponse.response;\n\n if (typeof raw === \"string\") {\n raw = raw.trim();\n try {\n // Try to parse as JSON\n nestedResponse = JSON.parse(raw);\n } catch {\n // Not JSON, just keep as string\n nestedResponse = raw;\n }\n } else if (typeof raw === \"object\" && raw !== null) {\n // Already JSON\n nestedResponse = raw;\n } else {\n // Fallback\n nestedResponse = String(raw);\n }\n } catch (err) {\n this.triggerMcpClientSubscriberLogger.error(\"Error processing AI response:\", err);\n nestedResponse = `Error handling response: ${err?.message || String(err)}`;\n }\n\n return nestedResponse;\n }\n\n async subscribe(message: QueueMessage<TriggerMcpClientOptions>) {\n this.triggerMcpClientSubscriberLogger.debug(`Received message: ${JSON.stringify(message)}`);\n\n const codeGnerationOptions = message.payload;\n\n const aiInteraction = await this.aiInteractionService.findOne(codeGnerationOptions.aiInteractionId, {\n populate: ['user']\n });\n if (!aiInteraction) {\n const m = `Unable to identified the aiInteraction entry that triggered this job... using id: ${codeGnerationOptions.aiInteractionId}`\n this.triggerMcpClientSubscriberLogger.log(m);\n throw new Error(m);\n }\n\n // The message contains the users prompt.\n const prompt = aiInteraction.message;\n\n // Use this to invoke our mcp client\n // TODO: try / catch ... \n // Handle the rejection gracefully...\n\n // We create the aiInteraction entry first \n const genAiInteraction = await this.aiInteractionService.create({\n userId: aiInteraction.user.id,\n threadId: aiInteraction.threadId,\n parentInteractionId: aiInteraction.id,\n role: 'gen-ai',\n message: '...', // Updated in the tool\n contentType: '', // Updated in the tool\n errorMessage: '', // Updated after we receive the response\n modelUsed: '', // Updated after we receive the response\n responseTimeMs: 0, // Updated after we receive the response\n metadata: '', // Updated in the tool\n isApplied: false, // Updated after we receive the response\n status: 'pending' // Updated after we receive the response\n });\n\n const finalPrompt = `\n # User Prompt: \n ${prompt}\n \n # System Instructions:\n - aiInteractionId: ${genAiInteraction.id}\n - moduleName:${message.payload.moduleName}\n - You will be invoking tools if needed.\n - If a tool is invoked, you must return **exactly** the raw output from the tool, without any additional formatting, commentary, or text.\n - Do not wrap the result in quotes, JSON, or markdown fences.\n - Do not explain what the result means.\n - Your final response must be identical to the tool output.\n `\n\n const aiResponse = await this.aiInteractionService.runMcpPrompt(finalPrompt);\n this.triggerMcpClientSubscriberLogger.log(`aiResponse: `);\n this.triggerMcpClientSubscriberLogger.log(JSON.stringify(aiResponse));\n\n if (!aiResponse.success) {\n this.triggerMcpClientSubscriberLogger.log(`Gen ai has returned with a false status code`);\n\n const errorsStr = aiResponse.errors.join('\\n ');\n const errorTrace = aiResponse.error_trace.join('\\n');\n\n // await this.aiInteractionService.create({\n // userId: aiInteraction.user.id,\n // threadId: aiInteraction.threadId,\n // parentInteractionId: aiInteraction.id,\n // role: 'gen-ai',\n // message: '-',\n // contentType: aiResponse.content_type,\n // errorMessage: errorsStr,\n // modelUsed: aiResponse.model,\n // responseTimeMs: aiResponse.duration_ms,\n // metadata: JSON.stringify(aiResponse, null, 2),\n // isApplied: aiInteraction.isApplied,\n // status: aiResponse.success ? 'succeeded' : 'failed'\n // });\n\n // TODO: Update the previously created genAiInteraction record with the respective error fields and save to DB\n await this.aiInteractionService.update(genAiInteraction.id, {\n // contentType: aiResponse.content_type,\n errorMessage: `${errorsStr}\\n\\n${errorTrace}`,\n modelUsed: aiResponse.model,\n responseTimeMs: aiResponse.duration_ms,\n isApplied: aiInteraction.isApplied,\n status: aiResponse.success ? 'succeeded' : 'failed'\n }, [], true);\n\n // update the job entry with failure... raising an error will lead the job to be marked as failed...\n throw new Error(errorsStr);\n }\n else {\n let nestedResponse = this.cleanNestedResponse(aiResponse);\n\n // const genAiInteraction = await this.aiInteractionService.create({\n // userId: aiInteraction.user.id,\n // threadId: aiInteraction.threadId,\n // parentInteractionId: aiInteraction.id,\n // role: 'gen-ai',\n // message: nestedResponse,\n // contentType: aiResponse.content_type,\n // errorMessage: '',\n // modelUsed: aiResponse.model,\n // responseTimeMs: aiResponse.duration_ms,\n // metadata: JSON.stringify(aiResponse, null, 2),\n // isApplied: aiInteraction.isApplied,\n // status: aiResponse.success ? 'succeeded' : 'failed'\n // });\n\n // TODO: Update the previously created genAiInteraction record with the respective success fields and save to DB\n const errorsStr = nestedResponse.status == \"error\" && nestedResponse.errors.join('\\n ');\n\n await this.aiInteractionService.update(genAiInteraction.id, {\n errorMessage: nestedResponse.status == \"error\" ? `${errorsStr}` : \"\",\n // errorMessage:\"\",\n // contentType: aiResponse.content_type,\n // message: nestedResponse,\n modelUsed: aiResponse.model,\n responseTimeMs: aiResponse.duration_ms,\n isApplied: aiInteraction.isApplied,\n\n // status: aiResponse.success ? 'succeeded' : 'failed'\n status: aiResponse.success && nestedResponse.status == \"success\" ? 'succeeded' : 'failed'\n }, [], true);\n\n // If the human interaction was with isAutoApply=true, then we can go ahead and autoApply.\n if (aiInteraction.isAutoApply) {\n this.aiInteractionService.applySolidAiInteraction(genAiInteraction.id);\n }\n }\n\n return aiResponse;\n }\n}\n"]}
|
|
@@ -12331,7 +12331,8 @@
|
|
|
12331
12331
|
"type": "field",
|
|
12332
12332
|
"attrs": {
|
|
12333
12333
|
"name": "metadata",
|
|
12334
|
-
"height": "80vh"
|
|
12334
|
+
"height": "80vh",
|
|
12335
|
+
"viewWidget": "SolidAiInteractionMetadataFieldFormWidget"
|
|
12335
12336
|
}
|
|
12336
12337
|
}
|
|
12337
12338
|
]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai-interaction.service.d.ts","sourceRoot":"","sources":["../../src/services/ai-interaction.service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAEpD,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAC3E,OAAO,EAAE,qBAAqB,EAAE,MAAM,sCAAsC,CAAC;AAC7E,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAErE,OAAO,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAElE,OAAO,EAAE,WAAW,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AACtE,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AAGtE,OAAO,EAAE,6BAA6B,EAAE,MAAM,wEAAwE,CAAC;AAEvH,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAElE,qBACa,oBAAqB,SAAQ,WAAW,CAAC,aAAa,CAAC;IAIhE,QAAQ,CAAC,oBAAoB,EAAE,oBAAoB;IACnD,QAAQ,CAAC,qBAAqB,EAAE,qBAAqB;IACrD,QAAQ,CAAC,aAAa,EAAE,aAAa;IACrC,QAAQ,CAAC,WAAW,EAAE,WAAW;IACjC,QAAQ,CAAC,gBAAgB,EAAE,gBAAgB;IAC3C,QAAQ,CAAC,iBAAiB,EAAE,iBAAiB;IAE7C,QAAQ,CAAC,aAAa,EAAE,aAAa;IAErC,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC,aAAa,CAAC;IACxC,QAAQ,CAAC,SAAS,EAAE,SAAS;IAC7B,QAAQ,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,uBAAuB,CAAC;IAEpE,QAAQ,CAAC,6BAA6B,EAAE,6BAA6B;IAhBvE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAyC;gBAGrD,oBAAoB,EAAE,oBAAoB,EAC1C,qBAAqB,EAAE,qBAAqB,EAC5C,aAAa,EAAE,aAAa,EAC5B,WAAW,EAAE,WAAW,EACxB,gBAAgB,EAAE,gBAAgB,EAClC,iBAAiB,EAAE,iBAAiB,EAEpC,aAAa,EAAE,aAAa,EAE5B,IAAI,EAAE,UAAU,CAAC,aAAa,CAAC,EAC/B,SAAS,EAAE,SAAS,EACpB,gBAAgB,EAAE,gBAAgB,CAAC,uBAAuB,CAAC,EAE3D,6BAA6B,EAAE,6BAA6B;IAMjE,mBAAmB,CAAC,GAAG,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAE,OAAe,EAAE,QAAQ,GAAE,MAAa,GAAG,OAAO,CAAC,GAAG,CAAC;IAqChI,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"ai-interaction.service.d.ts","sourceRoot":"","sources":["../../src/services/ai-interaction.service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAEpD,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAC3E,OAAO,EAAE,qBAAqB,EAAE,MAAM,sCAAsC,CAAC;AAC7E,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAErE,OAAO,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAElE,OAAO,EAAE,WAAW,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AACtE,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AAGtE,OAAO,EAAE,6BAA6B,EAAE,MAAM,wEAAwE,CAAC;AAEvH,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAElE,qBACa,oBAAqB,SAAQ,WAAW,CAAC,aAAa,CAAC;IAIhE,QAAQ,CAAC,oBAAoB,EAAE,oBAAoB;IACnD,QAAQ,CAAC,qBAAqB,EAAE,qBAAqB;IACrD,QAAQ,CAAC,aAAa,EAAE,aAAa;IACrC,QAAQ,CAAC,WAAW,EAAE,WAAW;IACjC,QAAQ,CAAC,gBAAgB,EAAE,gBAAgB;IAC3C,QAAQ,CAAC,iBAAiB,EAAE,iBAAiB;IAE7C,QAAQ,CAAC,aAAa,EAAE,aAAa;IAErC,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC,aAAa,CAAC;IACxC,QAAQ,CAAC,SAAS,EAAE,SAAS;IAC7B,QAAQ,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,uBAAuB,CAAC;IAEpE,QAAQ,CAAC,6BAA6B,EAAE,6BAA6B;IAhBvE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAyC;gBAGrD,oBAAoB,EAAE,oBAAoB,EAC1C,qBAAqB,EAAE,qBAAqB,EAC5C,aAAa,EAAE,aAAa,EAC5B,WAAW,EAAE,WAAW,EACxB,gBAAgB,EAAE,gBAAgB,EAClC,iBAAiB,EAAE,iBAAiB,EAEpC,aAAa,EAAE,aAAa,EAE5B,IAAI,EAAE,UAAU,CAAC,aAAa,CAAC,EAC/B,SAAS,EAAE,SAAS,EACpB,gBAAgB,EAAE,gBAAgB,CAAC,uBAAuB,CAAC,EAE3D,6BAA6B,EAAE,6BAA6B;IAMjE,mBAAmB,CAAC,GAAG,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAE,OAAe,EAAE,QAAQ,GAAE,MAAa,GAAG,OAAO,CAAC,GAAG,CAAC;IAqChI,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IA+FxD,aAAa,CAAC,QAAQ,EAAE,MAAM;IAexB,uBAAuB,CAAC,EAAE,EAAE,MAAM;CAiDzC"}
|
|
@@ -154,6 +154,7 @@ let AiInteractionService = AiInteractionService_1 = class AiInteractionService e
|
|
|
154
154
|
}
|
|
155
155
|
catch (ex) {
|
|
156
156
|
this.logger.warn(`Attempting to parse mcp client response assuming it is JSON, however it is not: ${parsedResponse}`);
|
|
157
|
+
raw.success = false;
|
|
157
158
|
}
|
|
158
159
|
const enrichedRaw = {
|
|
159
160
|
...raw,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai-interaction.service.js","sourceRoot":"","sources":["../../src/services/ai-interaction.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { BadRequestException, Logger, Injectable } from '@nestjs/common';\nimport { InjectEntityManager, InjectRepository } from '@nestjs/typeorm';\nimport { DiscoveryService, ModuleRef } from \"@nestjs/core\";\nimport { EntityManager, Repository } 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 { spawn } from 'child_process';\nimport { AiInteraction } from '../entities/ai-interaction.entity';\nimport * as fs from 'fs/promises';\nimport { McpResponse, TriggerMcpClientOptions } from 'src/interfaces';\nimport { PublisherFactory } from './queues/publisher-factory.service';\nimport { RequestContextService } from './request-context.service';\nimport { ActiveUserData } from 'src/interfaces/active-user-data.interface';\nimport { McpToolResponseHandlerFactory } from './mcp-tool-response-handlers/mcp-tool-response-handler-factory.service';\nimport { ERROR_MESSAGES } from 'src/constants/error-messages';\nimport { InvokeAiPromptDto } from 'src/dtos/invoke-ai-prompt.dto';\n\n@Injectable()\nexport class AiInteractionService extends CRUDService<AiInteraction> {\n private readonly logger = new Logger(AiInteractionService.name);\n\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(AiInteraction, 'default')\n readonly repo: Repository<AiInteraction>,\n readonly moduleRef: ModuleRef,\n readonly publisherFactory: PublisherFactory<TriggerMcpClientOptions>,\n // readonly requestContextService: RequestContextService,\n readonly mcpToolResponseHandlerFactory: McpToolResponseHandlerFactory,\n\n ) {\n super(modelMetadataService, moduleMetadataService, configService, fileService, discoveryService, crudHelperService, entityManager, repo, 'aiInteraction', 'solid-core', moduleRef);\n }\n\n async triggerMcpClientJob(dto: InvokeAiPromptDto, userId: number, isAutoApply: boolean = false, threadId: string = null): Promise<any> {\n // const activeUser: ActiveUserData = this.requestContextService.getActiveUser();\n\n const aiInteraction = await this.create({\n userId: userId,\n threadId: threadId ? threadId : `thread-${userId}`,\n role: 'human',\n message: dto.prompt,\n contentType: '',\n errorMessage: '',\n modelUsed: '',\n responseTimeMs: 0,\n metadata: '',\n isAutoApply: isAutoApply\n });\n const m = {\n payload: {\n aiInteractionId: aiInteraction.id,\n moduleName:dto.moduleName\n },\n parentEntity: 'aiInteraction',\n parentEntityId: aiInteraction.id,\n };\n\n const queueMessageId = await this.publisherFactory.publish(m, 'TriggerMcpClientPublisher');\n\n return {\n queueMessageId: queueMessageId,\n aiInteractionId: aiInteraction.id\n }\n }\n\n /**\n * Runs the Python MCP client with a prompt and returns the parsed JSON embedded in the 'response'.\n * @param prompt - The question or instruction to send to the MCP client.\n * @returns The parsed object inside the 'response' field of the JSON output.\n */\n async runMcpPrompt(prompt: string): Promise<McpResponse> {\n const pythonExecutable = process.env.MCP_PYTHON_EXECUTABLE;\n const mcpClient = process.env.MCP_CLIENT;\n\n // TODO: We can return an error if the above env variables are not properly setup...\n if (!pythonExecutable || !mcpClient) {\n throw new BadRequestException(ERROR_MESSAGES.PYTHON_EXECUTABLE_NOT_CONFIGURED);\n }\n\n // Check if both paths are valid and accessible\n try {\n const [pyStat, clientStat] = await Promise.all([\n fs.stat(pythonExecutable),\n fs.stat(mcpClient),\n ]);\n\n if (!pyStat.isFile()) {\n throw new BadRequestException(`MCP_PYTHON_EXECUTABLE path is not a file: ${pythonExecutable}`);\n }\n\n if (!clientStat.isFile()) {\n throw new BadRequestException(`MCP_CLIENT path is not a file: ${mcpClient}`);\n }\n\n } catch (err: any) {\n throw new BadRequestException(`Invalid MCP executable or client path: ${err.message}`);\n }\n\n // TODO: Refactor to use the command.service.ts instead...\n return new Promise((resolve, reject) => {\n this.logger.log(`Attempting to run command:`)\n this.logger.log(`${pythonExecutable} ${mcpClient} \"${prompt}\"`);\n\n const python = spawn(pythonExecutable, [mcpClient, `\"${prompt}\"`]);\n\n let stdout = '';\n let stderr = '';\n\n python.stdout.on('data', (data) => {\n stdout += data.toString();\n });\n\n python.stderr.on('data', (data) => {\n stderr += data.toString();\n });\n\n python.on('close', (code) => {\n this.logger.log(`Python script exited with code ${code}`);\n\n if (code !== 0) {\n this.logger.error(`Python script exited with a non-zero exit code: ${stderr}`);\n return reject(new Error(`Python script exited with a non-zero exit code: ${stderr}`));\n }\n\n try {\n this.logger.log(`Python script exited with zero exit code: ${stdout}`);\n const raw: McpResponse = JSON.parse(stdout);\n\n // Sometimes the raw.response might not be a valid json\n // TODO: examine the content type of the raw response..\n // if (raw.content_type==='json') {\n // }\n let parsedResponse = raw.response;\n try {\n parsedResponse = JSON.parse(raw.response);\n }\n catch (ex) {\n this.logger.warn(`Attempting to parse mcp client response assuming it is JSON, however it is not: ${parsedResponse}`);\n }\n // Parse the response string into an object\n // const parsedResponse = JSON.parse(raw.response);\n\n // Replace the string with the parsed object\n const enrichedRaw = {\n ...raw,\n response: parsedResponse,\n };\n // if (!raw.success) {\n // return reject(new Error(`MCP error: ${raw.errors?.join(', ')}`));\n // }\n // let cleaned = raw.response.trim();\n\n // Don't need to re-parse this...\n // const parsed = JSON.parse(cleaned);\n // resolve(cleaned);\n\n resolve(enrichedRaw);\n } catch (err: any) {\n reject(new Error(`Mcp Invocation Failed: ${err.message}`));\n }\n });\n });\n }\n\n cleanResponse(response: string) {\n this.logger.log(`mcp server response is: ${response}`);\n\n // Remove markdown-style code block wrapper\n if (response.startsWith('```json')) {\n response = response.replace(/^```json/, '').trim();\n }\n if (response.endsWith('```')) {\n response = response.replace(/```$/, '').trim();\n }\n this.logger.log(`mcp server response after removing doc tags is: ${response}`);\n\n return response;\n }\n\n async applySolidAiInteraction(id: number) {\n // Fetch the aiInteraction\n const aiInteraction = await this.findOne(id, {\n populate: ['user']\n });\n if (!aiInteraction) {\n const m = `Unable to identified the aiInteraction entry that triggered this job... using id: ${id}`\n\n // TODO: RESPONSE SHAPE ALERT Check if we want to control the shape of the response....\n throw new Error(m);\n }\n\n // TODO: Validation: Check if JSON.parse(metadata).tools_invoked starts with solid_\n let metadata = {};\n try {\n metadata = JSON.parse(aiInteraction.metadata);\n }\n catch (e) {\n // TODO: RESPONSE SHAPE ALERT Check if we want to control the shape of the response....\n throw new Error(e);\n }\n\n const toolsInvoked = metadata['tools_invoked'];\n if (!toolsInvoked) {\n // TODO: RESPONSE SHAPE ALERT Check if we want to control the shape of the response....\n throw new Error(ERROR_MESSAGES.UNABLE_TO_RESOLVE_SOLID_COMMAND);\n }\n\n // TODO: OPTIMISATION for chained tool invocation, for now we are assuming only 1 tool was used.\n const toolInvoked = toolsInvoked[0];\n\n // TODO: use the toolInvoked to identify a service using some convention.\n // TODO: Eg. if toolInvoked is solid_create_module <> SolidCreateModuleMcpToolHandler ... create a factory class to do this mapping and identify the relevant provider. \n const mcpToolHandler = this.mcpToolResponseHandlerFactory.getInstance(toolInvoked);\n if (!mcpToolHandler) {\n // TODO: RESPONSE SHAPE ALERT Check if we want to control the shape of the response....\n throw new Error(ERROR_MESSAGES.UNABLE_TO_RESOLVE_MCP_HANDLER);\n }\n\n const handlerApplicationResponse = await mcpToolHandler.apply(aiInteraction);\n\n // TODO: This provider to implement an interface - IMcpToolResponseHandler ... apply(aiInteraction: AiInteraction)\n // throw new Error('Method not implemented.');\n\n // Mark the interaction as applied\n await this.update(aiInteraction.id, { isApplied: true }, [], true);\n\n return handlerApplicationResponse;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"ai-interaction.service.js","sourceRoot":"","sources":["../../src/services/ai-interaction.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { BadRequestException, Logger, Injectable } from '@nestjs/common';\nimport { InjectEntityManager, InjectRepository } from '@nestjs/typeorm';\nimport { DiscoveryService, ModuleRef } from \"@nestjs/core\";\nimport { EntityManager, Repository } 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 { spawn } from 'child_process';\nimport { AiInteraction } from '../entities/ai-interaction.entity';\nimport * as fs from 'fs/promises';\nimport { McpResponse, TriggerMcpClientOptions } from 'src/interfaces';\nimport { PublisherFactory } from './queues/publisher-factory.service';\nimport { RequestContextService } from './request-context.service';\nimport { ActiveUserData } from 'src/interfaces/active-user-data.interface';\nimport { McpToolResponseHandlerFactory } from './mcp-tool-response-handlers/mcp-tool-response-handler-factory.service';\nimport { ERROR_MESSAGES } from 'src/constants/error-messages';\nimport { InvokeAiPromptDto } from 'src/dtos/invoke-ai-prompt.dto';\n\n@Injectable()\nexport class AiInteractionService extends CRUDService<AiInteraction> {\n private readonly logger = new Logger(AiInteractionService.name);\n\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(AiInteraction, 'default')\n readonly repo: Repository<AiInteraction>,\n readonly moduleRef: ModuleRef,\n readonly publisherFactory: PublisherFactory<TriggerMcpClientOptions>,\n // readonly requestContextService: RequestContextService,\n readonly mcpToolResponseHandlerFactory: McpToolResponseHandlerFactory,\n\n ) {\n super(modelMetadataService, moduleMetadataService, configService, fileService, discoveryService, crudHelperService, entityManager, repo, 'aiInteraction', 'solid-core', moduleRef);\n }\n\n async triggerMcpClientJob(dto: InvokeAiPromptDto, userId: number, isAutoApply: boolean = false, threadId: string = null): Promise<any> {\n // const activeUser: ActiveUserData = this.requestContextService.getActiveUser();\n\n const aiInteraction = await this.create({\n userId: userId,\n threadId: threadId ? threadId : `thread-${userId}`,\n role: 'human',\n message: dto.prompt,\n contentType: '',\n errorMessage: '',\n modelUsed: '',\n responseTimeMs: 0,\n metadata: '',\n isAutoApply: isAutoApply\n });\n const m = {\n payload: {\n aiInteractionId: aiInteraction.id,\n moduleName:dto.moduleName\n },\n parentEntity: 'aiInteraction',\n parentEntityId: aiInteraction.id,\n };\n\n const queueMessageId = await this.publisherFactory.publish(m, 'TriggerMcpClientPublisher');\n\n return {\n queueMessageId: queueMessageId,\n aiInteractionId: aiInteraction.id\n }\n }\n\n /**\n * Runs the Python MCP client with a prompt and returns the parsed JSON embedded in the 'response'.\n * @param prompt - The question or instruction to send to the MCP client.\n * @returns The parsed object inside the 'response' field of the JSON output.\n */\n async runMcpPrompt(prompt: string): Promise<McpResponse> {\n const pythonExecutable = process.env.MCP_PYTHON_EXECUTABLE;\n const mcpClient = process.env.MCP_CLIENT;\n\n // TODO: We can return an error if the above env variables are not properly setup...\n if (!pythonExecutable || !mcpClient) {\n throw new BadRequestException(ERROR_MESSAGES.PYTHON_EXECUTABLE_NOT_CONFIGURED);\n }\n\n // Check if both paths are valid and accessible\n try {\n const [pyStat, clientStat] = await Promise.all([\n fs.stat(pythonExecutable),\n fs.stat(mcpClient),\n ]);\n\n if (!pyStat.isFile()) {\n throw new BadRequestException(`MCP_PYTHON_EXECUTABLE path is not a file: ${pythonExecutable}`);\n }\n\n if (!clientStat.isFile()) {\n throw new BadRequestException(`MCP_CLIENT path is not a file: ${mcpClient}`);\n }\n\n } catch (err: any) {\n throw new BadRequestException(`Invalid MCP executable or client path: ${err.message}`);\n }\n\n // TODO: Refactor to use the command.service.ts instead...\n return new Promise((resolve, reject) => {\n this.logger.log(`Attempting to run command:`)\n this.logger.log(`${pythonExecutable} ${mcpClient} \"${prompt}\"`);\n\n const python = spawn(pythonExecutable, [mcpClient, `\"${prompt}\"`]);\n\n let stdout = '';\n let stderr = '';\n\n python.stdout.on('data', (data) => {\n stdout += data.toString();\n });\n\n python.stderr.on('data', (data) => {\n stderr += data.toString();\n });\n\n python.on('close', (code) => {\n this.logger.log(`Python script exited with code ${code}`);\n\n if (code !== 0) {\n this.logger.error(`Python script exited with a non-zero exit code: ${stderr}`);\n return reject(new Error(`Python script exited with a non-zero exit code: ${stderr}`));\n }\n\n try {\n this.logger.log(`Python script exited with zero exit code: ${stdout}`);\n const raw: McpResponse = JSON.parse(stdout);\n\n // Sometimes the raw.response might not be a valid json\n // TODO: examine the content type of the raw response..\n // if (raw.content_type==='json') {\n // }\n let parsedResponse = raw.response;\n try {\n parsedResponse = JSON.parse(raw.response);\n }\n catch (ex) {\n this.logger.warn(`Attempting to parse mcp client response assuming it is JSON, however it is not: ${parsedResponse}`);\n raw.success = false\n }\n // Parse the response string into an object\n // const parsedResponse = JSON.parse(raw.response);\n\n // Replace the string with the parsed object\n const enrichedRaw = {\n ...raw,\n response: parsedResponse,\n };\n // if (!raw.success) {\n // return reject(new Error(`MCP error: ${raw.errors?.join(', ')}`));\n // }\n // let cleaned = raw.response.trim();\n\n // Don't need to re-parse this...\n // const parsed = JSON.parse(cleaned);\n // resolve(cleaned);\n\n resolve(enrichedRaw);\n } catch (err: any) {\n reject(new Error(`Mcp Invocation Failed: ${err.message}`));\n }\n });\n });\n }\n\n cleanResponse(response: string) {\n this.logger.log(`mcp server response is: ${response}`);\n\n // Remove markdown-style code block wrapper\n if (response.startsWith('```json')) {\n response = response.replace(/^```json/, '').trim();\n }\n if (response.endsWith('```')) {\n response = response.replace(/```$/, '').trim();\n }\n this.logger.log(`mcp server response after removing doc tags is: ${response}`);\n\n return response;\n }\n\n async applySolidAiInteraction(id: number) {\n // Fetch the aiInteraction\n const aiInteraction = await this.findOne(id, {\n populate: ['user']\n });\n if (!aiInteraction) {\n const m = `Unable to identified the aiInteraction entry that triggered this job... using id: ${id}`\n\n // TODO: RESPONSE SHAPE ALERT Check if we want to control the shape of the response....\n throw new Error(m);\n }\n\n // TODO: Validation: Check if JSON.parse(metadata).tools_invoked starts with solid_\n let metadata = {};\n try {\n metadata = JSON.parse(aiInteraction.metadata);\n }\n catch (e) {\n // TODO: RESPONSE SHAPE ALERT Check if we want to control the shape of the response....\n throw new Error(e);\n }\n\n const toolsInvoked = metadata['tools_invoked'];\n if (!toolsInvoked) {\n // TODO: RESPONSE SHAPE ALERT Check if we want to control the shape of the response....\n throw new Error(ERROR_MESSAGES.UNABLE_TO_RESOLVE_SOLID_COMMAND);\n }\n\n // TODO: OPTIMISATION for chained tool invocation, for now we are assuming only 1 tool was used.\n const toolInvoked = toolsInvoked[0];\n\n // TODO: use the toolInvoked to identify a service using some convention.\n // TODO: Eg. if toolInvoked is solid_create_module <> SolidCreateModuleMcpToolHandler ... create a factory class to do this mapping and identify the relevant provider. \n const mcpToolHandler = this.mcpToolResponseHandlerFactory.getInstance(toolInvoked);\n if (!mcpToolHandler) {\n // TODO: RESPONSE SHAPE ALERT Check if we want to control the shape of the response....\n throw new Error(ERROR_MESSAGES.UNABLE_TO_RESOLVE_MCP_HANDLER);\n }\n\n const handlerApplicationResponse = await mcpToolHandler.apply(aiInteraction);\n\n // TODO: This provider to implement an interface - IMcpToolResponseHandler ... apply(aiInteraction: AiInteraction)\n // throw new Error('Method not implemented.');\n\n // Mark the interaction as applied\n await this.update(aiInteraction.id, { isApplied: true }, [], true);\n\n return handlerApplicationResponse;\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;
|
|
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"}
|
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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":"AACA,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE3D,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAEpD,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAC3E,OAAO,EAAE,qBAAqB,EAAE,MAAM,sCAAsC,CAAC;AAI7E,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,OAAO,EAAE,6BAA6B,EAAyC,MAAM,kCAAkC,CAAC;AAExH,OAAO,EAAE,yBAAyB,EAAE,MAAM,kDAAkD,CAAC;AAK7F,OAAO,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;AAC1E,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AAGpE,UAAU,sBAAsB;IAC9B,MAAM,EAAE,MAAM,CAAC,cAAc,CAAC;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,oBAAY,YAAY;IACtB,GAAG,QAAQ;IACX,KAAK,UAAU;CAChB;AAED,oBAAY,eAAe;IACzB,GAAG,aAAa;IAChB,KAAK,sEAAsE;CAC5E;AACD,MAAM,WAAW,iBAAiB;IAChC,wBAAwB,EAAE,wBAAwB,EAAE,CAAC;IACrD,gBAAgB,EAAE,mBAAmB,EAAE,CAAC;CACzC;AACD,MAAM,WAAW,wBAAwB;IACvC,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,sBAAsB,EAAE,MAAM,CAAC;CAChC;AACD,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,yBAAyB;IACxC,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC;CAC7B;AAOD,oBAAY,uBAAuB;IACjC,KAAK,UAAU;IACf,eAAe,oBAAoB;IACnC,cAAc,mBAAmB;IACjC,gBAAgB,qBAAqB;IACrC,aAAa,kBAAkB;CAChC;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;CACrB;AAMD,qBACa,wBAAyB,SAAQ,WAAW,CAAC,iBAAiB,CAAC;IAExE,QAAQ,CAAC,oBAAoB,EAAE,oBAAoB;IACnD,QAAQ,CAAC,qBAAqB,EAAE,qBAAqB;IACrD,QAAQ,CAAC,aAAa,EAAE,aAAa;IACrC,QAAQ,CAAC,WAAW,EAAE,WAAW;IACjC,QAAQ,CAAC,gBAAgB,EAAE,gBAAgB;IAC3C,QAAQ,CAAC,iBAAiB,EAAE,iBAAiB;IAE7C,QAAQ,CAAC,aAAa,EAAE,aAAa;IAErC,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC,iBAAiB,CAAC;IAC5C,QAAQ,CAAC,SAAS,EAAE,SAAS;IAC7B,QAAQ,CAAC,YAAY,EAAE,YAAY;IACnC,QAAQ,CAAC,UAAU,EAAE,UAAU;IAC/B,QAAQ,CAAC,WAAW,EAAE,WAAW;IACjC,QAAQ,CAAC,iBAAiB,EAAE,sBAAsB;gBAdzC,oBAAoB,EAAE,oBAAoB,EAC1C,qBAAqB,EAAE,qBAAqB,EAC5C,aAAa,EAAE,aAAa,EAC5B,WAAW,EAAE,WAAW,EACxB,gBAAgB,EAAE,gBAAgB,EAClC,iBAAiB,EAAE,iBAAiB,EAEpC,aAAa,EAAE,aAAa,EAE5B,IAAI,EAAE,UAAU,CAAC,iBAAiB,CAAC,EACnC,SAAS,EAAE,SAAS,EACpB,YAAY,EAAE,YAAY,EAC1B,UAAU,EAAE,UAAU,EACtB,WAAW,EAAE,WAAW,EACxB,iBAAiB,EAAE,sBAAsB;IAMpD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA6C;IAO9D,iBAAiB,CAAC,eAAe,EAAE,MAAM,EAAE,MAAM,GAAE,YAA+B,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAsCpH,qBAAqB,CAAC,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,6BAA6B,CAAC;IA8DtF,oBAAoB,CAAC,mBAAmB,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAuC7E,eAAe,CAAC,mBAAmB,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IA4B7E,gBAAgB,CAAC,mBAAmB,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAItD,2BAA2B,CAAC,mBAAmB,EAAE,MAAM;;;;;YA+D/C,sBAAsB;YAgBtB,qBAAqB;IAWnC,OAAO,CAAC,sBAAsB;YAchB,oBAAoB;IAkBlC,OAAO,CAAC,mBAAmB;YAQb,mBAAmB;YAkBnB,kBAAkB;YAuClB,aAAa;IAyBrB,mBAAmB,CAAC,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,GAAG;YAoBzF,YAAY;IAQ1B,OAAO,CAAC,eAAe;YAUT,0BAA0B;YAuB1B,mBAAmB;
|
|
1
|
+
{"version":3,"file":"import-transaction.service.d.ts","sourceRoot":"","sources":["../../src/services/import-transaction.service.ts"],"names":[],"mappings":"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"}
|