@solidstarters/solid-core 1.2.161 → 1.2.165

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 (191) hide show
  1. package/dist/commands/ingest.command.d.ts +16 -0
  2. package/dist/commands/ingest.command.d.ts.map +1 -0
  3. package/dist/commands/ingest.command.js +50 -0
  4. package/dist/commands/ingest.command.js.map +1 -0
  5. package/dist/commands/refresh-module.command.d.ts.map +1 -1
  6. package/dist/commands/refresh-module.command.js.map +1 -1
  7. package/dist/controllers/service.controller.d.ts +16 -1
  8. package/dist/controllers/service.controller.d.ts.map +1 -1
  9. package/dist/controllers/service.controller.js +55 -2
  10. package/dist/controllers/service.controller.js.map +1 -1
  11. package/dist/controllers/test-queue.controller.d.ts +1 -1
  12. package/dist/controllers/test-queue.controller.d.ts.map +1 -1
  13. package/dist/controllers/test-queue.controller.js +6 -4
  14. package/dist/controllers/test-queue.controller.js.map +1 -1
  15. package/dist/controllers/test.controller.d.ts +6 -1
  16. package/dist/controllers/test.controller.d.ts.map +1 -1
  17. package/dist/controllers/test.controller.js +21 -3
  18. package/dist/controllers/test.controller.js.map +1 -1
  19. package/dist/entities/common.entity.d.ts.map +1 -1
  20. package/dist/entities/common.entity.js +14 -2
  21. package/dist/entities/common.entity.js.map +1 -1
  22. package/dist/entities/user.entity.d.ts.map +1 -1
  23. package/dist/entities/user.entity.js +11 -1
  24. package/dist/entities/user.entity.js.map +1 -1
  25. package/dist/helpers/error-mapper.service.d.ts +8 -0
  26. package/dist/helpers/error-mapper.service.d.ts.map +1 -0
  27. package/dist/helpers/error-mapper.service.js +108 -0
  28. package/dist/helpers/error-mapper.service.js.map +1 -0
  29. package/dist/jobs/chatter-queue-options.d.ts +8 -0
  30. package/dist/jobs/chatter-queue-options.d.ts.map +1 -0
  31. package/dist/jobs/chatter-queue-options.js +10 -0
  32. package/dist/jobs/chatter-queue-options.js.map +1 -0
  33. package/dist/jobs/chatter-queue-publisher.service.d.ts +22 -0
  34. package/dist/jobs/chatter-queue-publisher.service.d.ts.map +1 -0
  35. package/dist/jobs/chatter-queue-publisher.service.js +39 -0
  36. package/dist/jobs/chatter-queue-publisher.service.js.map +1 -0
  37. package/dist/jobs/chatter-queue-subscriber.service.d.ts +17 -0
  38. package/dist/jobs/chatter-queue-subscriber.service.d.ts.map +1 -0
  39. package/dist/jobs/chatter-queue-subscriber.service.js +59 -0
  40. package/dist/jobs/chatter-queue-subscriber.service.js.map +1 -0
  41. package/dist/jobs/{database/computed-field-evaluation-publisher.service.d.ts → computed-field-evaluation-publisher.service.d.ts} +2 -2
  42. package/dist/jobs/computed-field-evaluation-publisher.service.d.ts.map +1 -0
  43. package/dist/jobs/{database/computed-field-evaluation-publisher.service.js → computed-field-evaluation-publisher.service.js} +8 -8
  44. package/dist/jobs/computed-field-evaluation-publisher.service.js.map +1 -0
  45. package/dist/jobs/{database/computed-field-evaluation-queue-options.d.ts → computed-field-evaluation-queue-options.d.ts} +1 -1
  46. package/dist/jobs/computed-field-evaluation-queue-options.d.ts.map +1 -0
  47. package/dist/jobs/{database/computed-field-evaluation-queue-options.js → computed-field-evaluation-queue-options.js} +2 -2
  48. package/dist/jobs/computed-field-evaluation-queue-options.js.map +1 -0
  49. package/dist/jobs/{database/computed-field-evaluation-subscriber.service.d.ts → computed-field-evaluation-subscriber.service.d.ts} +3 -3
  50. package/dist/jobs/computed-field-evaluation-subscriber.service.d.ts.map +1 -0
  51. package/dist/jobs/computed-field-evaluation-subscriber.service.js +51 -0
  52. package/dist/jobs/computed-field-evaluation-subscriber.service.js.map +1 -0
  53. package/dist/jobs/database/computed-field-evaluation-publisher-database.service.d.ts +12 -0
  54. package/dist/jobs/database/computed-field-evaluation-publisher-database.service.d.ts.map +1 -0
  55. package/dist/jobs/database/computed-field-evaluation-publisher-database.service.js +39 -0
  56. package/dist/jobs/database/computed-field-evaluation-publisher-database.service.js.map +1 -0
  57. package/dist/jobs/database/computed-field-evaluation-queue-options-database.d.ts +8 -0
  58. package/dist/jobs/database/computed-field-evaluation-queue-options-database.d.ts.map +1 -0
  59. package/dist/jobs/database/computed-field-evaluation-queue-options-database.js +10 -0
  60. package/dist/jobs/database/computed-field-evaluation-queue-options-database.js.map +1 -0
  61. package/dist/jobs/database/computed-field-evaluation-subscriber-database.service.d.ts +18 -0
  62. package/dist/jobs/database/computed-field-evaluation-subscriber-database.service.d.ts.map +1 -0
  63. package/dist/jobs/database/{computed-field-evaluation-subscriber.service.js → computed-field-evaluation-subscriber-database.service.js} +8 -8
  64. package/dist/jobs/database/computed-field-evaluation-subscriber-database.service.js.map +1 -0
  65. package/dist/jobs/database/generate-code-queue-options-database.js +2 -2
  66. package/dist/jobs/database/generate-code-queue-options-database.js.map +1 -1
  67. package/dist/jobs/database/test-queue-subscriber-database.service.d.ts.map +1 -1
  68. package/dist/jobs/database/test-queue-subscriber-database.service.js +7 -1
  69. package/dist/jobs/database/test-queue-subscriber-database.service.js.map +1 -1
  70. package/dist/jobs/database/trigger-mcp-client-subscriber-database.service.d.ts.map +1 -1
  71. package/dist/jobs/database/trigger-mcp-client-subscriber-database.service.js +4 -2
  72. package/dist/jobs/database/trigger-mcp-client-subscriber-database.service.js.map +1 -1
  73. package/dist/jobs/generate-code-publisher.service.d.ts +11 -0
  74. package/dist/jobs/generate-code-publisher.service.d.ts.map +1 -0
  75. package/dist/jobs/generate-code-publisher.service.js +39 -0
  76. package/dist/jobs/generate-code-publisher.service.js.map +1 -0
  77. package/dist/jobs/generate-code-queue-options.d.ts +8 -0
  78. package/dist/jobs/generate-code-queue-options.d.ts.map +1 -0
  79. package/dist/jobs/generate-code-queue-options.js +10 -0
  80. package/dist/jobs/generate-code-queue-options.js.map +1 -0
  81. package/dist/jobs/generate-code-subscriber.service.d.ts +18 -0
  82. package/dist/jobs/generate-code-subscriber.service.d.ts.map +1 -0
  83. package/dist/jobs/generate-code-subscriber.service.js +70 -0
  84. package/dist/jobs/generate-code-subscriber.service.js.map +1 -0
  85. package/dist/jobs/test-queue-subscriber.service.d.ts +1 -1
  86. package/dist/jobs/test-queue-subscriber.service.d.ts.map +1 -1
  87. package/dist/jobs/test-queue-subscriber.service.js +9 -6
  88. package/dist/jobs/test-queue-subscriber.service.js.map +1 -1
  89. package/dist/jobs/trigger-mcp-client-publisher.service.d.ts +11 -0
  90. package/dist/jobs/trigger-mcp-client-publisher.service.d.ts.map +1 -0
  91. package/dist/jobs/trigger-mcp-client-publisher.service.js +39 -0
  92. package/dist/jobs/trigger-mcp-client-publisher.service.js.map +1 -0
  93. package/dist/jobs/trigger-mcp-client-queue-options.d.ts +8 -0
  94. package/dist/jobs/trigger-mcp-client-queue-options.d.ts.map +1 -0
  95. package/dist/jobs/trigger-mcp-client-queue-options.js +10 -0
  96. package/dist/jobs/trigger-mcp-client-queue-options.js.map +1 -0
  97. package/dist/jobs/trigger-mcp-client-subscriber.service.d.ts +18 -0
  98. package/dist/jobs/trigger-mcp-client-subscriber.service.d.ts.map +1 -0
  99. package/dist/jobs/trigger-mcp-client-subscriber.service.js +103 -0
  100. package/dist/jobs/trigger-mcp-client-subscriber.service.js.map +1 -0
  101. package/dist/jobs/twilio-sms-publisher.service.d.ts +11 -0
  102. package/dist/jobs/twilio-sms-publisher.service.d.ts.map +1 -0
  103. package/dist/jobs/twilio-sms-publisher.service.js +39 -0
  104. package/dist/jobs/twilio-sms-publisher.service.js.map +1 -0
  105. package/dist/jobs/twilio-sms-queue-options.d.ts +8 -0
  106. package/dist/jobs/twilio-sms-queue-options.d.ts.map +1 -0
  107. package/dist/jobs/twilio-sms-queue-options.js +10 -0
  108. package/dist/jobs/twilio-sms-queue-options.js.map +1 -0
  109. package/dist/jobs/twilio-sms-subscriber.service.d.ts +17 -0
  110. package/dist/jobs/twilio-sms-subscriber.service.d.ts.map +1 -0
  111. package/dist/jobs/twilio-sms-subscriber.service.js +48 -0
  112. package/dist/jobs/twilio-sms-subscriber.service.js.map +1 -0
  113. package/dist/seeders/seed-data/solid-core-metadata.json +21 -0
  114. package/dist/services/genai/ingest-metadata.service.d.ts +38 -0
  115. package/dist/services/genai/ingest-metadata.service.d.ts.map +1 -0
  116. package/dist/services/genai/ingest-metadata.service.js +530 -0
  117. package/dist/services/genai/ingest-metadata.service.js.map +1 -0
  118. package/dist/services/genai/r2r-helper.service.d.ts +7 -0
  119. package/dist/services/genai/r2r-helper.service.d.ts.map +1 -0
  120. package/dist/services/genai/r2r-helper.service.js +36 -0
  121. package/dist/services/genai/r2r-helper.service.js.map +1 -0
  122. package/dist/services/queues/database-publisher.service.js +2 -2
  123. package/dist/services/queues/database-publisher.service.js.map +1 -1
  124. package/dist/services/queues/database-subscriber.service.d.ts.map +1 -1
  125. package/dist/services/queues/database-subscriber.service.js +2 -1
  126. package/dist/services/queues/database-subscriber.service.js.map +1 -1
  127. package/dist/services/queues/publisher-factory.service.js +1 -1
  128. package/dist/services/queues/publisher-factory.service.js.map +1 -1
  129. package/dist/services/setting.service.d.ts.map +1 -1
  130. package/dist/services/setting.service.js +38 -20
  131. package/dist/services/setting.service.js.map +1 -1
  132. package/dist/solid-core.module.d.ts.map +1 -1
  133. package/dist/solid-core.module.js +29 -4
  134. package/dist/solid-core.module.js.map +1 -1
  135. package/dist/subscribers/audit.subscriber.d.ts +8 -0
  136. package/dist/subscribers/audit.subscriber.d.ts.map +1 -1
  137. package/dist/subscribers/audit.subscriber.js +52 -3
  138. package/dist/subscribers/audit.subscriber.js.map +1 -1
  139. package/dist/subscribers/computed-entity-field.subscriber.d.ts +3 -3
  140. package/dist/subscribers/computed-entity-field.subscriber.d.ts.map +1 -1
  141. package/dist/subscribers/computed-entity-field.subscriber.js +5 -7
  142. package/dist/subscribers/computed-entity-field.subscriber.js.map +1 -1
  143. package/dist/tsconfig.tsbuildinfo +1 -1
  144. package/package.json +2 -1
  145. package/src/commands/ingest-rag-chunking-strategy-for.md +224 -0
  146. package/src/commands/ingest.command.ts +36 -0
  147. package/src/commands/refresh-module.command.ts +0 -1
  148. package/src/controllers/service.controller.ts +66 -3
  149. package/src/controllers/test-queue.controller.ts +4 -3
  150. package/src/controllers/test.controller.ts +15 -3
  151. package/src/entities/common.entity.ts +10 -0
  152. package/src/entities/user.entity.ts +33 -1
  153. package/src/helpers/error-mapper.service.ts +214 -0
  154. package/src/jobs/chatter-queue-options.ts +9 -0
  155. package/src/jobs/chatter-queue-publisher.service.ts +37 -0
  156. package/src/jobs/chatter-queue-subscriber.service.ts +46 -0
  157. package/src/jobs/computed-field-evaluation-publisher.service.ts +23 -0
  158. package/src/jobs/{database/computed-field-evaluation-queue-options.ts → computed-field-evaluation-queue-options.ts} +2 -2
  159. package/src/jobs/computed-field-evaluation-subscriber.service.ts +38 -0
  160. package/src/jobs/database/{computed-field-evaluation-publisher.service.ts → computed-field-evaluation-publisher-database.service.ts} +2 -2
  161. package/src/jobs/database/computed-field-evaluation-queue-options-database.ts +9 -0
  162. package/src/jobs/database/{computed-field-evaluation-subscriber.service.ts → computed-field-evaluation-subscriber-database.service.ts} +2 -2
  163. package/src/jobs/database/generate-code-queue-options-database.ts +2 -2
  164. package/src/jobs/database/test-queue-subscriber-database.service.ts +10 -2
  165. package/src/jobs/database/trigger-mcp-client-subscriber-database.service.ts +4 -2
  166. package/src/jobs/generate-code-publisher.service.ts +23 -0
  167. package/src/jobs/generate-code-queue-options.ts +9 -0
  168. package/src/jobs/generate-code-subscriber.service.ts +59 -0
  169. package/src/jobs/test-queue-subscriber.service.ts +15 -7
  170. package/src/jobs/trigger-mcp-client-publisher.service.ts +22 -0
  171. package/src/jobs/trigger-mcp-client-queue-options.ts +9 -0
  172. package/src/jobs/trigger-mcp-client-subscriber.service.ts +104 -0
  173. package/src/jobs/twilio-sms-publisher.service.ts +23 -0
  174. package/src/jobs/twilio-sms-queue-options.ts +9 -0
  175. package/src/jobs/twilio-sms-subscriber.service.ts +32 -0
  176. package/src/seeders/seed-data/solid-core-metadata.json +21 -0
  177. package/src/services/genai/ingest-metadata.service.ts +695 -0
  178. package/src/services/genai/r2r-helper.service.ts +33 -0
  179. package/src/services/queues/database-publisher.service.ts +2 -2
  180. package/src/services/queues/database-subscriber.service.ts +2 -1
  181. package/src/services/queues/publisher-factory.service.ts +1 -1
  182. package/src/services/setting.service.ts +46 -22
  183. package/src/solid-core.module.ts +41 -8
  184. package/src/subscribers/audit.subscriber.ts +235 -5
  185. package/src/subscribers/computed-entity-field.subscriber.ts +7 -5
  186. package/dist/jobs/database/computed-field-evaluation-publisher.service.d.ts.map +0 -1
  187. package/dist/jobs/database/computed-field-evaluation-publisher.service.js.map +0 -1
  188. package/dist/jobs/database/computed-field-evaluation-queue-options.d.ts.map +0 -1
  189. package/dist/jobs/database/computed-field-evaluation-queue-options.js.map +0 -1
  190. package/dist/jobs/database/computed-field-evaluation-subscriber.service.d.ts.map +0 -1
  191. package/dist/jobs/database/computed-field-evaluation-subscriber.service.js.map +0 -1
