@solidxai/core 0.1.10-beta.26 → 0.1.10-beta.27

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (274) hide show
  1. package/.claude/settings.local.json +15 -0
  2. package/CLAUDE.md +26 -0
  3. package/ai-interaction-cleanup.sql +53 -0
  4. package/dist/controllers/service.controller.d.ts +1 -5
  5. package/dist/controllers/service.controller.d.ts.map +1 -1
  6. package/dist/controllers/service.controller.js +6 -11
  7. package/dist/controllers/service.controller.js.map +1 -1
  8. package/dist/controllers/test.controller.d.ts +1 -6
  9. package/dist/controllers/test.controller.d.ts.map +1 -1
  10. package/dist/controllers/test.controller.js +2 -20
  11. package/dist/controllers/test.controller.js.map +1 -1
  12. package/dist/dtos/create-permission-metadata.dto.d.ts.map +1 -1
  13. package/dist/dtos/create-permission-metadata.dto.js +2 -0
  14. package/dist/dtos/create-permission-metadata.dto.js.map +1 -1
  15. package/dist/dtos/create-role-metadata.dto.d.ts +2 -0
  16. package/dist/dtos/create-role-metadata.dto.d.ts.map +1 -1
  17. package/dist/dtos/create-role-metadata.dto.js +13 -1
  18. package/dist/dtos/create-role-metadata.dto.js.map +1 -1
  19. package/dist/dtos/import-instructions.dto.d.ts +2 -0
  20. package/dist/dtos/import-instructions.dto.d.ts.map +1 -1
  21. package/dist/dtos/import-instructions.dto.js +15 -1
  22. package/dist/dtos/import-instructions.dto.js.map +1 -1
  23. package/dist/dtos/update-permission-metadata.dto.d.ts.map +1 -1
  24. package/dist/dtos/update-permission-metadata.dto.js +3 -1
  25. package/dist/dtos/update-permission-metadata.dto.js.map +1 -1
  26. package/dist/dtos/update-role-metadata.dto.d.ts +2 -0
  27. package/dist/dtos/update-role-metadata.dto.d.ts.map +1 -1
  28. package/dist/dtos/update-role-metadata.dto.js +13 -1
  29. package/dist/dtos/update-role-metadata.dto.js.map +1 -1
  30. package/dist/entities/action-metadata.entity.d.ts.map +1 -1
  31. package/dist/entities/action-metadata.entity.js +1 -0
  32. package/dist/entities/action-metadata.entity.js.map +1 -1
  33. package/dist/entities/agent-event.entity.d.ts.map +1 -1
  34. package/dist/entities/agent-event.entity.js +1 -0
  35. package/dist/entities/agent-event.entity.js.map +1 -1
  36. package/dist/entities/agent-session.entity.d.ts.map +1 -1
  37. package/dist/entities/agent-session.entity.js +1 -0
  38. package/dist/entities/agent-session.entity.js.map +1 -1
  39. package/dist/entities/chatter-message.entity.d.ts.map +1 -1
  40. package/dist/entities/chatter-message.entity.js +2 -0
  41. package/dist/entities/chatter-message.entity.js.map +1 -1
  42. package/dist/entities/email-template.entity.d.ts.map +1 -1
  43. package/dist/entities/email-template.entity.js +1 -0
  44. package/dist/entities/email-template.entity.js.map +1 -1
  45. package/dist/entities/field-metadata.entity.d.ts.map +1 -1
  46. package/dist/entities/field-metadata.entity.js +4 -0
  47. package/dist/entities/field-metadata.entity.js.map +1 -1
  48. package/dist/entities/list-of-values.entity.d.ts.map +1 -1
  49. package/dist/entities/list-of-values.entity.js +4 -0
  50. package/dist/entities/list-of-values.entity.js.map +1 -1
  51. package/dist/entities/locale.entity.d.ts.map +1 -1
  52. package/dist/entities/locale.entity.js +1 -0
  53. package/dist/entities/locale.entity.js.map +1 -1
  54. package/dist/entities/media.entity.d.ts.map +1 -1
  55. package/dist/entities/media.entity.js +1 -0
  56. package/dist/entities/media.entity.js.map +1 -1
  57. package/dist/entities/menu-item-metadata.entity.d.ts.map +1 -1
  58. package/dist/entities/menu-item-metadata.entity.js +2 -0
  59. package/dist/entities/menu-item-metadata.entity.js.map +1 -1
  60. package/dist/entities/model-metadata.entity.d.ts.map +1 -1
  61. package/dist/entities/model-metadata.entity.js +3 -0
  62. package/dist/entities/model-metadata.entity.js.map +1 -1
  63. package/dist/entities/module-metadata.entity.d.ts.map +1 -1
  64. package/dist/entities/module-metadata.entity.js +2 -0
  65. package/dist/entities/module-metadata.entity.js.map +1 -1
  66. package/dist/entities/permission-metadata.entity.d.ts.map +1 -1
  67. package/dist/entities/permission-metadata.entity.js.map +1 -1
  68. package/dist/entities/role-metadata.entity.d.ts +2 -0
  69. package/dist/entities/role-metadata.entity.d.ts.map +1 -1
  70. package/dist/entities/role-metadata.entity.js +10 -2
  71. package/dist/entities/role-metadata.entity.js.map +1 -1
  72. package/dist/entities/saved-filters.entity.d.ts.map +1 -1
  73. package/dist/entities/saved-filters.entity.js +3 -0
  74. package/dist/entities/saved-filters.entity.js.map +1 -1
  75. package/dist/entities/scheduled-job.entity.d.ts.map +1 -1
  76. package/dist/entities/scheduled-job.entity.js +2 -0
  77. package/dist/entities/scheduled-job.entity.js.map +1 -1
  78. package/dist/entities/security-rule.entity.d.ts.map +1 -1
  79. package/dist/entities/security-rule.entity.js +1 -0
  80. package/dist/entities/security-rule.entity.js.map +1 -1
  81. package/dist/entities/sms-template.entity.d.ts.map +1 -1
  82. package/dist/entities/sms-template.entity.js +2 -0
  83. package/dist/entities/sms-template.entity.js.map +1 -1
  84. package/dist/entities/user-activity-history.entity.d.ts.map +1 -1
  85. package/dist/entities/user-activity-history.entity.js +1 -0
  86. package/dist/entities/user-activity-history.entity.js.map +1 -1
  87. package/dist/entities/user.entity.d.ts.map +1 -1
  88. package/dist/entities/user.entity.js +2 -0
  89. package/dist/entities/user.entity.js.map +1 -1
  90. package/dist/entities/view-metadata.entity.d.ts.map +1 -1
  91. package/dist/entities/view-metadata.entity.js +2 -0
  92. package/dist/entities/view-metadata.entity.js.map +1 -1
  93. package/dist/helpers/module.helper.js +0 -5
  94. package/dist/helpers/module.helper.js.map +1 -1
  95. package/dist/index.d.ts +0 -5
  96. package/dist/index.d.ts.map +1 -1
  97. package/dist/index.js +0 -5
  98. package/dist/index.js.map +1 -1
  99. package/dist/interfaces.d.ts +0 -8
  100. package/dist/interfaces.d.ts.map +1 -1
  101. package/dist/interfaces.js.map +1 -1
  102. package/dist/seeders/seed-data/solid-core-metadata.json +317 -814
  103. package/dist/services/crud-helper.service.d.ts.map +1 -1
  104. package/dist/services/crud-helper.service.js +11 -3
  105. package/dist/services/crud-helper.service.js.map +1 -1
  106. package/dist/services/import-transaction.service.d.ts.map +1 -1
  107. package/dist/services/import-transaction.service.js +6 -0
  108. package/dist/services/import-transaction.service.js.map +1 -1
  109. package/dist/solid-core.module.d.ts.map +1 -1
  110. package/dist/solid-core.module.js +0 -29
  111. package/dist/solid-core.module.js.map +1 -1
  112. package/dist/subscribers/scheduled-job.subscriber.js +1 -1
  113. package/dist/subscribers/scheduled-job.subscriber.js.map +1 -1
  114. package/dist/subscribers/security-rule.subscriber.js +1 -1
  115. package/dist/subscribers/security-rule.subscriber.js.map +1 -1
  116. package/package.json +4 -4
  117. package/src/controllers/service.controller.ts +4 -7
  118. package/src/controllers/test.controller.ts +0 -9
  119. package/src/dtos/create-permission-metadata.dto.ts +3 -0
  120. package/src/dtos/create-role-metadata.dto.ts +11 -1
  121. package/src/dtos/import-instructions.dto.ts +11 -1
  122. package/src/dtos/update-permission-metadata.dto.ts +4 -1
  123. package/src/dtos/update-role-metadata.dto.ts +21 -1
  124. package/src/entities/action-metadata.entity.ts +1 -0
  125. package/src/entities/agent-event.entity.ts +1 -0
  126. package/src/entities/agent-session.entity.ts +1 -0
  127. package/src/entities/chatter-message.entity.ts +2 -0
  128. package/src/entities/email-template.entity.ts +1 -0
  129. package/src/entities/field-metadata.entity.ts +4 -1
  130. package/src/entities/list-of-values.entity.ts +5 -1
  131. package/src/entities/locale.entity.ts +1 -0
  132. package/src/entities/media.entity.ts +1 -0
  133. package/src/entities/menu-item-metadata.entity.ts +2 -0
  134. package/src/entities/model-metadata.entity.ts +3 -0
  135. package/src/entities/module-metadata.entity.ts +2 -0
  136. package/src/entities/permission-metadata.entity.ts +2 -2
  137. package/src/entities/role-metadata.entity.ts +11 -3
  138. package/src/entities/saved-filters.entity.ts +3 -0
  139. package/src/entities/scheduled-job.entity.ts +2 -0
  140. package/src/entities/security-rule.entity.ts +1 -0
  141. package/src/entities/sms-template.entity.ts +2 -0
  142. package/src/entities/user-activity-history.entity.ts +1 -0
  143. package/src/entities/user.entity.ts +2 -0
  144. package/src/entities/view-metadata.entity.ts +2 -0
  145. package/src/helpers/module.helper.ts +5 -5
  146. package/src/index.ts +0 -5
  147. package/src/interfaces.ts +0 -8
  148. package/src/seeders/seed-data/solid-core-metadata.json +317 -814
  149. package/src/services/1.js +6 -0
  150. package/src/services/crud-helper.service.ts +9 -3
  151. package/src/services/import-transaction.service.ts +11 -1
  152. package/src/solid-core.module.ts +0 -31
  153. package/src/subscribers/scheduled-job.subscriber.ts +1 -1
  154. package/src/subscribers/security-rule.subscriber.ts +1 -1
  155. package/dist/commands/ingest.command.d.ts +0 -16
  156. package/dist/commands/ingest.command.d.ts.map +0 -1
  157. package/dist/commands/ingest.command.js +0 -50
  158. package/dist/commands/ingest.command.js.map +0 -1
  159. package/dist/controllers/ai-interaction.controller.d.ts +0 -29
  160. package/dist/controllers/ai-interaction.controller.d.ts.map +0 -1
  161. package/dist/controllers/ai-interaction.controller.js +0 -218
  162. package/dist/controllers/ai-interaction.controller.js.map +0 -1
  163. package/dist/dtos/create-ai-interaction.dto.d.ts +0 -23
  164. package/dist/dtos/create-ai-interaction.dto.d.ts.map +0 -1
  165. package/dist/dtos/create-ai-interaction.dto.js +0 -149
  166. package/dist/dtos/create-ai-interaction.dto.js.map +0 -1
  167. package/dist/dtos/invoke-ai-prompt.dto.d.ts +0 -5
  168. package/dist/dtos/invoke-ai-prompt.dto.d.ts.map +0 -1
  169. package/dist/dtos/invoke-ai-prompt.dto.js +0 -30
  170. package/dist/dtos/invoke-ai-prompt.dto.js.map +0 -1
  171. package/dist/dtos/update-ai-interaction.dto.d.ts +0 -24
  172. package/dist/dtos/update-ai-interaction.dto.d.ts.map +0 -1
  173. package/dist/dtos/update-ai-interaction.dto.js +0 -150
  174. package/dist/dtos/update-ai-interaction.dto.js.map +0 -1
  175. package/dist/entities/ai-interaction.entity.d.ts +0 -24
  176. package/dist/entities/ai-interaction.entity.d.ts.map +0 -1
  177. package/dist/entities/ai-interaction.entity.js +0 -116
  178. package/dist/entities/ai-interaction.entity.js.map +0 -1
  179. package/dist/jobs/database/trigger-mcp-client-publisher-database.service.d.ts +0 -11
  180. package/dist/jobs/database/trigger-mcp-client-publisher-database.service.d.ts.map +0 -1
  181. package/dist/jobs/database/trigger-mcp-client-publisher-database.service.js +0 -39
  182. package/dist/jobs/database/trigger-mcp-client-publisher-database.service.js.map +0 -1
  183. package/dist/jobs/database/trigger-mcp-client-queue-options.d.ts +0 -8
  184. package/dist/jobs/database/trigger-mcp-client-queue-options.d.ts.map +0 -1
  185. package/dist/jobs/database/trigger-mcp-client-queue-options.js +0 -10
  186. package/dist/jobs/database/trigger-mcp-client-queue-options.js.map +0 -1
  187. package/dist/jobs/database/trigger-mcp-client-subscriber-database.service.d.ts +0 -25
  188. package/dist/jobs/database/trigger-mcp-client-subscriber-database.service.d.ts.map +0 -1
  189. package/dist/jobs/database/trigger-mcp-client-subscriber-database.service.js +0 -222
  190. package/dist/jobs/database/trigger-mcp-client-subscriber-database.service.js.map +0 -1
  191. package/dist/jobs/rabbitmq/trigger-mcp-client-publisher.service.d.ts +0 -11
  192. package/dist/jobs/rabbitmq/trigger-mcp-client-publisher.service.d.ts.map +0 -1
  193. package/dist/jobs/rabbitmq/trigger-mcp-client-publisher.service.js +0 -39
  194. package/dist/jobs/rabbitmq/trigger-mcp-client-publisher.service.js.map +0 -1
  195. package/dist/jobs/rabbitmq/trigger-mcp-client-queue-options.d.ts +0 -8
  196. package/dist/jobs/rabbitmq/trigger-mcp-client-queue-options.d.ts.map +0 -1
  197. package/dist/jobs/rabbitmq/trigger-mcp-client-queue-options.js +0 -10
  198. package/dist/jobs/rabbitmq/trigger-mcp-client-queue-options.js.map +0 -1
  199. package/dist/jobs/rabbitmq/trigger-mcp-client-subscriber.service.d.ts +0 -18
  200. package/dist/jobs/rabbitmq/trigger-mcp-client-subscriber.service.d.ts.map +0 -1
  201. package/dist/jobs/rabbitmq/trigger-mcp-client-subscriber.service.js +0 -103
  202. package/dist/jobs/rabbitmq/trigger-mcp-client-subscriber.service.js.map +0 -1
  203. package/dist/jobs/redis/trigger-mcp-client-publisher-redis.service.d.ts +0 -11
  204. package/dist/jobs/redis/trigger-mcp-client-publisher-redis.service.d.ts.map +0 -1
  205. package/dist/jobs/redis/trigger-mcp-client-publisher-redis.service.js +0 -39
  206. package/dist/jobs/redis/trigger-mcp-client-publisher-redis.service.js.map +0 -1
  207. package/dist/jobs/redis/trigger-mcp-client-queue-options-redis.d.ts +0 -8
  208. package/dist/jobs/redis/trigger-mcp-client-queue-options-redis.d.ts.map +0 -1
  209. package/dist/jobs/redis/trigger-mcp-client-queue-options-redis.js +0 -10
  210. package/dist/jobs/redis/trigger-mcp-client-queue-options-redis.js.map +0 -1
  211. package/dist/jobs/redis/trigger-mcp-client-subscriber-redis.service.d.ts +0 -18
  212. package/dist/jobs/redis/trigger-mcp-client-subscriber-redis.service.d.ts.map +0 -1
  213. package/dist/jobs/redis/trigger-mcp-client-subscriber-redis.service.js +0 -103
  214. package/dist/jobs/redis/trigger-mcp-client-subscriber-redis.service.js.map +0 -1
  215. package/dist/repository/ai-interaction.repository.d.ts +0 -12
  216. package/dist/repository/ai-interaction.repository.d.ts.map +0 -1
  217. package/dist/repository/ai-interaction.repository.js +0 -34
  218. package/dist/repository/ai-interaction.repository.js.map +0 -1
  219. package/dist/services/ai-interaction.service.d.ts +0 -23
  220. package/dist/services/ai-interaction.service.d.ts.map +0 -1
  221. package/dist/services/ai-interaction.service.js +0 -217
  222. package/dist/services/ai-interaction.service.js.map +0 -1
  223. package/dist/services/genai/ingest-metadata.service.d.ts +0 -38
  224. package/dist/services/genai/ingest-metadata.service.d.ts.map +0 -1
  225. package/dist/services/genai/ingest-metadata.service.js +0 -542
  226. package/dist/services/genai/ingest-metadata.service.js.map +0 -1
  227. package/dist/services/genai/mcp-handlers/mcp-handler-factory.service.d.ts +0 -9
  228. package/dist/services/genai/mcp-handlers/mcp-handler-factory.service.d.ts.map +0 -1
  229. package/dist/services/genai/mcp-handlers/mcp-handler-factory.service.js +0 -39
  230. package/dist/services/genai/mcp-handlers/mcp-handler-factory.service.js.map +0 -1
  231. package/dist/services/genai/r2r-helper.service.d.ts +0 -9
  232. package/dist/services/genai/r2r-helper.service.d.ts.map +0 -1
  233. package/dist/services/genai/r2r-helper.service.js +0 -40
  234. package/dist/services/genai/r2r-helper.service.js.map +0 -1
  235. package/dist-tests/api/authenticate.spec.js +0 -119
  236. package/dist-tests/api/authenticate.spec.js.map +0 -1
  237. package/dist-tests/api/crud-service.findOne.cityMaster.spec.js +0 -97
  238. package/dist-tests/api/crud-service.findOne.cityMaster.spec.js.map +0 -1
  239. package/dist-tests/api/ping.spec.js +0 -21
  240. package/dist-tests/api/ping.spec.js.map +0 -1
  241. package/dist-tests/helpers/auth.js +0 -41
  242. package/dist-tests/helpers/auth.js.map +0 -1
  243. package/dist-tests/helpers/env.js +0 -11
  244. package/dist-tests/helpers/env.js.map +0 -1
  245. package/docs/dashboards/AGENTIC_DASHBOARD_IMPLEMENTATION_PLAN.md +0 -438
  246. package/docs/dashboards/dashboard-curl-smoke-tests.txt +0 -146
  247. package/docs/dashboards/delete-legacy-dashboard-metadata.sql +0 -172
  248. package/docs/grouping-enhancements.md +0 -89
  249. package/docs/java-spring/README.md +0 -3
  250. package/docs/java-spring/solid-core-module-deep-dive-report.md +0 -1317
  251. package/docs/module-package-import-handoff.md +0 -691
  252. package/docs/seed-changes.md +0 -65
  253. package/docs/test-data-workflow.md +0 -200
  254. package/docs/type-declaration-import-issue.md +0 -24
  255. package/src/commands/ingest.command.ts +0 -36
  256. package/src/controllers/ai-interaction.controller.ts +0 -112
  257. package/src/dtos/create-ai-interaction.dto.ts +0 -89
  258. package/src/dtos/invoke-ai-prompt.dto.ts +0 -10
  259. package/src/dtos/update-ai-interaction.dto.ts +0 -93
  260. package/src/entities/ai-interaction.entity.ts +0 -71
  261. package/src/jobs/database/trigger-mcp-client-publisher-database.service.ts +0 -22
  262. package/src/jobs/database/trigger-mcp-client-queue-options.ts +0 -9
  263. package/src/jobs/database/trigger-mcp-client-subscriber-database.service.ts +0 -278
  264. package/src/jobs/rabbitmq/trigger-mcp-client-publisher.service.ts +0 -22
  265. package/src/jobs/rabbitmq/trigger-mcp-client-queue-options.ts +0 -9
  266. package/src/jobs/rabbitmq/trigger-mcp-client-subscriber.service.ts +0 -104
  267. package/src/jobs/redis/trigger-mcp-client-publisher-redis.service.ts +0 -23
  268. package/src/jobs/redis/trigger-mcp-client-queue-options-redis.ts +0 -9
  269. package/src/jobs/redis/trigger-mcp-client-subscriber-redis.service.ts +0 -98
  270. package/src/repository/ai-interaction.repository.ts +0 -17
  271. package/src/services/ai-interaction.service.ts +0 -239
  272. package/src/services/genai/ingest-metadata.service.ts +0 -798
  273. package/src/services/genai/mcp-handlers/mcp-handler-factory.service.ts +0 -33
  274. package/src/services/genai/r2r-helper.service.ts +0 -37
