@multiplayer-app/ai-agent-node 0.0.1

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 (210) hide show
  1. package/.env.example +45 -0
  2. package/README.md +611 -0
  3. package/config.example.json +73 -0
  4. package/dist/config.d.ts +35 -0
  5. package/dist/config.d.ts.map +1 -0
  6. package/dist/config.js +44 -0
  7. package/dist/config.js.map +1 -0
  8. package/dist/helpers/AIHelper.d.ts +23 -0
  9. package/dist/helpers/AIHelper.d.ts.map +1 -0
  10. package/dist/helpers/AIHelper.js +326 -0
  11. package/dist/helpers/AIHelper.js.map +1 -0
  12. package/dist/helpers/AIHelper.test.d.ts +2 -0
  13. package/dist/helpers/AIHelper.test.d.ts.map +1 -0
  14. package/dist/helpers/AIHelper.test.js +332 -0
  15. package/dist/helpers/AIHelper.test.js.map +1 -0
  16. package/dist/helpers/ConfigHelper.d.ts +20 -0
  17. package/dist/helpers/ConfigHelper.d.ts.map +1 -0
  18. package/dist/helpers/ConfigHelper.js +118 -0
  19. package/dist/helpers/ConfigHelper.js.map +1 -0
  20. package/dist/helpers/ContextLimiter.d.ts +82 -0
  21. package/dist/helpers/ContextLimiter.d.ts.map +1 -0
  22. package/dist/helpers/ContextLimiter.js +165 -0
  23. package/dist/helpers/ContextLimiter.js.map +1 -0
  24. package/dist/helpers/FileHelper.d.ts +31 -0
  25. package/dist/helpers/FileHelper.d.ts.map +1 -0
  26. package/dist/helpers/FileHelper.js +175 -0
  27. package/dist/helpers/FileHelper.js.map +1 -0
  28. package/dist/helpers/SetupHelper.d.ts +5 -0
  29. package/dist/helpers/SetupHelper.d.ts.map +1 -0
  30. package/dist/helpers/SetupHelper.js +32 -0
  31. package/dist/helpers/SetupHelper.js.map +1 -0
  32. package/dist/helpers/index.d.ts +6 -0
  33. package/dist/helpers/index.d.ts.map +1 -0
  34. package/dist/helpers/index.js +6 -0
  35. package/dist/helpers/index.js.map +1 -0
  36. package/dist/index.d.ts +18 -0
  37. package/dist/index.d.ts.map +1 -0
  38. package/dist/index.js +17 -0
  39. package/dist/index.js.map +1 -0
  40. package/dist/libs/index.d.ts +4 -0
  41. package/dist/libs/index.d.ts.map +1 -0
  42. package/dist/libs/index.js +4 -0
  43. package/dist/libs/index.js.map +1 -0
  44. package/dist/libs/kafka/config.d.ts +5 -0
  45. package/dist/libs/kafka/config.d.ts.map +1 -0
  46. package/dist/libs/kafka/config.js +5 -0
  47. package/dist/libs/kafka/config.js.map +1 -0
  48. package/dist/libs/kafka/consumer.d.ts +16 -0
  49. package/dist/libs/kafka/consumer.d.ts.map +1 -0
  50. package/dist/libs/kafka/consumer.js +126 -0
  51. package/dist/libs/kafka/consumer.js.map +1 -0
  52. package/dist/libs/kafka/index.d.ts +3 -0
  53. package/dist/libs/kafka/index.d.ts.map +1 -0
  54. package/dist/libs/kafka/index.js +3 -0
  55. package/dist/libs/kafka/index.js.map +1 -0
  56. package/dist/libs/kafka/kafka.d.ts +3 -0
  57. package/dist/libs/kafka/kafka.d.ts.map +1 -0
  58. package/dist/libs/kafka/kafka.js +24 -0
  59. package/dist/libs/kafka/kafka.js.map +1 -0
  60. package/dist/libs/kafka/producer.d.ts +11 -0
  61. package/dist/libs/kafka/producer.d.ts.map +1 -0
  62. package/dist/libs/kafka/producer.js +44 -0
  63. package/dist/libs/kafka/producer.js.map +1 -0
  64. package/dist/libs/logger/config.d.ts +5 -0
  65. package/dist/libs/logger/config.d.ts.map +1 -0
  66. package/dist/libs/logger/config.js +6 -0
  67. package/dist/libs/logger/config.js.map +1 -0
  68. package/dist/libs/logger/index.d.ts +10 -0
  69. package/dist/libs/logger/index.d.ts.map +1 -0
  70. package/dist/libs/logger/index.js +20 -0
  71. package/dist/libs/logger/index.js.map +1 -0
  72. package/dist/libs/logger/kafkajs-logger-creator.d.ts +12 -0
  73. package/dist/libs/logger/kafkajs-logger-creator.d.ts.map +1 -0
  74. package/dist/libs/logger/kafkajs-logger-creator.js +29 -0
  75. package/dist/libs/logger/kafkajs-logger-creator.js.map +1 -0
  76. package/dist/libs/logger/logger.d.ts +42 -0
  77. package/dist/libs/logger/logger.d.ts.map +1 -0
  78. package/dist/libs/logger/logger.js +44 -0
  79. package/dist/libs/logger/logger.js.map +1 -0
  80. package/dist/libs/s3/config.d.ts +7 -0
  81. package/dist/libs/s3/config.d.ts.map +1 -0
  82. package/dist/libs/s3/config.js +7 -0
  83. package/dist/libs/s3/config.js.map +1 -0
  84. package/dist/libs/s3/index.d.ts +4 -0
  85. package/dist/libs/s3/index.d.ts.map +1 -0
  86. package/dist/libs/s3/index.js +4 -0
  87. package/dist/libs/s3/index.js.map +1 -0
  88. package/dist/libs/s3/s3.lib.d.ts +25 -0
  89. package/dist/libs/s3/s3.lib.d.ts.map +1 -0
  90. package/dist/libs/s3/s3.lib.js +202 -0
  91. package/dist/libs/s3/s3.lib.js.map +1 -0
  92. package/dist/processors/ChatProcessor.d.ts +66 -0
  93. package/dist/processors/ChatProcessor.d.ts.map +1 -0
  94. package/dist/processors/ChatProcessor.js +610 -0
  95. package/dist/processors/ChatProcessor.js.map +1 -0
  96. package/dist/processors/ModelsProcessor.d.ts +11 -0
  97. package/dist/processors/ModelsProcessor.d.ts.map +1 -0
  98. package/dist/processors/ModelsProcessor.js +30 -0
  99. package/dist/processors/ModelsProcessor.js.map +1 -0
  100. package/dist/processors/index.d.ts +3 -0
  101. package/dist/processors/index.d.ts.map +1 -0
  102. package/dist/processors/index.js +3 -0
  103. package/dist/processors/index.js.map +1 -0
  104. package/dist/services/AIService.d.ts +48 -0
  105. package/dist/services/AIService.d.ts.map +1 -0
  106. package/dist/services/AIService.js +196 -0
  107. package/dist/services/AIService.js.map +1 -0
  108. package/dist/services/InternalEventsHandler.d.ts +21 -0
  109. package/dist/services/InternalEventsHandler.d.ts.map +1 -0
  110. package/dist/services/InternalEventsHandler.js +56 -0
  111. package/dist/services/InternalEventsHandler.js.map +1 -0
  112. package/dist/services/KafkaService.d.ts +35 -0
  113. package/dist/services/KafkaService.d.ts.map +1 -0
  114. package/dist/services/KafkaService.js +120 -0
  115. package/dist/services/KafkaService.js.map +1 -0
  116. package/dist/services/ModelFetcher.d.ts +54 -0
  117. package/dist/services/ModelFetcher.d.ts.map +1 -0
  118. package/dist/services/ModelFetcher.js +247 -0
  119. package/dist/services/ModelFetcher.js.map +1 -0
  120. package/dist/services/RedisService.d.ts +90 -0
  121. package/dist/services/RedisService.d.ts.map +1 -0
  122. package/dist/services/RedisService.js +236 -0
  123. package/dist/services/RedisService.js.map +1 -0
  124. package/dist/services/SocketService.d.ts +39 -0
  125. package/dist/services/SocketService.d.ts.map +1 -0
  126. package/dist/services/SocketService.js +128 -0
  127. package/dist/services/SocketService.js.map +1 -0
  128. package/dist/services/index.d.ts +7 -0
  129. package/dist/services/index.d.ts.map +1 -0
  130. package/dist/services/index.js +7 -0
  131. package/dist/services/index.js.map +1 -0
  132. package/dist/store/AgentStore.d.ts +48 -0
  133. package/dist/store/AgentStore.d.ts.map +1 -0
  134. package/dist/store/AgentStore.js +98 -0
  135. package/dist/store/AgentStore.js.map +1 -0
  136. package/dist/store/ArtifactStore.d.ts +13 -0
  137. package/dist/store/ArtifactStore.d.ts.map +1 -0
  138. package/dist/store/ArtifactStore.js +27 -0
  139. package/dist/store/ArtifactStore.js.map +1 -0
  140. package/dist/store/ConfigStore.d.ts +89 -0
  141. package/dist/store/ConfigStore.d.ts.map +1 -0
  142. package/dist/store/ConfigStore.js +214 -0
  143. package/dist/store/ConfigStore.js.map +1 -0
  144. package/dist/store/ConfigStore.test.d.ts +2 -0
  145. package/dist/store/ConfigStore.test.d.ts.map +1 -0
  146. package/dist/store/ConfigStore.test.js +259 -0
  147. package/dist/store/ConfigStore.test.js.map +1 -0
  148. package/dist/store/ModelStore.d.ts +44 -0
  149. package/dist/store/ModelStore.d.ts.map +1 -0
  150. package/dist/store/ModelStore.js +81 -0
  151. package/dist/store/ModelStore.js.map +1 -0
  152. package/dist/store/ModelStore.test.d.ts +2 -0
  153. package/dist/store/ModelStore.test.d.ts.map +1 -0
  154. package/dist/store/ModelStore.test.js +390 -0
  155. package/dist/store/ModelStore.test.js.map +1 -0
  156. package/dist/store/index.d.ts +5 -0
  157. package/dist/store/index.d.ts.map +1 -0
  158. package/dist/store/index.js +5 -0
  159. package/dist/store/index.js.map +1 -0
  160. package/dist/tools/generateChartTool.d.ts +24 -0
  161. package/dist/tools/generateChartTool.d.ts.map +1 -0
  162. package/dist/tools/generateChartTool.js +124 -0
  163. package/dist/tools/generateChartTool.js.map +1 -0
  164. package/dist/tools/proposeFormValuesTool.d.ts +35 -0
  165. package/dist/tools/proposeFormValuesTool.d.ts.map +1 -0
  166. package/dist/tools/proposeFormValuesTool.js +56 -0
  167. package/dist/tools/proposeFormValuesTool.js.map +1 -0
  168. package/package.json +71 -0
  169. package/src/config.ts +46 -0
  170. package/src/helpers/AIHelper.test.ts +375 -0
  171. package/src/helpers/AIHelper.ts +353 -0
  172. package/src/helpers/ConfigHelper.ts +130 -0
  173. package/src/helpers/ContextLimiter.ts +228 -0
  174. package/src/helpers/FileHelper.ts +197 -0
  175. package/src/helpers/SetupHelper.ts +35 -0
  176. package/src/helpers/index.ts +5 -0
  177. package/src/index.ts +18 -0
  178. package/src/libs/index.ts +3 -0
  179. package/src/libs/kafka/config.ts +4 -0
  180. package/src/libs/kafka/consumer.ts +161 -0
  181. package/src/libs/kafka/index.ts +2 -0
  182. package/src/libs/kafka/kafka.ts +27 -0
  183. package/src/libs/kafka/producer.ts +48 -0
  184. package/src/libs/logger/config.ts +4 -0
  185. package/src/libs/logger/index.ts +21 -0
  186. package/src/libs/logger/kafkajs-logger-creator.ts +28 -0
  187. package/src/libs/logger/logger.ts +60 -0
  188. package/src/libs/s3/config.ts +7 -0
  189. package/src/libs/s3/index.ts +3 -0
  190. package/src/libs/s3/s3.lib.ts +284 -0
  191. package/src/processors/ChatProcessor.ts +713 -0
  192. package/src/processors/ModelsProcessor.ts +34 -0
  193. package/src/processors/index.ts +2 -0
  194. package/src/services/AIService.ts +241 -0
  195. package/src/services/InternalEventsHandler.ts +61 -0
  196. package/src/services/KafkaService.ts +142 -0
  197. package/src/services/ModelFetcher.ts +286 -0
  198. package/src/services/RedisService.ts +285 -0
  199. package/src/services/SocketService.ts +153 -0
  200. package/src/services/index.ts +6 -0
  201. package/src/store/AgentStore.ts +138 -0
  202. package/src/store/ArtifactStore.ts +29 -0
  203. package/src/store/ConfigStore.test.ts +314 -0
  204. package/src/store/ConfigStore.ts +239 -0
  205. package/src/store/ModelStore.test.ts +473 -0
  206. package/src/store/ModelStore.ts +93 -0
  207. package/src/store/index.ts +4 -0
  208. package/src/tools/generateChartTool.ts +131 -0
  209. package/src/tools/proposeFormValuesTool.ts +67 -0
  210. package/tsconfig.json +24 -0