@@ -0,0 +1,214 @@
1
+ // src/common/errors/error-mapper.service.ts
2
+ import { Injectable } from '@nestjs/common';
3
+
4
+ export const ERROR_CODES = [
5
+ 'bedrock-throttling-error',
6
+ 'bedrock-access-denied',
7
+ 'bedrock-input-too-long',
8
+ 'bedrock-validation-error',
9
+ 'bedrock-model-not-found',
10
+ 'db-duplicate-key',
11
+ 'db-foreign-key-error',
12
+ 'metadata-extraction-date-parsing-failed',
13
+ 'metadata-extraction-missing-s3-file',
14
+ 'solidx-mcp-server-unavailable',
15
+ 'unknown-error',
16
+ ] as const;
17
+
18
+ export type ErrorCode = typeof ERROR_CODES[number];
19
+
20
+ @Injectable()
21
+ export class ErrorMapperService {
22
+ /**
23
+ * Given an error/exception, return a mapped error code string.
24
+ * Default: "unknown-error"
25
+ */
26
+ mapException(exc: unknown): ErrorCode {
27
+ const combined = this.combineErrorText(exc);
28
+
29
+ // AiInteraction - mcp server down.
30
+ // {
31
+ // "success": false,
32
+ // "errors": [
33
+ // "unhandled errors in a TaskGroup (1 sub-exception)"
34
+ // ],
35
+ // "error_trace": [
36
+ // "Traceback (most recent call last):",
37
+ // "File \"/Users/harishpatel/.pyenv/versions/3.12.7/envs/solid_mcp_client/lib/python3.12/site-packages/mcp/client/sse.py\", line 47, in sse_client\n async with aconnect_sse(\n ^^^^^^^^^^^^^",
38
+ // "File \"/Users/harishpatel/.pyenv/versions/3.12.7/lib/python3.12/contextlib.py\", line 210, in __aenter__\n return await anext(self.gen)\n ^^^^^^^^^^^^^^^^^^^^^",
39
+ // "File \"/Users/harishpatel/.pyenv/versions/3.12.7/envs/solid_mcp_client/lib/python3.12/site-packages/httpx_sse/_api.py\", line 69, in aconnect_sse\n async with client.stream(method, url, headers=headers, **kwargs) as response:\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^",
40
+ // "File \"/Users/harishpatel/.pyenv/versions/3.12.7/lib/python3.12/contextlib.py\", line 210, in __aenter__\n return await anext(self.gen)\n ^^^^^^^^^^^^^^^^^^^^^",
41
+ // "File \"/Users/harishpatel/.pyenv/versions/3.12.7/envs/solid_mcp_client/lib/python3.12/site-packages/httpx/_client.py\", line 1583, in stream\n response = await self.send(\n ^^^^^^^^^^^^^^^^",
42
+ // "File \"/Users/harishpatel/.pyenv/versions/3.12.7/envs/solid_mcp_client/lib/python3.12/site-packages/httpx/_client.py\", line 1629, in send\n response = await self._send_handling_auth(\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^",
43
+ // "File \"/Users/harishpatel/.pyenv/versions/3.12.7/envs/solid_mcp_client/lib/python3.12/site-packages/httpx/_client.py\", line 1657, in _send_handling_auth\n response = await self._send_handling_redirects(\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^",
44
+ // "File \"/Users/harishpatel/.pyenv/versions/3.12.7/envs/solid_mcp_client/lib/python3.12/site-packages/httpx/_client.py\", line 1694, in _send_handling_redirects\n response = await self._send_single_request(request)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^",
45
+ // "File \"/Users/harishpatel/.pyenv/versions/3.12.7/envs/solid_mcp_client/lib/python3.12/site-packages/httpx/_client.py\", line 1730, in _send_single_request\n response = await transport.handle_async_request(request)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^",
46
+ // "File \"/Users/harishpatel/.pyenv/versions/3.12.7/envs/solid_mcp_client/lib/python3.12/site-packages/httpx/_transports/default.py\", line 393, in handle_async_request\n with map_httpcore_exceptions():\n ^^^^^^^^^^^^^^^^^^^^^^^^^",
47
+ // "File \"/Users/harishpatel/.pyenv/versions/3.12.7/lib/python3.12/contextlib.py\", line 158, in __exit__\n self.gen.throw(value)",
48
+ // "File \"/Users/harishpatel/.pyenv/versions/3.12.7/envs/solid_mcp_client/lib/python3.12/site-packages/httpx/_transports/default.py\", line 118, in map_httpcore_exceptions\n raise mapped_exc(message) from exc",
49
+ // "httpx.ConnectError: All connection attempts failed",
50
+ // "During handling of the above exception, another exception occurred:",
51
+ // "+ Exception Group Traceback (most recent call last):",
52
+ // "| File \"/Users/harishpatel/mcp/clients/solidx_mcp_client/client_sse_nochat.py\", line 239, in main\n | await client.connect_to_sse_server()",
53
+ // "| File \"/Users/harishpatel/mcp/clients/solidx_mcp_client/client_sse_nochat.py\", line 49, in connect_to_sse_server\n | streams = await self._streams_context.__aenter__()\n | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^",
54
+ // "| File \"/Users/harishpatel/.pyenv/versions/3.12.7/lib/python3.12/contextlib.py\", line 210, in __aenter__\n | return await anext(self.gen)\n | ^^^^^^^^^^^^^^^^^^^^^",
55
+ // "| File \"/Users/harishpatel/.pyenv/versions/3.12.7/envs/solid_mcp_client/lib/python3.12/site-packages/mcp/client/sse.py\", line 43, in sse_client\n | async with anyio.create_task_group() as tg:\n | ^^^^^^^^^^^^^^^^^^^^^^^^^",
56
+ // "| File \"/Users/harishpatel/.pyenv/versions/3.12.7/envs/solid_mcp_client/lib/python3.12/site-packages/anyio/_backends/_asyncio.py\", line 767, in __aexit__\n | raise BaseExceptionGroup(",
57
+ // "| ExceptionGroup: unhandled errors in a TaskGroup (1 sub-exception)",
58
+ // "+-+---------------- 1 ----------------",
59
+ // "| Traceback (most recent call last):",
60
+ // "| File \"/Users/harishpatel/.pyenv/versions/3.12.7/envs/solid_mcp_client/lib/python3.12/site-packages/httpx/_transports/default.py\", line 101, in map_httpcore_exceptions\n | yield",
61
+ // "| File \"/Users/harishpatel/.pyenv/versions/3.12.7/envs/solid_mcp_client/lib/python3.12/site-packages/httpx/_transports/default.py\", line 394, in handle_async_request\n | resp = await self._pool.handle_async_request(req)\n | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^",
62
+ // "| File \"/Users/harishpatel/.pyenv/versions/3.12.7/envs/solid_mcp_client/lib/python3.12/site-packages/httpcore/_async/connection_pool.py\", line 256, in handle_async_request\n | raise exc from None",
63
+ // "| File \"/Users/harishpatel/.pyenv/versions/3.12.7/envs/solid_mcp_client/lib/python3.12/site-packages/httpcore/_async/connection_pool.py\", line 236, in handle_async_request\n | response = await connection.handle_async_request(\n | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^",
64
+ // "| File \"/Users/harishpatel/.pyenv/versions/3.12.7/envs/solid_mcp_client/lib/python3.12/site-packages/httpcore/_async/connection.py\", line 101, in handle_async_request\n | raise exc",
65
+ // "| File \"/Users/harishpatel/.pyenv/versions/3.12.7/envs/solid_mcp_client/lib/python3.12/site-packages/httpcore/_async/connection.py\", line 78, in handle_async_request\n | stream = await self._connect(request)\n | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^",
66
+ // "| File \"/Users/harishpatel/.pyenv/versions/3.12.7/envs/solid_mcp_client/lib/python3.12/site-packages/httpcore/_async/connection.py\", line 124, in _connect\n | stream = await self._network_backend.connect_tcp(**kwargs)\n | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^",
67
+ // "| File \"/Users/harishpatel/.pyenv/versions/3.12.7/envs/solid_mcp_client/lib/python3.12/site-packages/httpcore/_backends/auto.py\", line 31, in connect_tcp\n | return await self._backend.connect_tcp(\n | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^",
68
+ // "| File \"/Users/harishpatel/.pyenv/versions/3.12.7/envs/solid_mcp_client/lib/python3.12/site-packages/httpcore/_backends/anyio.py\", line 113, in connect_tcp\n | with map_exceptions(exc_map):\n | ^^^^^^^^^^^^^^^^^^^^^^^",
69
+ // "| File \"/Users/harishpatel/.pyenv/versions/3.12.7/lib/python3.12/contextlib.py\", line 158, in __exit__\n | self.gen.throw(value)",
70
+ // "| File \"/Users/harishpatel/.pyenv/versions/3.12.7/envs/solid_mcp_client/lib/python3.12/site-packages/httpcore/_exceptions.py\", line 14, in map_exceptions\n | raise to_exc(exc) from exc",
71
+ // "| httpcore.ConnectError: All connection attempts failed",
72
+ // "| \n | The above exception was the direct cause of the following exception:\n |",
73
+ // "| Traceback (most recent call last):",
74
+ // "| File \"/Users/harishpatel/.pyenv/versions/3.12.7/envs/solid_mcp_client/lib/python3.12/site-packages/mcp/client/sse.py\", line 47, in sse_client\n | async with aconnect_sse(\n | ^^^^^^^^^^^^^",
75
+ // "| File \"/Users/harishpatel/.pyenv/versions/3.12.7/lib/python3.12/contextlib.py\", line 210, in __aenter__\n | return await anext(self.gen)\n | ^^^^^^^^^^^^^^^^^^^^^",
76
+ // "| File \"/Users/harishpatel/.pyenv/versions/3.12.7/envs/solid_mcp_client/lib/python3.12/site-packages/httpx_sse/_api.py\", line 69, in aconnect_sse\n | async with client.stream(method, url, headers=headers, **kwargs) as response:\n | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^",
77
+ // "| File \"/Users/harishpatel/.pyenv/versions/3.12.7/lib/python3.12/contextlib.py\", line 210, in __aenter__\n | return await anext(self.gen)\n | ^^^^^^^^^^^^^^^^^^^^^",
78
+ // "| File \"/Users/harishpatel/.pyenv/versions/3.12.7/envs/solid_mcp_client/lib/python3.12/site-packages/httpx/_client.py\", line 1583, in stream\n | response = await self.send(\n | ^^^^^^^^^^^^^^^^",
79
+ // "| File \"/Users/harishpatel/.pyenv/versions/3.12.7/envs/solid_mcp_client/lib/python3.12/site-packages/httpx/_client.py\", line 1629, in send\n | response = await self._send_handling_auth(\n | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^",
80
+ // "| File \"/Users/harishpatel/.pyenv/versions/3.12.7/envs/solid_mcp_client/lib/python3.12/site-packages/httpx/_client.py\", line 1657, in _send_handling_auth\n | response = await self._send_handling_redirects(\n | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^",
81
+ // "| File \"/Users/harishpatel/.pyenv/versions/3.12.7/envs/solid_mcp_client/lib/python3.12/site-packages/httpx/_client.py\", line 1694, in _send_handling_redirects\n | response = await self._send_single_request(request)\n | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^",
82
+ // "| File \"/Users/harishpatel/.pyenv/versions/3.12.7/envs/solid_mcp_client/lib/python3.12/site-packages/httpx/_client.py\", line 1730, in _send_single_request\n | response = await transport.handle_async_request(request)\n | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^",
83
+ // "| File \"/Users/harishpatel/.pyenv/versions/3.12.7/envs/solid_mcp_client/lib/python3.12/site-packages/httpx/_transports/default.py\", line 393, in handle_async_request\n | with map_httpcore_exceptions():\n | ^^^^^^^^^^^^^^^^^^^^^^^^^",
84
+ // "| File \"/Users/harishpatel/.pyenv/versions/3.12.7/lib/python3.12/contextlib.py\", line 158, in __exit__\n | self.gen.throw(value)",
85
+ // "| File \"/Users/harishpatel/.pyenv/versions/3.12.7/envs/solid_mcp_client/lib/python3.12/site-packages/httpx/_transports/default.py\", line 118, in map_httpcore_exceptions\n | raise mapped_exc(message) from exc",
86
+ // "| httpx.ConnectError: All connection attempts failed",
87
+ // "+------------------------------------"
88
+ // ],
89
+ // "request": "\"Can you do 1 + 1\""
90
+ // }
91
+ if (combined.includes("all connection attempts failed") && combined.includes("unhandled errors in a taskgroup (1 sub-exception)")) {
92
+ return 'solidx-mcp-server-unavailable';
93
+ }
94
+
95
+ // --- Bedrock errors ---
96
+ // Throttling: "ThrottlingException" or "Too many tokens"
97
+ if (
98
+ combined.includes('throttlingexception') ||
99
+ combined.includes('too many tokens')
100
+ ) {
101
+ return 'bedrock-throttling-error';
102
+ }
103
+
104
+ if (combined.includes('accessdeniedexception')) {
105
+ return 'bedrock-access-denied';
106
+ }
107
+
108
+ if (
109
+ combined.includes('validationexception') &&
110
+ combined.includes('input is too long')
111
+ ) {
112
+ return 'bedrock-input-too-long';
113
+ }
114
+
115
+ if (combined.includes('validationexception')) {
116
+ return 'bedrock-validation-error';
117
+ }
118
+
119
+ if (combined.includes('modelnotfoundexception')) {
120
+ return 'bedrock-model-not-found';
121
+ }
122
+
123
+ // --- DB errors ---
124
+ if (
125
+ combined.includes('unique constraint') ||
126
+ combined.includes('duplicate key')
127
+ ) {
128
+ return 'db-duplicate-key';
129
+ }
130
+
131
+ if (combined.includes('foreign key')) {
132
+ return 'db-foreign-key-error';
133
+ }
134
+
135
+ // --- OpenSearch errors ---
136
+ // mapper_parsing_exception on specific fields
137
+ if (
138
+ combined.includes('mapper_parsing_exception') &&
139
+ (combined.includes('failed to parse field [metadata.properties.dates]') ||
140
+ combined.includes(
141
+ 'failed to parse field [metadata.properties.date_authored]',
142
+ ))
143
+ ) {
144
+ return 'metadata-extraction-date-parsing-failed';
145
+ }
146
+
147
+ // --- S3 errors ---
148
+ // NoSuchKey during GetObject
149
+ if (combined.includes('nosuchkey') && combined.includes('getobject')) {
150
+ return 'metadata-extraction-missing-s3-file';
151
+ }
152
+
153
+ // --- Catch-all ---
154
+ return 'unknown-error';
155
+ }
156
+
157
+ /**
158
+ * Same mapping, but takes raw strings instead of an Exception object.
159
+ */
160
+ mapMessage(message: string, trace?: string): ErrorCode {
161
+ const combined = `${message ?? ''}\n${trace ?? ''}`.toLowerCase();
162
+ return this.mapException(combined);
163
+ }
164
+
165
+ // ---- helpers ----
166
+
167
+ private combineErrorText(exc: unknown): string {
168
+ // If caller passed us a pre-lowered string (e.g. from mapMessage), use it
169
+ if (typeof exc === 'string') {
170
+ return exc.toLowerCase();
171
+ }
172
+
173
+ // Standard Error
174
+ if (exc instanceof Error) {
175
+ const message = exc.message ?? '';
176
+ // Many libs set .stack to "Error: message\n<stack>"
177
+ // We still include it in case upstream mutated it.
178
+ const stack = exc.stack ?? '';
179
+ return `${message}\n${stack}`.toLowerCase();
180
+ }
181
+
182
+ // Some SDKs throw objects (e.g., { name, message, code, $metadata, ... })
183
+ if (exc && typeof exc === 'object') {
184
+ try {
185
+ const maybeAny = exc as Record<string, unknown>;
186
+ const msg =
187
+ String(maybeAny.message ?? '') ||
188
+ String(maybeAny['Message'] ?? '') ||
189
+ '';
190
+ const name =
191
+ String(maybeAny.name ?? '') ||
192
+ String(maybeAny['__type'] ?? '') ||
193
+ '';
194
+ const stack = String((maybeAny as any).stack ?? '');
195
+ // Also fold in a JSON snapshot as a last resort
196
+ const json = safeJsonStringify(maybeAny);
197
+ return `${name}\n${msg}\n${stack}\n${json}`.toLowerCase();
198
+ } catch {
199
+ // fall through
200
+ }
201
+ }
202
+
203
+ // Fallback
204
+ return String(exc ?? '').toLowerCase();
205
+ }
206
+ }
207
+
208
+ function safeJsonStringify(obj: unknown): string {
209
+ try {
210
+ return JSON.stringify(obj);
211
+ } catch {
212
+ return '';
213
+ }
214
+ }
@@ -0,0 +1,9 @@
1
+ import { BrokerType } from "../interfaces";
2
+
3
+ const QUEUE_NAME = 'chatter_queue';
4
+
5
+ export default {
6
+ name: 'queueChatter',
7
+ type: BrokerType.RabbitMQ,
8
+ queueName: QUEUE_NAME,
9
+ };
@@ -0,0 +1,37 @@
1
+ import { Injectable } from '@nestjs/common';
2
+
3
+ import { RabbitMqPublisher } from 'src/services/queues/rabbitmq-publisher.service';
4
+ import chatterQueueOptions from './chatter-queue-options';
5
+ import { MqMessageQueueService } from '../services/mq-message-queue.service';
6
+ import { MqMessageService } from '../services/mq-message.service';
7
+ import { QueuesModuleOptions } from "../interfaces";
8
+
9
+
10
+ export type ChatterEventType = 'insert' | 'update' | 'delete';
11
+
12
+ export interface ChatterMessagePayload {
13
+ eventType: ChatterEventType;
14
+ model: string; // entity name
15
+ entityId: string; // id string
16
+ occurredAt: string; // ISO
17
+ before?: any;
18
+ after?: any;
19
+ diff?: string[]; // changed column names for updates
20
+ userId?: string | null;
21
+ }
22
+
23
+ @Injectable()
24
+ export class ChatterQueuePublisher extends RabbitMqPublisher<any> {
25
+ constructor(
26
+ protected readonly mqMessageService: MqMessageService,
27
+ protected readonly mqMessageQueueService: MqMessageQueueService,
28
+ ) {
29
+ super(mqMessageService, mqMessageQueueService);
30
+ }
31
+
32
+ options(): QueuesModuleOptions {
33
+ return {
34
+ ...chatterQueueOptions
35
+ }
36
+ }
37
+ }
@@ -0,0 +1,46 @@
1
+ import { Injectable, Logger } from '@nestjs/common';
2
+
3
+ import { RabbitMqSubscriber } from 'src/services/queues/rabbitmq-subscriber.service';
4
+ import { QueueMessage } from 'src/interfaces/mq';
5
+ import { MqMessageService } from '../services/mq-message.service';
6
+ import { MqMessageQueueService } from '../services/mq-message-queue.service';
7
+ import { QueuesModuleOptions } from "../interfaces";
8
+ import chatterQueueOptions from './chatter-queue-options';
9
+ import { ChatterMessagePayload } from './chatter-queue-publisher.service';
10
+ import { ChatterMessageService } from 'src/services/chatter-message.service';
11
+
12
+ @Injectable()
13
+ export class ChatterQueueSubscriber extends RabbitMqSubscriber<any> {
14
+ private readonly chatterQueueLogger = new Logger(ChatterQueueSubscriber.name);
15
+
16
+ constructor(
17
+ readonly mqMessageService: MqMessageService,
18
+ readonly mqMessageQueueService: MqMessageQueueService,
19
+ private readonly chatterMessageService: ChatterMessageService,
20
+ ) {
21
+ super(mqMessageService, mqMessageQueueService);
22
+ }
23
+
24
+ options(): QueuesModuleOptions {
25
+ return {
26
+ ...chatterQueueOptions
27
+ }
28
+ }
29
+
30
+ async subscribe(message: QueueMessage<ChatterMessagePayload>) {
31
+ const p = message.payload;
32
+ this.chatterQueueLogger.debug(`Audit event ${p.eventType} ${p.model}#${p.entityId}`);
33
+
34
+ switch (p.eventType) {
35
+ case 'insert':
36
+ await this.chatterMessageService.postAuditMessageOnInsert(p.after, { name: p.model } as any);
37
+ break;
38
+ case 'update':
39
+ await this.chatterMessageService.postAuditMessageOnUpdate(p.after, { name: p.model } as any, p.before, (p.diff || []).map(n => ({ propertyName: n })));
40
+ break;
41
+ case 'delete':
42
+ await this.chatterMessageService.postAuditMessageOnDelete(p.before, { name: p.model } as any, p.before);
43
+ break;
44
+ }
45
+ }
46
+ }
@@ -0,0 +1,23 @@
1
+ import { Injectable } from "@nestjs/common";
2
+ import { QueuesModuleOptions } from "src/interfaces";
3
+ import { MqMessageQueueService } from "src/services/mq-message-queue.service";
4
+ import { MqMessageService } from "src/services/mq-message.service";
5
+ import { RabbitMqPublisher } from "src/services/queues/rabbitmq-publisher.service";
6
+ import { ComputedFieldEvaluationPayload } from "src/subscribers/computed-entity-field.subscriber";
7
+ import computedFieldEvaluationQueueOptions from "./computed-field-evaluation-queue-options";
8
+
9
+ @Injectable()
10
+ export class ComputedFieldEvaluationPublisherRabbitmq extends RabbitMqPublisher<ComputedFieldEvaluationPayload> {
11
+ constructor(
12
+ protected readonly mqMessageService: MqMessageService,
13
+ protected readonly mqMessageQueueService: MqMessageQueueService,
14
+ ) {
15
+ super(mqMessageService, mqMessageQueueService);
16
+ }
17
+
18
+ options(): QueuesModuleOptions {
19
+ return {
20
+ ...computedFieldEvaluationQueueOptions
21
+ };
22
+ }
23
+ }
@@ -1,9 +1,9 @@
1
- import { BrokerType } from "../../interfaces";
1
+ import { BrokerType } from "../interfaces";
2
2
 