@@ -1,239 +0,0 @@
1
- import { BadRequestException, Injectable, Logger } from '@nestjs/common';
2
- import { ModuleRef } from "@nestjs/core";
3
- import { InjectEntityManager } from '@nestjs/typeorm';
4
- import { EntityManager } from 'typeorm';
5
- import type { SolidCoreSetting } from "src/services/settings/default-settings-provider.service";
6
-
7
- import { spawn } from 'child_process';
8
- import * as fs from 'fs/promises';
9
- import { ERROR_MESSAGES } from 'src/constants/error-messages';
10
- import { InvokeAiPromptDto } from 'src/dtos/invoke-ai-prompt.dto';
11
- import { McpResponse, TriggerMcpClientOptions } from 'src/interfaces';
12
- import { AiInteractionRepository } from 'src/repository/ai-interaction.repository';
13
- import { CRUDService } from 'src/services/crud.service';
14
- import { AiInteraction } from '../entities/ai-interaction.entity';
15
- import { McpHandlerFactory } from './genai/mcp-handlers/mcp-handler-factory.service';
16
- import { PublisherFactory } from './queues/publisher-factory.service';
17
-
18
- @Injectable()
19
- export class AiInteractionService extends CRUDService<AiInteraction> {
20
- private readonly logger = new Logger(AiInteractionService.name);
21
-
22
- constructor(
23
- @InjectEntityManager()
24
- readonly entityManager: EntityManager,
25
- // @InjectRepository(AiInteraction, 'default')
26
- // readonly repo: Repository<AiInteraction>,
27
- readonly repo: AiInteractionRepository,
28
- readonly moduleRef: ModuleRef,
29
- readonly publisherFactory: PublisherFactory<TriggerMcpClientOptions>,
30
- // readonly requestContextService: RequestContextService,
31
- readonly mcpHandlerFactory: McpHandlerFactory,
32
-
33
- ) {
34
- super(entityManager, repo, 'aiInteraction', 'solid-core', moduleRef);
35
- }
36
-
37
- async triggerMcpClientJob(dto: InvokeAiPromptDto, userId: number, isAutoApply: boolean = false, threadId: string = null): Promise<any> {
38
- // const activeUser: ActiveUserData = this.requestContextService.getActiveUser();
39
-
40
- const aiInteraction = await this.create({
41
- userId: userId,
42
- threadId: threadId ? threadId : `thread-${userId}`,
43
- role: 'human',
44
- message: dto.prompt,
45
- contentType: '',
46
- errorMessage: '',
47
- modelUsed: '',
48
- responseTimeMs: 0,
49
- metadata: '',
50
- isAutoApply: isAutoApply
51
- });
52
- const m = {
53
- payload: {
54
- aiInteractionId: aiInteraction.id,
55
- moduleName: dto.moduleName
56
- },
57
- parentEntity: 'aiInteraction',
58
- parentEntityId: aiInteraction.id,
59
- };
60
-
61
- const queueMessageId = await this.publisherFactory.publish(m, 'TriggerMcpClientPublisher');
62
-
63
- return {
64
- queueMessageId: queueMessageId,
65
- aiInteractionId: aiInteraction.id
66
- }
67
- }
68
-
69
- /**
70
- * Runs the Python MCP client with a prompt and returns the parsed JSON embedded in the 'response'.
71
- * @param prompt - The question or instruction to send to the MCP client.
72
- * @returns The parsed object inside the 'response' field of the JSON output.
73
- */
74
- async runMcpPrompt(prompt: string): Promise<McpResponse> {
75
- const pythonExecutable = this.settingService.getConfigValue<SolidCoreSetting>('mcpPythonExecutable');
76
- const mcpClient = this.settingService.getConfigValue<SolidCoreSetting>('mcpClient');
77
-
78
- // TODO: We can return an error if the above env variables are not properly setup...
79
- if (!pythonExecutable || !mcpClient) {
80
- throw new BadRequestException(ERROR_MESSAGES.PYTHON_EXECUTABLE_NOT_CONFIGURED);
81
- }
82
-
83
- // Check if both paths are valid and accessible
84
- try {
85
- const [pyStat, clientStat] = await Promise.all([
86
- fs.stat(pythonExecutable),
87
- fs.stat(mcpClient),
88
- ]);
89
-
90
- if (!pyStat.isFile()) {
91
- throw new BadRequestException(`MCP_PYTHON_EXECUTABLE path is not a file: ${pythonExecutable}`);
92
- }
93
-
94
- if (!clientStat.isFile()) {
95
- throw new BadRequestException(`MCP_CLIENT path is not a file: ${mcpClient}`);
96
- }
97
-
98
- } catch (err: any) {
99
- throw new BadRequestException(`Invalid MCP executable or client path: ${err.message}`);
100
- }
101
-
102
- // TODO: Refactor to use the command.service.ts instead...
103
- return new Promise((resolve, reject) => {
104
- this.logger.log(`Attempting to run command:`)
105
- this.logger.log(`${pythonExecutable} ${mcpClient} "${prompt}"`);
106
-
107
- const python = spawn(pythonExecutable, [mcpClient, `"${prompt}"`]);
108
-
109
- let stdout = '';
110
- let stderr = '';
111
-
112
- python.stdout.on('data', (data) => {
113
- stdout += data.toString();
114
- });
115
-
116
- python.stderr.on('data', (data) => {
117
- stderr += data.toString();
118
- });
119
-
120
- python.on('close', (code) => {
121
- this.logger.log(`Python script exited with code ${code}`);
122
-
123
- if (code !== 0) {
124
- this.logger.error(`Python script exited with a non-zero exit code: ${stderr}`);
125
- return reject(new Error(`Python script exited with a non-zero exit code: ${stderr}`));
126
- }
127
-
128
- try {
129
- this.logger.log(`Python script exited with zero exit code: ${stdout}`);
130
- const raw: McpResponse = JSON.parse(stdout);
131
-
132
- // Sometimes the raw.response might not be a valid json
133
- // TODO: examine the content type of the raw response..
134
- // if (raw.content_type==='json') {
135
- // }
136
- let parsedResponse = raw.response;
137
- try {
138
- parsedResponse = JSON.parse(raw.response);
139
- }
140
- catch (ex) {
141
- this.logger.warn(`Attempting to parse mcp client response assuming it is JSON, however it is not: ${parsedResponse}`);
142
- // raw.success = false
143
- }
144
- // Parse the response string into an object
145
- // const parsedResponse = JSON.parse(raw.response);
146
-
147
- // Replace the string with the parsed object
148
- const enrichedRaw = {
149
- ...raw,
150
- response: parsedResponse,
151
- };
152
- // if (!raw.success) {
153
- // return reject(new Error(`MCP error: ${raw.errors?.join(', ')}`));
154
- // }
155
- // let cleaned = raw.response.trim();
156
-
157
- // Don't need to re-parse this...
158
- // const parsed = JSON.parse(cleaned);
159
- // resolve(cleaned);
160
-
161
- resolve(enrichedRaw);
162
- } catch (err: any) {
163
- reject(new Error(`Mcp Invocation Failed: ${err.message}`));
164
- }
165
- });
166
- });
167
- }
168
-
169
- cleanResponse(response: string) {
170
- this.logger.log(`mcp server response is: ${response}`);
171
-
172
- // Remove markdown-style code block wrapper
173
- if (response.startsWith('```json')) {
174
- response = response.replace(/^```json/, '').trim();
175
- }
176
- if (response.endsWith('```')) {
177
- response = response.replace(/```$/, '').trim();
178
- }
179
- this.logger.log(`mcp server response after removing doc tags is: ${response}`);
180
-
181
- return response;
182
- }
183
-
184
- async applySolidAiInteraction(id: number) {
185
- // Fetch the aiInteraction
186
- const aiInteraction = await this.findOne(id, {
187
- populate: ['user']
188
- });
189
- if (!aiInteraction) {
190
- const m = `Unable to identified the aiInteraction entry that triggered this job... using id: ${id}`
191
-
192
- // TODO: RESPONSE SHAPE ALERT Check if we want to control the shape of the response....
193
- throw new Error(m);
194
- }
195
-
196
- // TODO: Validation: Check if JSON.parse(metadata).tools_invoked starts with solid_
197
- let metadata: any = {};
198
- try {
199
- if (typeof aiInteraction.metadata === "string") {
200
- metadata = JSON.parse(aiInteraction.metadata);
201
- } else if (typeof aiInteraction.metadata === "object" && aiInteraction.metadata !== null) {
202
- metadata = aiInteraction.metadata;
203
- } else {
204
- // optional fallback
205
- metadata = {};
206
- }
207
- } catch (e) {
208
- // TODO: RESPONSE SHAPE ALERT Check if we want to control the shape of the response....
209
- throw new Error(`Invalid metadata JSON: ${e}`);
210
- }
211
-
212
- const toolsInvoked = metadata['tools_invoked'];
213
- if (!toolsInvoked) {
214
- // TODO: RESPONSE SHAPE ALERT Check if we want to control the shape of the response....
215
- throw new Error(ERROR_MESSAGES.UNABLE_TO_RESOLVE_SOLID_COMMAND);
216
- }
217
-
218
- // TODO: OPTIMISATION for chained tool invocation, for now we are assuming only 1 tool was used.
219
- const toolInvoked = toolsInvoked[0];
220
-
221
- // TODO: use the toolInvoked to identify a service using some convention.
222
- // TODO: Eg. if toolInvoked is solid_create_module <> SolidCreateModuleMcpToolHandler ... create a factory class to do this mapping and identify the relevant provider.
223
- const mcpToolHandler = this.mcpHandlerFactory.getInstance(toolInvoked);
224
- if (!mcpToolHandler) {
225
- // TODO: RESPONSE SHAPE ALERT Check if we want to control the shape of the response....
226
- throw new Error(ERROR_MESSAGES.UNABLE_TO_RESOLVE_MCP_HANDLER);
227
- }
228
-
229
- const handlerApplicationResponse = await mcpToolHandler.apply(aiInteraction);
230
-
231
- // TODO: This provider to implement an interface - IMcpToolResponseHandler ... apply(aiInteraction: AiInteraction)
232
- // throw new Error('Method not implemented.');
233
-
234
- // Mark the interaction as applied
235
- await this.update(aiInteraction.id, { isApplied: true }, [], true);
236
-
237
- return handlerApplicationResponse;
238
- }
239
- }