@@ -0,0 +1,165 @@
1
+ import { MessageRole } from '@multiplayer-app/ai-agent-types';
2
+ /**
3
+ * Common practices for limiting AI context:
4
+ *
5
+ * 1. **Message Count Limiting** (implemented here)
6
+ * - Keep only the last N messages
7
+ * - Most common and simplest approach
8
+ * - Typical values: 20-100 messages depending on use case
9
+ *
10
+ * 2. **Token-Based Limiting** (future enhancement)
11
+ * - Count tokens and keep messages until hitting token budget
12
+ * - More accurate for cost control
13
+ * - Requires token counting library (e.g., tiktoken, @anthropic-ai/tokenizer)
14
+ *
15
+ * 3. **Hybrid Approach** (future enhancement)
16
+ * - Combine message count with token budget as safety check
17
+ * - Best of both worlds
18
+ *
19
+ * 4. **Sliding Window with Summary** (advanced)
20
+ * - Keep recent messages + summarize older ones
21
+ * - Requires summarization step
22
+ *
23
+ * 5. **Priority-Based** (implemented via keepFirstUserMessage)
24
+ * - Always keep system messages, first user message, and recent messages
25
+ * - Preserves important context while limiting size
26
+ */
27
+ export class ContextLimiter {
28
+ /**
29
+ * Limits the context by keeping only the most recent messages
30
+ * while preserving important messages (first user message, system messages).
31
+ *
32
+ * @param messages - All messages from the chat (assumed to be in chronological order)
33
+ * @param options - Limiting options
34
+ * @returns Limited array of messages in original order
35
+ */
36
+ static limitContext(messages, options = {}) {
37
+ const { maxMessages = 5, keepFirstUserMessage = true, keepSystemMessages = true, } = options;
38
+ // If we have fewer messages than the limit, return all
39
+ if (messages.length <= maxMessages) {
40
+ return messages;
41
+ }
42
+ // Separate system messages from the rest
43
+ const systemMessages = [];
44
+ const nonSystemMessages = [];
45
+ messages.forEach((msg) => {
46
+ if (msg.role === MessageRole.System && keepSystemMessages) {
47
+ systemMessages.push(msg);
48
+ }
49
+ else {
50
+ nonSystemMessages.push(msg);
51
+ }
52
+ });
53
+ // Find the first user message (if we need to keep it)
54
+ const firstUserMessageIndex = keepFirstUserMessage
55
+ ? nonSystemMessages.findIndex((msg) => msg.role === MessageRole.User)
56
+ : -1;
57
+ const firstUserMessage = firstUserMessageIndex >= 0
58
+ ? nonSystemMessages[firstUserMessageIndex]
59
+ : undefined;
60
+ // Calculate how many recent messages we can keep
61
+ // Reserve slots for: system messages
62
+ let availableSlots = maxMessages - systemMessages.length;
63
+ const shouldKeepFirstUser = keepFirstUserMessage && firstUserMessage !== undefined;
64
+ // Get the most recent messages (from the end)
65
+ // We'll check if first user is in recent messages after slicing
66
+ const recentCount = Math.max(0, availableSlots);
67
+ const recentStartIndex = Math.max(0, nonSystemMessages.length - recentCount);
68
+ const recentMessages = nonSystemMessages.slice(recentStartIndex);
69
+ // Check if first user message is already in recent messages
70
+ const firstUserInRecent = shouldKeepFirstUser && firstUserMessage
71
+ ? recentMessages.some((msg) => msg.id === firstUserMessage.id)
72
+ : false;
73
+ // If first user is not in recent and we need to keep it, we need to make room
74
+ if (shouldKeepFirstUser && firstUserMessage && !firstUserInRecent) {
75
+ // Remove the oldest recent message to make room for first user message
76
+ if (recentMessages.length > 0) {
77
+ recentMessages.shift();
78
+ }
79
+ }
80
+ // Build the set of messages to keep
81
+ const messagesToKeep = new Set();
82
+ // Add system messages
83
+ systemMessages.forEach((msg) => messagesToKeep.add(msg.id));
84
+ // Add first user message if needed
85
+ if (shouldKeepFirstUser && firstUserMessage) {
86
+ messagesToKeep.add(firstUserMessage.id);
87
+ }
88
+ // Add recent messages
89
+ recentMessages.forEach((msg) => messagesToKeep.add(msg.id));
90
+ // Reconstruct in original order
91
+ return messages.filter((msg) => messagesToKeep.has(msg.id));
92
+ }
93
+ /**
94
+ * Estimates token count for a message (rough approximation).
95
+ * For accurate token counting, use a proper tokenizer library.
96
+ *
97
+ * This is a simple approximation: ~4 characters per token for English text.
98
+ *
99
+ * @param message - Message to estimate tokens for
100
+ * @returns Estimated token count
101
+ */
102
+ static estimateTokens(message) {
103
+ var _a;
104
+ const content = typeof message.content === 'string'
105
+ ? message.content
106
+ : JSON.stringify(message.content);
107
+ // Rough approximation: 1 token ≈ 4 characters for English
108
+ // This is a simplified estimate - actual tokenization varies by model
109
+ const baseTokens = Math.ceil(content.length / 4);
110
+ // Add overhead for message structure (role, formatting, etc.)
111
+ const overhead = 10;
112
+ // Add tokens for tool calls if present
113
+ const toolCallTokens = ((_a = message.toolCalls) === null || _a === void 0 ? void 0 : _a.reduce((acc, toolCall) => {
114
+ const inputTokens = Math.ceil(JSON.stringify(toolCall.input).length / 4);
115
+ const outputTokens = toolCall.output
116
+ ? Math.ceil(JSON.stringify(toolCall.output).length / 4)
117
+ : 0;
118
+ return acc + inputTokens + outputTokens + 20; // 20 for tool call structure
119
+ }, 0)) || 0;
120
+ return baseTokens + overhead + toolCallTokens;
121
+ }
122
+ /**
123
+ * Limits context by token count (future enhancement).
124
+ * Currently not implemented - requires proper tokenizer.
125
+ *
126
+ * @param messages - All messages from the chat
127
+ * @param maxTokens - Maximum token count
128
+ * @returns Limited array of messages
129
+ */
130
+ static limitByTokens(messages, maxTokens) {
131
+ // This is a placeholder for token-based limiting
132
+ // To implement properly, you would:
133
+ // 1. Install a tokenizer (e.g., tiktoken for OpenAI, @anthropic-ai/tokenizer for Claude)
134
+ // 2. Count tokens for each message
135
+ // 3. Keep messages from the end until hitting the token limit
136
+ // 4. Always keep system messages and optionally first user message
137
+ let totalTokens = 0;
138
+ const limitedMessages = [];
139
+ // Keep system messages first
140
+ const systemMessages = messages.filter((msg) => msg.role === MessageRole.System);
141
+ systemMessages.forEach((msg) => {
142
+ const tokens = this.estimateTokens(msg);
143
+ if (totalTokens + tokens <= maxTokens) {
144
+ limitedMessages.push(msg);
145
+ totalTokens += tokens;
146
+ }
147
+ });
148
+ // Then keep messages from the end
149
+ const nonSystemMessages = messages
150
+ .filter((msg) => msg.role !== MessageRole.System)
151
+ .reverse();
152
+ for (const message of nonSystemMessages) {
153
+ const tokens = this.estimateTokens(message);
154
+ if (totalTokens + tokens <= maxTokens) {
155
+ limitedMessages.unshift(message); // Add to beginning to maintain order
156
+ totalTokens += tokens;
157
+ }
158
+ else {
159
+ break;
160
+ }
161
+ }
162
+ return limitedMessages;
163
+ }
164
+ }
165
+ //# sourceMappingURL=ContextLimiter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ContextLimiter.js","sourceRoot":"","sources":["../../src/helpers/ContextLimiter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import type { AgentAttachment } from '@multiplayer-app/ai-agent-types';
2
+ export interface ProcessedAttachment extends AgentAttachment {
3
+ extractedText?: string;
4
+ processingStatus?: 'pending' | 'processed' | 'failed';
5
+ }
6
+ /**
7
+ * Checks if an attachment is an image
8
+ */
9
+ export declare function isImage(attachment: AgentAttachment): boolean;
10
+ /**
11
+ * Checks if an attachment is a document that can have text extracted
12
+ */
13
+ export declare function isDocument(attachment: AgentAttachment): boolean;
14
+ /**
15
+ * Extracts text from a document attachment
16
+ */
17
+ export declare function extractTextFromDocument(attachment: AgentAttachment): Promise<string | undefined>;
18
+ /**
19
+ * Processes an attachment and extracts content as needed
20
+ */
21
+ export declare function processAttachment(attachment: AgentAttachment): Promise<ProcessedAttachment>;
22
+ /**
23
+ * Prepares an image attachment for vision API
24
+ */
25
+ export declare function prepareImageForVisionAPI(attachment: AgentAttachment): Promise<{
26
+ type: 'image_url';
27
+ image_url: {
28
+ url: string;
29
+ };
30
+ } | null>;
31
+ //# sourceMappingURL=FileHelper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FileHelper.d.ts","sourceRoot":"","sources":["../../src/helpers/FileHelper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAOvE,MAAM,WAAW,mBAAoB,SAAQ,eAAe;IAC1D,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gBAAgB,CAAC,EAAE,SAAS,GAAG,WAAW,GAAG,QAAQ,CAAC;CACvD;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,UAAU,EAAE,eAAe,GAAG,OAAO,CAI5D;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,UAAU,EAAE,eAAe,GAAG,OAAO,CAI/D;AAED;;GAEG;AACH,wBAAsB,uBAAuB,CAC3C,UAAU,EAAE,eAAe,GAC1B,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CA4C7B;AAsCD;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,UAAU,EAAE,eAAe,GAC1B,OAAO,CAAC,mBAAmB,CAAC,CA4B9B;AAED;;GAEG;AACH,wBAAsB,wBAAwB,CAAC,UAAU,EAAE,eAAe,GAAG,OAAO,CAAC;IACnF,IAAI,EAAE,WAAW,CAAC;IAClB,SAAS,EAAE;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;CAC5B,GAAG,IAAI,CAAC,CAsCR"}
@@ -0,0 +1,175 @@
1
+ import { AgentAttachmentType } from '@multiplayer-app/ai-agent-types';
2
+ import { s3 } from '../libs/s3';
3
+ import { logger } from '../libs/logger';
4
+ import { config } from "../config";
5
+ /**
6
+ * Checks if an attachment is an image
7
+ */
8
+ export function isImage(attachment) {
9
+ if (attachment.type !== AgentAttachmentType.File)
10
+ return false;
11
+ const mimeType = attachment.mimeType || '';
12
+ return mimeType.startsWith('image/');
13
+ }
14
+ /**
15
+ * Checks if an attachment is a document that can have text extracted
16
+ */
17
+ export function isDocument(attachment) {
18
+ if (attachment.type !== AgentAttachmentType.File)
19
+ return false;
20
+ const mimeType = attachment.mimeType || '';
21
+ return mimeType.startsWith('text/') || mimeType.startsWith('application/');
22
+ }
23
+ /**
24
+ * Extracts text from a document attachment
25
+ */
26
+ export async function extractTextFromDocument(attachment) {
27
+ var _a;
28
+ if (!isDocument(attachment) || attachment.type !== AgentAttachmentType.File) {
29
+ logger.debug('Attachment is not a document or not a file type', {
30
+ attachmentId: attachment.id,
31
+ type: attachment.type,
32
+ mimeType: attachment.mimeType
33
+ });
34
+ return undefined;
35
+ }
36
+ try {
37
+ const mimeType = attachment.mimeType || '';
38
+ // All files are stored in S3 (s3Key is in metadata)
39
+ if ((_a = attachment.metadata) === null || _a === void 0 ? void 0 : _a.s3Key) {
40
+ const s3Key = attachment.metadata.s3Key;
41
+ const bucket = config.s3.bucket;
42
+ if (mimeType === 'application/pdf') {
43
+ const buffer = await s3.downloadFileAsByteArray(s3Key, bucket);
44
+ if (buffer) {
45
+ // Convert Uint8Array to Buffer
46
+ const nodeBuffer = Buffer.from(buffer);
47
+ return await extractTextFromPDF(nodeBuffer);
48
+ }
49
+ }
50
+ else if (mimeType === 'application/vnd.openxmlformats-officedocument.wordprocessingml.document') {
51
+ const buffer = await s3.downloadFileAsByteArray(s3Key, bucket);
52
+ if (buffer) {
53
+ // Convert Uint8Array to Buffer
54
+ const nodeBuffer = Buffer.from(buffer);
55
+ return await extractTextFromDOCX(nodeBuffer);
56
+ }
57
+ }
58
+ else {
59
+ const text = await s3.downloadFileAsString(s3Key, bucket);
60
+ return text || undefined;
61
+ }
62
+ }
63
+ return undefined;
64
+ }
65
+ catch (error) {
66
+ logger.error('Failed to extract text from document', { error, attachmentId: attachment.id });
67
+ return undefined;
68
+ }
69
+ }
70
+ /**
71
+ * Extracts text from PDF buffer
72
+ */
73
+ async function extractTextFromPDF(buffer) {
74
+ try {
75
+ const { PDFParse } = await import('pdf-parse');
76
+ const parser = new PDFParse({ data: buffer });
77
+ const text = (await parser.getText()).text || '';
78
+ // Limit extracted text size
79
+ const maxSize = Number(process.env.MAX_EXTRACTED_TEXT_SIZE) || 51200;
80
+ return text.length > maxSize ? text.substring(0, maxSize) + '...' : text;
81
+ }
82
+ catch (error) {
83
+ logger.warn('PDF text extraction failed (pdf-parse may not be installed)', { error });
84
+ return undefined;
85
+ }
86
+ }
87
+ /**
88
+ * Extracts text from DOCX buffer
89
+ */
90
+ async function extractTextFromDOCX(buffer) {
91
+ try {
92
+ const mammoth = await import('mammoth');
93
+ const result = await mammoth.extractRawText({ buffer });
94
+ const text = result.value || '';
95
+ // Limit extracted text size
96
+ const maxSize = Number(process.env.MAX_EXTRACTED_TEXT_SIZE) || 51200;
97
+ return text.length > maxSize ? text.substring(0, maxSize) + '...' : text;
98
+ }
99
+ catch (error) {
100
+ logger.warn('DOCX text extraction failed (mammoth may not be installed)', { error });
101
+ return undefined;
102
+ }
103
+ }
104
+ /**
105
+ * Processes an attachment and extracts content as needed
106
+ */
107
+ export async function processAttachment(attachment) {
108
+ const processed = { ...attachment };
109
+ // Only process file attachments
110
+ if (attachment.type !== AgentAttachmentType.File) {
111
+ return processed;
112
+ }
113
+ // Check if text extraction is enabled
114
+ const enableTextExtraction = process.env.ENABLE_TEXT_EXTRACTION !== 'false';
115
+ if (enableTextExtraction && isDocument(attachment)) {
116
+ try {
117
+ processed.processingStatus = 'pending';
118
+ const extractedText = await extractTextFromDocument(attachment);
119
+ if (extractedText) {
120
+ processed.extractedText = extractedText;
121
+ processed.processingStatus = 'processed';
122
+ }
123
+ else {
124
+ processed.processingStatus = 'failed';
125
+ }
126
+ }
127
+ catch (error) {
128
+ logger.error('Failed to process document attachment', { error, attachmentId: attachment.id });
129
+ processed.processingStatus = 'failed';
130
+ }
131
+ }
132
+ return processed;
133
+ }
134
+ /**
135
+ * Prepares an image attachment for vision API
136
+ */
137
+ export async function prepareImageForVisionAPI(attachment) {
138
+ var _a;
139
+ if (!isImage(attachment) || attachment.type !== AgentAttachmentType.File) {
140
+ return null;
141
+ }
142
+ // All files are stored in S3 - generate presigned download URL
143
+ if ((_a = attachment.metadata) === null || _a === void 0 ? void 0 : _a.s3Key) {
144
+ try {
145
+ const s3Key = attachment.metadata.s3Key;
146
+ const bucket = config.s3.bucket;
147
+ const buffer = await s3.downloadFileAsByteArray(s3Key, bucket);
148
+ if (!buffer) {
149
+ return null;
150
+ }
151
+ const mimeType = attachment.mimeType || 'image/png';
152
+ return {
153
+ type: 'image_url',
154
+ image_url: {
155
+ url: `data:${mimeType};base64,${Buffer.from(buffer).toString('base64')}`,
156
+ },
157
+ };
158
+ }
159
+ catch (error) {
160
+ logger.error('Failed to generate presigned URL for S3 image', { error, attachmentId: attachment.id });
161
+ return null;
162
+ }
163
+ }
164
+ // Fallback: If we have a URL (backward compatibility)
165
+ if (attachment.url) {
166
+ return {
167
+ type: 'image_url',
168
+ image_url: {
169
+ url: attachment.url,
170
+ },
171
+ };
172
+ }
173
+ return null;
174
+ }
175
+ //# sourceMappingURL=FileHelper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FileHelper.js","sourceRoot":"","sources":["../../src/helpers/FileHelper.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { AgentChatRepository, AgentMessageRepository } from '@multiplayer-app/ai-agent-db';
2
+ export declare function fetchModels(): Promise<void>;
3
+ export declare function startServices(agentChatRepository: AgentChatRepository, agentMessageRepository: AgentMessageRepository): Promise<[void, void, void, void]>;
4
+ export declare function stopServices(): Promise<[void, void]>;
5
+ //# sourceMappingURL=SetupHelper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SetupHelper.d.ts","sourceRoot":"","sources":["../../src/helpers/SetupHelper.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AAE3F,wBAAsB,WAAW,kBAShC;AAED,wBAAgB,aAAa,CAAC,mBAAmB,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,sBAAsB,qCASrH;AAED,wBAAgB,YAAY,0BAK3B"}
@@ -0,0 +1,32 @@
1
+ import { logger } from '../libs/logger';
2
+ import { agentStore, ModelStore } from '../store';
3
+ import { redisService, kafkaService, ModelFetcher } from '../services';
4
+ import { s3 } from "../libs/s3";
5
+ import { config } from "../config";
6
+ export async function fetchModels() {
7
+ try {
8
+ const modelFetcher = new ModelFetcher();
9
+ const models = await modelFetcher.fetchAllModels();
10
+ ModelStore.getInstance().setModels(models);
11
+ }
12
+ catch (error) {
13
+ logger.error('Failed to fetch models on startup:', error);
14
+ throw error;
15
+ }
16
+ }
17
+ export function startServices(agentChatRepository, agentMessageRepository) {
18
+ kafkaService.setRepositories(agentChatRepository, agentMessageRepository);
19
+ return Promise.all([
20
+ kafkaService.start(),
21
+ agentStore.initialize(),
22
+ fetchModels(),
23
+ s3.ensureBucketExists(config.s3.bucket),
24
+ ]);
25
+ }
26
+ export function stopServices() {
27
+ return Promise.all([
28
+ redisService.disconnect(),
29
+ kafkaService.stop()
30
+ ]);
31
+ }
32
+ //# sourceMappingURL=SetupHelper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SetupHelper.js","sourceRoot":"","sources":["../../src/helpers/SetupHelper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACvE,OAAO,EAAE,EAAE,EAAE,MAAM,YAAY,CAAC;AAChC,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAGnC,MAAM,CAAC,KAAK,UAAU,WAAW;IAC7B,IAAI,CAAC;QACH,MAAM,YAAY,GAAG,IAAI,YAAY,EAAE,CAAC;QACxC,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,cAAc,EAAE,CAAC;QACnD,UAAU,CAAC,WAAW,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAC7C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,oCAAoC,EAAE,KAAK,CAAC,CAAC;QAC1D,MAAM,KAAK,CAAC;IACd,CAAC;AACL,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,mBAAwC,EAAE,sBAA8C;IACpH,YAAY,CAAC,eAAe,CAAC,mBAAmB,EAAE,sBAAsB,CAAC,CAAC;IAE1E,OAAO,OAAO,CAAC,GAAG,CAAC;QACjB,YAAY,CAAC,KAAK,EAAE;QACpB,UAAU,CAAC,UAAU,EAAE;QACvB,WAAW,EAAE;QACb,EAAE,CAAC,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC;KACxC,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,OAAO,OAAO,CAAC,GAAG,CAAC;QACjB,YAAY,CAAC,UAAU,EAAE;QACzB,YAAY,CAAC,IAAI,EAAE;KACpB,CAAC,CAAA;AACJ,CAAC"}
@@ -0,0 +1,6 @@
1
+ export * from './AIHelper';
2
+ export * from './ConfigHelper';
3
+ export * from './ContextLimiter';
4
+ export * from './FileHelper';
5
+ export * from './SetupHelper';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/helpers/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC"}
@@ -0,0 +1,6 @@
1
+ export * from './AIHelper';
2
+ export * from './ConfigHelper';
3
+ export * from './ContextLimiter';
4
+ export * from './FileHelper';
5
+ export * from './SetupHelper';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/helpers/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC"}
@@ -0,0 +1,18 @@
1
+ export { kafkaService } from './services/KafkaService';
2
+ export { redisService } from './services/RedisService';
3
+ export { socketService } from './services/SocketService';
4
+ export { agentStore, AgentProcessEventType } from './store/AgentStore';
5
+ export type { AgentProcessEvent, AgentProcessListener, AgentProcess, AgentProcessEventPayload } from './store/AgentStore';
6
+ export { ConfigStore } from './store/ConfigStore';
7
+ export { ModelStore } from './store/ModelStore';
8
+ export { ArtifactStore } from './store/ArtifactStore';
9
+ export { ChatProcessor, ModelsProcessor } from './processors';
10
+ export { startServices, stopServices } from './helpers/SetupHelper';
11
+ export { createProposeFormValuesTool, proposeFormValuesToolName } from './tools/proposeFormValuesTool';
12
+ export { s3 } from './libs/s3';
13
+ export { setLogger, getLogger, logger, type AgentLogger } from './libs/logger';
14
+ export * as store from "./store";
15
+ export * as services from "./services";
16
+ export * as processors from "./processors";
17
+ export * as helpers from "./helpers";
18
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AACvE,YAAY,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,YAAY,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAC1H,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACpE,OAAO,EAAE,2BAA2B,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAC;AACvG,OAAO,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC;AAC/B,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,WAAW,EAAE,MAAM,eAAe,CAAC;AAE/E,OAAO,KAAK,KAAK,MAAM,SAAS,CAAC;AACjC,OAAO,KAAK,QAAQ,MAAM,YAAY,CAAC;AACvC,OAAO,KAAK,UAAU,MAAM,cAAc,CAAC;AAC3C,OAAO,KAAK,OAAO,MAAM,WAAW,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,17 @@
1
+ export { kafkaService } from './services/KafkaService';
2
+ export { redisService } from './services/RedisService';
3
+ export { socketService } from './services/SocketService';
4
+ export { agentStore, AgentProcessEventType } from './store/AgentStore';
5
+ export { ConfigStore } from './store/ConfigStore';
6
+ export { ModelStore } from './store/ModelStore';
7
+ export { ArtifactStore } from './store/ArtifactStore';
8
+ export { ChatProcessor, ModelsProcessor } from './processors';
9
+ export { startServices, stopServices } from './helpers/SetupHelper';
10
+ export { createProposeFormValuesTool, proposeFormValuesToolName } from './tools/proposeFormValuesTool';
11
+ export { s3 } from './libs/s3';
12
+ export { setLogger, getLogger, logger } from './libs/logger';
13
+ export * as store from "./store";
14
+ export * as services from "./services";
15
+ export * as processors from "./processors";
16
+ export * as helpers from "./helpers";
17
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAEvE,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACpE,OAAO,EAAE,2BAA2B,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAC;AACvG,OAAO,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC;AAC/B,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAoB,MAAM,eAAe,CAAC;AAE/E,OAAO,KAAK,KAAK,MAAM,SAAS,CAAC;AACjC,OAAO,KAAK,QAAQ,MAAM,YAAY,CAAC;AACvC,OAAO,KAAK,UAAU,MAAM,cAAc,CAAC;AAC3C,OAAO,KAAK,OAAO,MAAM,WAAW,CAAC"}
@@ -0,0 +1,4 @@
1
+ export * from './kafka';
2
+ export * from './logger';
3
+ export * from './s3';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/libs/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,cAAc,MAAM,CAAC"}
@@ -0,0 +1,4 @@
1
+ export * from './kafka';
2
+ export * from './logger';
3
+ export * from './s3';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/libs/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,cAAc,MAAM,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare const SERVICE_NAME: string | undefined;
2
+ export declare const KAFKA_URI: string[];
3
+ export declare const KAFKA_CLIENT_ID: string | undefined;
4
+ export declare const KAFKA_SESSION_TIMEOUT: number;
5
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/libs/kafka/config.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,YAAY,oBAA+B,CAAA;AACxD,eAAO,MAAM,SAAS,UAAmE,CAAA;AACzF,eAAO,MAAM,eAAe,oBAAwD,CAAA;AACpF,eAAO,MAAM,qBAAqB,QAAgE,CAAA"}
@@ -0,0 +1,5 @@
1
+ export const SERVICE_NAME = process.env.npm_package_name;
2
+ export const KAFKA_URI = (process.env.KAFKA_URI || 'localhost:9092').split(',');
3
+ export const KAFKA_CLIENT_ID = process.env.KAFKA_CLIENT_ID || SERVICE_NAME;
4
+ export const KAFKA_SESSION_TIMEOUT = Number.parseInt(process.env.KAFKA_SESSION_TIMEOUT || '30000');
5
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/libs/kafka/config.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAA;AACxD,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,SAAmB,IAAI,gBAAgB,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;AACzF,MAAM,CAAC,MAAM,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC,eAAyB,IAAI,YAAY,CAAA;AACpF,MAAM,CAAC,MAAM,qBAAqB,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,OAAO,CAAC,CAAA"}
@@ -0,0 +1,16 @@
1
+ import { ConsumerRunConfig, IHeaders } from 'kafkajs';
2
+ export type KafkaConsumerListener = (key: any, value: any, headers?: IHeaders) => void | Promise<void>;
3
+ export declare class KafkaConsumer {
4
+ private consumer;
5
+ private listeners;
6
+ private lastHeartbeat;
7
+ constructor(groupId: string);
8
+ isConnected(): Promise<boolean>;
9
+ connect(): Promise<void>;
10
+ disconnect(): Promise<void>;
11
+ subscribe(topic: string, listener: KafkaConsumerListener): Promise<void>;
12
+ private listenFnWrapper;
13
+ listen(options?: Omit<ConsumerRunConfig, 'eachMessage' | 'eachBatch'>): Promise<void>;
14
+ listenBatch(options: Omit<ConsumerRunConfig, 'eachMessage' | 'eachBatch'>): Promise<void>;
15
+ }
16
+ //# sourceMappingURL=consumer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"consumer.d.ts","sourceRoot":"","sources":["../../../src/libs/kafka/consumer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,iBAAiB,EAAE,QAAQ,EAAW,MAAM,SAAS,CAAA;AAcxE,MAAM,MAAM,qBAAqB,GAAG,CAAC,GAAG,KAAA,EAAE,KAAK,KAAA,EAAE,OAAO,CAAC,EAAE,QAAQ,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;AAC5F,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAU;IAC1B,OAAO,CAAC,SAAS,CAA8C;IAC/D,OAAO,CAAC,aAAa,CAAY;gBAErB,OAAO,EAAE,MAAM;IAgBd,WAAW;IAYX,OAAO;IAIP,UAAU;IAIV,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,qBAAqB;YASvD,eAAe;IAwChB,MAAM,CAAC,OAAO,GAAE,IAAI,CAAC,iBAAiB,EAAE,aAAa,GAAG,WAAW,CAE/E;IAeY,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,iBAAiB,EAAE,aAAa,GAAG,WAAW,CAAC;CAsCvF"}