3
3
  const QUEUE_NAME = 'computed_field_evaluation_queue';
4
4
 
5
5
  export default {
6
6
  name: 'computedFieldEvaluationQueue',
7
- type: BrokerType.Database,
7
+ type: BrokerType.RabbitMQ,
8
8
  queueName: QUEUE_NAME,
9
9
  };
@@ -0,0 +1,38 @@
1
+ import { Injectable } from "@nestjs/common";
2
+ import { SolidRegistry } from "src/helpers/solid-registry";
3
+ import { IEntityPostComputeFieldProvider, QueuesModuleOptions } from "src/interfaces";
4
+ import { QueueMessage } from "src/interfaces/mq";
5
+ import { MqMessageQueueService } from "src/services/mq-message-queue.service";
6
+ import { MqMessageService } from "src/services/mq-message.service";
7
+ import { PollerService } from "src/services/poller.service";
8
+ import { RabbitMqSubscriber } from "src/services/queues/rabbitmq-subscriber.service";
9
+ import { ComputedFieldEvaluationPayload } from "src/subscribers/computed-entity-field.subscriber";
10
+ import computedFieldEvaluationQueueOptions from "./computed-field-evaluation-queue-options";
11
+
12
+ @Injectable()
13
+ export class ComputedFieldEvaluationSubscriberRabbitmq extends RabbitMqSubscriber<ComputedFieldEvaluationPayload> {
14
+ constructor(
15
+ readonly mqMessageService: MqMessageService,
16
+ readonly mqMessageQueueService: MqMessageQueueService,
17
+ readonly solidRegistry: SolidRegistry,
18
+ readonly poller: PollerService,
19
+ ) {
20
+ super(mqMessageService, mqMessageQueueService);
21
+ }
22
+
23
+ options(): QueuesModuleOptions {
24
+ return {
25
+ ...computedFieldEvaluationQueueOptions
26
+ }
27
+ }
28
+
29
+ // This method will use the ComputedFieldEvaluationPayload to evaluate the computed fields
30
+ // It will then call the corresponding provider computeAndSave method to perform the evaluation
31
+ async subscribe(message: QueueMessage<ComputedFieldEvaluationPayload>) {
32
+ const { databaseEntity, ...computedFieldMetadata } = message.payload;
33
+ const provider = this.solidRegistry.getComputedFieldProvider(computedFieldMetadata.computedFieldValueProviderName);
34
+ // Get the instance of the provider and assert it is of type IEntityComputedFieldProvider
35
+ const providerInstance = provider.instance as IEntityPostComputeFieldProvider<any, any>; // IEntityComputedFieldProvider
36
+ await providerInstance.postComputeAndSaveValue(databaseEntity, computedFieldMetadata); //FIXME There should some way to check/assert if the provider actually has a postComputeAndSaveValue
37
+ }
38
+ }
@@ -4,10 +4,10 @@ import { MqMessageQueueService } from "src/services/mq-message-queue.service";
4
4
  import { MqMessageService } from "src/services/mq-message.service";
5
5
  import { DatabasePublisher } from "src/services/queues/database-publisher.service";
6
6
  import { ComputedFieldEvaluationPayload } from "src/subscribers/computed-entity-field.subscriber";
7
- import computedFieldEvaluationQueueOptions from "./computed-field-evaluation-queue-options";
7
+ import computedFieldEvaluationQueueOptions from "./computed-field-evaluation-queue-options-database";
8
8
 
9
9
  @Injectable()
10
- export class ComputedFieldEvaluationPublisher extends DatabasePublisher<ComputedFieldEvaluationPayload> {
10
+ export class ComputedFieldEvaluationPublisherDatabase extends DatabasePublisher<ComputedFieldEvaluationPayload> {
11
11
  constructor(
12
12
  protected readonly mqMessageService: MqMessageService,
13
13
  protected readonly mqMessageQueueService: MqMessageQueueService,
@@ -0,0 +1,9 @@
1
+ import { BrokerType } from "../../interfaces";
2
+
3
+ const QUEUE_NAME = 'computed_field_evaluation_queue_database';
4
+
5
+ export default {
6
+ name: 'computedFieldEvaluationQueueDatabase',
7
+ type: BrokerType.Database,
8
+ queueName: QUEUE_NAME,
9
+ };
@@ -6,11 +6,11 @@ import { MqMessageQueueService } from "src/services/mq-message-queue.service";
6
6
  import { MqMessageService } from "src/services/mq-message.service";
7
7
  import { DatabaseSubscriber } from "src/services/queues/database-subscriber.service";
8
8
  import { ComputedFieldEvaluationPayload } from "src/subscribers/computed-entity-field.subscriber";
9
- import computedFieldEvaluationQueueOptions from "./computed-field-evaluation-queue-options";
9
+ import computedFieldEvaluationQueueOptions from "./computed-field-evaluation-queue-options-database";
10
10
  import { PollerService } from "src/services/poller.service";
11
11
 
12
12
  @Injectable()
13
- export class ComputedFieldEvaluationSubscriber extends DatabaseSubscriber<ComputedFieldEvaluationPayload> {
13
+ export class ComputedFieldEvaluationSubscriberDatabase extends DatabaseSubscriber<ComputedFieldEvaluationPayload> {
14
14
  constructor(
15
15
  readonly mqMessageService: MqMessageService,
16
16
  readonly mqMessageQueueService: MqMessageQueueService,
@@ -1,9 +1,9 @@
1
1
  import { BrokerType } from "../../interfaces";
2
2
 
3
- const QUEUE_NAME = 'generate_code_queue';
3
+ const QUEUE_NAME = 'generate_code_queue_database';
4
4
 
5
5
  export default {
6
- name: 'generateCodeQueue',
6
+ name: 'generateCodeQueueDatabase',
7
7
  type: BrokerType.Database,
8
8
  queueName: QUEUE_NAME,
9
9
  };
@@ -29,12 +29,20 @@ export class TestQueueSubscriberDatabase extends DatabaseSubscriber<any> {
29
29
  // console.log(`Received message ${JSON.stringify(message)}`);
30
30
  this.testQueueLogger.debug(`Received message: ${JSON.stringify(message)}`);
31
31
 
32
+ let timeoutSecondsParsed = 10;
33
+ const timeoutSeconds = message?.payload?.timeoutSeconds;
34
+ if (timeoutSeconds) {
35
+ timeoutSecondsParsed = +timeoutSeconds;
36
+ }
37
+
38
+ this.testQueueLogger.debug(`Processing message with timeout: ${timeoutSecondsParsed}`);
39
+
40
+ // Simulate some processing time
32
41
  return new Promise((resolve, reject) => {
33
- // Simulate some processing time
34
42
  setTimeout(() => {
35
43
  this.testQueueLogger.debug(`Processed message: ${JSON.stringify(message)}`);
36
44
  resolve({ status: 'success', messageId: message.messageId, message: `Processed message` });
37
- }, 10000); // Simulate 1 second processing time
45
+ }, timeoutSecondsParsed * 1000);
38
46
  });
39
47
  }
40
48
  }
@@ -68,7 +68,8 @@ export class TriggerMcpClientSubscriberDatabase extends DatabaseSubscriber<Trigg
68
68
  modelUsed: aiResponse.model,
69
69
  responseTimeMs: aiResponse.duration_ms,
70
70
  metadata: JSON.stringify(aiResponse),
71
- isApplied: aiInteraction.isApplied
71
+ isApplied: aiInteraction.isApplied,
72
+ status: aiResponse.success ? 'succeeded' : 'failed'
72
73
  });
73
74
 
74
75
  // update the job entry with failure... raising an error will lead the job to be marked as failed...
@@ -88,7 +89,8 @@ export class TriggerMcpClientSubscriberDatabase extends DatabaseSubscriber<Trigg
88
89
  modelUsed: aiResponse.model,
89
90
  responseTimeMs: aiResponse.duration_ms,
90
91
  metadata: JSON.stringify(aiResponse),
91
- isApplied: aiInteraction.isApplied
92
+ isApplied: aiInteraction.isApplied,
93
+ status: aiResponse.success ? 'succeeded' : 'failed'
92
94
  });
93
95
 
94
96
  // If the human interaction was with isAutoApply=true, then we can go ahead and autoApply.
@@ -0,0 +1,23 @@
1
+ import { Injectable } from '@nestjs/common';
2
+
3
+ import { RabbitMqPublisher } from 'src/services/queues/rabbitmq-publisher.service';
4
+ import { CodeGenerationOptions, QueuesModuleOptions } from "../interfaces";
5
+ import { MqMessageQueueService } from '../services/mq-message-queue.service';
6
+ import { MqMessageService } from '../services/mq-message.service';
7
+ import generateCodeQueueOptions from './generate-code-queue-options';
8
+
9
+ @Injectable()
10
+ export class GenerateCodePublisherRabbitmq extends RabbitMqPublisher<CodeGenerationOptions> {
11
+ constructor(
12
+ protected readonly mqMessageService: MqMessageService,
13
+ protected readonly mqMessageQueueService: MqMessageQueueService,
14
+ ) {
15
+ super(mqMessageService, mqMessageQueueService);
16
+ }
17
+
18
+ options(): QueuesModuleOptions {
19
+ return {
20
+ ...generateCodeQueueOptions
21
+ }
22
+ }
23
+ }
@@ -0,0 +1,9 @@
1
+ import { BrokerType } from "../interfaces";
2
+
3
+ const QUEUE_NAME = 'generate_code_queue_rabbitmq';
4
+
5
+ export default {
6
+ name: 'generateCodeQueueRabbitmq',
7
+ type: BrokerType.RabbitMQ,
8
+ queueName: QUEUE_NAME,
9
+ };
@@ -0,0 +1,59 @@
1
+ import { forwardRef, Inject, Injectable, Logger } from '@nestjs/common';
2
+
3
+ import { QueueMessage } from 'src/interfaces/mq';
4
+ import { DatabaseSubscriber } from 'src/services/queues/database-subscriber.service';
5
+ import { SolidFieldType } from 'src/dtos/create-field-metadata.dto';
6
+ import { ModelMetadataService } from 'src/services/model-metadata.service';
7
+ import { PollerService } from 'src/services/poller.service';
8
+ import { RabbitMqSubscriber } from 'src/services/queues/rabbitmq-subscriber.service';
9
+ import { CodeGenerationOptions, QueuesModuleOptions } from 'src/interfaces';
10
+ import { MqMessageQueueService } from 'src/services/mq-message-queue.service';
11
+ import { MqMessageService } from 'src/services/mq-message.service';
12
+ import generateCodeQueueOptions from './generate-code-queue-options';
13
+
14
+ @Injectable()
15
+ export class GenerateCodeSubscriberRabbitmq extends RabbitMqSubscriber<CodeGenerationOptions> {
16
+ private readonly generateCodeSubscriberLogger = new Logger(GenerateCodeSubscriberRabbitmq.name);
17
+
18
+ constructor(
19
+ readonly mqMessageService: MqMessageService,
20
+ readonly mqMessageQueueService: MqMessageQueueService,
21
+ readonly poller: PollerService,
22
+ @Inject(forwardRef(() => ModelMetadataService))
23
+ readonly modelMetadataService: ModelMetadataService,
24
+ ) {
25
+ super(mqMessageService, mqMessageQueueService);
26
+ }
27
+
28
+ options(): QueuesModuleOptions {
29
+ return {
30
+ ...generateCodeQueueOptions
31
+ }
32
+ }
33
+
34
+ async subscribe(message: QueueMessage<CodeGenerationOptions>) {
35
+ this.generateCodeSubscriberLogger.debug(`Received message: ${JSON.stringify(message)}`);
36
+
37
+ const codeGnerationOptions = message.payload;
38
+
39
+ const { model, removeFieldCodeOuput, refreshModelCodeOutput } = await this.modelMetadataService.generateCode(codeGnerationOptions);
40
+
41
+ // Generate the code for models which are linked to fields having an inverse relation
42
+ const coModelSingularNames = model.fields.
43
+ filter(field => field.type === SolidFieldType.relation && field.relationCreateInverse === true)
44
+ .map(field => field.relationCoModelSingularName);
45
+
46
+ for (const singularName of coModelSingularNames) {
47
+ const coModel = await this.modelMetadataService.findOneBySingularName(singularName);
48
+ const inverseOptions: CodeGenerationOptions = {
49
+ modelId: coModel.id,
50
+ dryRun: codeGnerationOptions.dryRun
51
+ };
52
+ await this.modelMetadataService.generateCode(inverseOptions);
53
+ }
54
+
55
+ await this.modelMetadataService.generateVAMConfig(model.id);
56
+
57
+ return `${removeFieldCodeOuput} \n ${refreshModelCodeOutput}`;
58
+ }
59
+ }
@@ -27,12 +27,20 @@ export class TestQueueSubscriber extends RabbitMqSubscriber<any> {
27
27
  // console.log(`Received message ${JSON.stringify(message)}`);
28
28
  this.testQueueLogger.debug(`Received message: ${JSON.stringify(message)}`);
29
29
 
30
- return new Promise((resolve, reject) => {
31
- // Simulate some processing time
32
- setTimeout(() => {
33
- this.testQueueLogger.debug(`Processed message: ${JSON.stringify(message)}`);
34
- resolve({ status: 'success', messageId: message.messageId, message: `Processed message` });
35
- }, 10000); // Simulate 1 second processing time
36
- });
30
+ let timeoutSecondsParsed = 10;
31
+ const timeoutSeconds = message?.payload?.timeoutSeconds;
32
+ if (timeoutSeconds) {
33
+ timeoutSecondsParsed = +timeoutSeconds;
34
+ }
35
+
36
+ this.testQueueLogger.debug(`Processing message with timeout: ${timeoutSecondsParsed}`);
37
+
38
+ // Simulate some processing time
39
+ setTimeout(() => {
40
+ this.testQueueLogger.debug(`Processed message: ${JSON.stringify(message)}`);
41
+ // resolve({ status: 'success', messageId: message.messageId, message: `Processed message` });
42
+ }, timeoutSecondsParsed * 1000);
43
+
44
+ // return new Promise((resolve, reject) => {});
37
45
  }
38
46
  }
@@ -0,0 +1,22 @@
1
+ import { Injectable } from "@nestjs/common";
2
+ import { QueuesModuleOptions, TriggerMcpClientOptions } from "src/interfaces";
3
+ import { MqMessageQueueService } from "src/services/mq-message-queue.service";
4
+ import { MqMessageService } from "src/services/mq-message.service";
5
+ import { RabbitMqPublisher } from "src/services/queues/rabbitmq-publisher.service";
6
+ import triggerMcpClientQueueOptions from "./trigger-mcp-client-queue-options";
7
+
8
+ @Injectable()
9
+ export class TriggerMcpClientPublisherRabbitmq extends RabbitMqPublisher<TriggerMcpClientOptions> {
10
+ constructor(
11
+ protected readonly mqMessageService: MqMessageService,
12
+ protected readonly mqMessageQueueService: MqMessageQueueService,
13
+ ) {
14
+ super(mqMessageService, mqMessageQueueService);
15
+ }
16
+
17
+ options(): QueuesModuleOptions {
18
+ return {
19
+ ...triggerMcpClientQueueOptions
20
+ };
21
+ }
22
+ }