@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,332 @@
1
+ import { describe, it, expect, beforeAll } from 'vitest';
2
+ import { AIHelper } from './AIHelper';
3
+ import { ModelStore } from '../store/ModelStore';
4
+ import { MessageRole, AgentToolCallStatus } from '@multiplayer-app/ai-agent-types';
5
+ describe('AIHelper.getAssistantResponse', () => {
6
+ let modelStore;
7
+ let configStore;
8
+ beforeAll(() => {
9
+ // Setup real ModelStore instance
10
+ modelStore = ModelStore.getInstance();
11
+ modelStore.setModels([
12
+ { id: 'openai/gpt-4o', label: 'GPT-4o Mini', provider: 'openrouter' }
13
+ ]);
14
+ });
15
+ describe('with tool approval responses', () => {
16
+ it('should handle approved tool with successful execution', async () => {
17
+ // Note: getAssistantResponse accepts Pick<AgentMessage, 'role' | 'content'>[]
18
+ // but convertMessages internally handles toolCalls, so we cast for testing
19
+ const messages = [
20
+ {
21
+ role: MessageRole.User,
22
+ content: 'Please execute the tool'
23
+ },
24
+ {
25
+ role: MessageRole.Assistant,
26
+ content: 'I will execute the tool for you.',
27
+ toolCalls: [
28
+ {
29
+ id: 'tool-call-1',
30
+ name: 'test-tool',
31
+ input: { param: 'value' },
32
+ status: AgentToolCallStatus.Succeeded,
33
+ approved: true,
34
+ output: { result: 'success', data: { executed: true } }
35
+ }
36
+ ]
37
+ }
38
+ ];
39
+ const response = await AIHelper.getAssistantResponse(messages);
40
+ // Verify we get a response (actual model call)
41
+ expect(response).toBeDefined();
42
+ expect(typeof response).toBe('string');
43
+ expect(response.length).toBeGreaterThan(0);
44
+ // The response should acknowledge the tool execution
45
+ // (exact text depends on model, so we just verify it's a valid response)
46
+ }, 30000);
47
+ it('should handle denied tool with execution-denied output', async () => {
48
+ const messages = [
49
+ {
50
+ role: MessageRole.User,
51
+ content: 'Please execute the tool'
52
+ },
53
+ {
54
+ role: MessageRole.Assistant,
55
+ content: 'I will execute the tool for you.',
56
+ toolCalls: [
57
+ {
58
+ id: 'tool-call-1',
59
+ name: 'test-tool',
60
+ input: { param: 'value' },
61
+ status: AgentToolCallStatus.Succeeded,
62
+ approved: false,
63
+ reason: 'User denied execution',
64
+ output: {
65
+ type: 'execution-denied',
66
+ reason: 'User denied execution'
67
+ }
68
+ }
69
+ ]
70
+ }
71
+ ];
72
+ const response = await AIHelper.getAssistantResponse(messages);
73
+ // Verify we get a response acknowledging the denial
74
+ expect(response).toBeDefined();
75
+ expect(typeof response).toBe('string');
76
+ expect(response.length).toBeGreaterThan(0);
77
+ // The model should respond to the execution-denied output
78
+ }, 30000);
79
+ it('should handle multiple tools with mixed approvals', async () => {
80
+ const messages = [
81
+ {
82
+ role: MessageRole.User,
83
+ content: 'Execute multiple tools'
84
+ },
85
+ {
86
+ role: MessageRole.Assistant,
87
+ content: 'I will execute the tools.',
88
+ toolCalls: [
89
+ {
90
+ id: 'tool-call-1',
91
+ name: 'approved-tool',
92
+ input: { param: 'value1' },
93
+ status: AgentToolCallStatus.Succeeded,
94
+ approved: true,
95
+ output: { result: 'approved-result' }
96
+ },
97
+ {
98
+ id: 'tool-call-2',
99
+ name: 'denied-tool',
100
+ input: { param: 'value2' },
101
+ status: AgentToolCallStatus.Succeeded,
102
+ approved: false,
103
+ reason: 'Not allowed',
104
+ output: {
105
+ type: 'execution-denied',
106
+ reason: 'Not allowed'
107
+ }
108
+ }
109
+ ]
110
+ }
111
+ ];
112
+ const response = await AIHelper.getAssistantResponse(messages);
113
+ // Verify we get a response handling both tool results
114
+ expect(response).toBeDefined();
115
+ expect(typeof response).toBe('string');
116
+ expect(response.length).toBeGreaterThan(0);
117
+ // The model should process both approved and denied tool results
118
+ }, 30000);
119
+ it('should handle tool execution failure', async () => {
120
+ const messages = [
121
+ {
122
+ role: MessageRole.User,
123
+ content: 'Execute the tool'
124
+ },
125
+ {
126
+ role: MessageRole.Assistant,
127
+ content: 'I will execute the tool.',
128
+ toolCalls: [
129
+ {
130
+ id: 'tool-call-1',
131
+ name: 'failing-tool',
132
+ input: { param: 'value' },
133
+ status: AgentToolCallStatus.Failed,
134
+ approved: true,
135
+ error: 'Tool execution failed: Network error'
136
+ }
137
+ ]
138
+ }
139
+ ];
140
+ const response = await AIHelper.getAssistantResponse(messages);
141
+ // Verify we get a response even when tool execution failed
142
+ expect(response).toBeDefined();
143
+ expect(typeof response).toBe('string');
144
+ expect(response.length).toBeGreaterThan(0);
145
+ }, 30000);
146
+ it('should handle tool with execution-denied due to tool not found', async () => {
147
+ const messages = [
148
+ {
149
+ role: MessageRole.User,
150
+ content: 'Execute the tool'
151
+ },
152
+ {
153
+ role: MessageRole.Assistant,
154
+ content: 'I will execute the tool.',
155
+ toolCalls: [
156
+ {
157
+ id: 'tool-call-1',
158
+ name: 'missing-tool',
159
+ input: { param: 'value' },
160
+ status: AgentToolCallStatus.Succeeded,
161
+ approved: true,
162
+ output: {
163
+ type: 'execution-denied',
164
+ reason: 'Tool was not found'
165
+ }
166
+ }
167
+ ]
168
+ }
169
+ ];
170
+ const response = await AIHelper.getAssistantResponse(messages);
171
+ // Verify we get a response when tool was not found
172
+ expect(response).toBeDefined();
173
+ expect(typeof response).toBe('string');
174
+ expect(response.length).toBeGreaterThan(0);
175
+ }, 30000);
176
+ it('should handle tool with execution-denied due to tool execution error', async () => {
177
+ const messages = [
178
+ {
179
+ role: MessageRole.User,
180
+ content: 'Execute the tool'
181
+ },
182
+ {
183
+ role: MessageRole.Assistant,
184
+ content: 'I will execute the tool.',
185
+ toolCalls: [
186
+ {
187
+ id: 'tool-call-1',
188
+ name: 'error-tool',
189
+ input: { param: 'value' },
190
+ status: AgentToolCallStatus.Succeeded,
191
+ approved: true,
192
+ output: {
193
+ type: 'execution-denied',
194
+ reason: 'Tool failed with error'
195
+ }
196
+ }
197
+ ]
198
+ }
199
+ ];
200
+ const response = await AIHelper.getAssistantResponse(messages);
201
+ // Verify we get a response when tool execution had an error
202
+ expect(response).toBeDefined();
203
+ expect(typeof response).toBe('string');
204
+ expect(response.length).toBeGreaterThan(0);
205
+ }, 30000);
206
+ it('should handle messages without tool calls', async () => {
207
+ const messages = [
208
+ {
209
+ role: MessageRole.User,
210
+ content: 'Hello, how are you?'
211
+ },
212
+ {
213
+ role: MessageRole.Assistant,
214
+ content: 'I am doing well, thank you!'
215
+ }
216
+ ];
217
+ const response = await AIHelper.getAssistantResponse(messages);
218
+ // Verify we get a response for normal conversation
219
+ expect(response).toBeDefined();
220
+ expect(typeof response).toBe('string');
221
+ expect(response.length).toBeGreaterThan(0);
222
+ }, 30000);
223
+ it('should handle tool calls without output (pending approval)', async () => {
224
+ const messages = [
225
+ {
226
+ role: MessageRole.User,
227
+ content: 'Execute the tool'
228
+ },
229
+ {
230
+ role: MessageRole.Assistant,
231
+ content: 'I need to execute a tool.',
232
+ toolCalls: [
233
+ {
234
+ id: 'tool-call-1',
235
+ name: 'pending-tool',
236
+ input: { param: 'value' },
237
+ status: AgentToolCallStatus.Pending,
238
+ requiresConfirmation: true,
239
+ approvalId: 'approval-123'
240
+ }
241
+ ]
242
+ }
243
+ ];
244
+ const response = await AIHelper.getAssistantResponse(messages);
245
+ // Verify we get a response even when tool is pending approval
246
+ // (tool calls without output should not include tool-result in messages)
247
+ expect(response).toBeDefined();
248
+ expect(typeof response).toBe('string');
249
+ expect(response.length).toBeGreaterThan(0);
250
+ }, 30000);
251
+ it('should handle sequential tool approvals', async () => {
252
+ const messages = [
253
+ {
254
+ role: MessageRole.User,
255
+ content: 'First request'
256
+ },
257
+ {
258
+ role: MessageRole.Assistant,
259
+ content: 'Executing first tool.',
260
+ toolCalls: [
261
+ {
262
+ id: 'tool-call-1',
263
+ name: 'first-tool',
264
+ input: { step: 1 },
265
+ status: AgentToolCallStatus.Succeeded,
266
+ approved: true,
267
+ output: { result: 'first-result' }
268
+ }
269
+ ]
270
+ },
271
+ {
272
+ role: MessageRole.Assistant,
273
+ content: 'Now executing second tool.',
274
+ toolCalls: [
275
+ {
276
+ id: 'tool-call-2',
277
+ name: 'second-tool',
278
+ input: { step: 2 },
279
+ status: AgentToolCallStatus.Succeeded,
280
+ approved: false,
281
+ reason: 'User denied',
282
+ output: {
283
+ type: 'execution-denied',
284
+ reason: 'User denied'
285
+ }
286
+ }
287
+ ]
288
+ }
289
+ ];
290
+ const response = await AIHelper.getAssistantResponse(messages);
291
+ // Verify we get a response for sequential tool calls
292
+ expect(response).toBeDefined();
293
+ expect(typeof response).toBe('string');
294
+ expect(response.length).toBeGreaterThan(0);
295
+ // The model should process both sequential tool results
296
+ }, 30000);
297
+ it('should pass through options correctly', async () => {
298
+ const messages = [
299
+ {
300
+ role: MessageRole.User,
301
+ content: 'Test message'
302
+ }
303
+ ];
304
+ const response = await AIHelper.getAssistantResponse(messages, undefined, {
305
+ temperature: 0.9,
306
+ maxOutputTokens: 1000
307
+ });
308
+ // Verify we get a response with custom options applied
309
+ expect(response).toBeDefined();
310
+ expect(typeof response).toBe('string');
311
+ expect(response.length).toBeGreaterThan(0);
312
+ // Options are passed through to the model
313
+ }, 30000);
314
+ it('should handle abort signal', async () => {
315
+ const messages = [
316
+ {
317
+ role: MessageRole.User,
318
+ content: 'Test message'
319
+ }
320
+ ];
321
+ const abortController = new AbortController();
322
+ const signal = abortController.signal;
323
+ const response = await AIHelper.getAssistantResponse(messages, signal);
324
+ // Verify we get a response with abort signal passed through
325
+ expect(response).toBeDefined();
326
+ expect(typeof response).toBe('string');
327
+ expect(response.length).toBeGreaterThan(0);
328
+ // Signal is passed through to the model for cancellation support
329
+ }, 30000);
330
+ });
331
+ });
332
+ //# sourceMappingURL=AIHelper.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AIHelper.test.js","sourceRoot":"","sources":["../../src/helpers/AIHelper.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { AgentAppConfig } from '@multiplayer-app/ai-agent-types';
2
+ export declare class ConfigHelper {
3
+ static loadConfig(rawConfig: Record<string, any>): AgentAppConfig;
4
+ private static jsonSchemaToZod;
5
+ /**
6
+ * Converts raw JSON config to AgentAppConfig format
7
+ * Validates structure and converts JSON schemas to Zod schemas
8
+ */
9
+ private static convertToAgentAppConfig;
10
+ /**
11
+ * Converts a tool from JSON format (with JSON schemas) to AgentTool format (with Zod schemas)
12
+ */
13
+ private static convertTool;
14
+ /**
15
+ * Validates the AgentAppConfig structure
16
+ * @throws Error if validation fails
17
+ */
18
+ private static validateConfig;
19
+ }
20
+ //# sourceMappingURL=ConfigHelper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConfigHelper.d.ts","sourceRoot":"","sources":["../../src/helpers/ConfigHelper.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAa,MAAM,iCAAiC,CAAC;AAIjF,qBAAa,YAAY;IAEvB,MAAM,CAAC,UAAU,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,cAAc;IAcjE,OAAO,CAAC,MAAM,CAAC,eAAe;IAK9B;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,uBAAuB;IAwBtC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,WAAW;IA8B1B;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,cAAc;CAsC9B"}
@@ -0,0 +1,118 @@
1
+ import { z } from 'zod';
2
+ import { AgentToolType } from '@multiplayer-app/ai-agent-types';
3
+ import { logger } from '../libs/logger';
4
+ export class ConfigHelper {
5
+ static loadConfig(rawConfig) {
6
+ try {
7
+ // Convert to AgentAppConfig format
8
+ return ConfigHelper.convertToAgentAppConfig(rawConfig);
9
+ }
10
+ catch (error) {
11
+ if (error instanceof SyntaxError) {
12
+ logger.error(`Failed to parse config.json: ${error.message}`);
13
+ throw new Error(`Invalid JSON in config file: ${error.message}`);
14
+ }
15
+ logger.error(`Failed to load config: ${error}`);
16
+ throw error;
17
+ }
18
+ }
19
+ static jsonSchemaToZod(schema) {
20
+ if (!schema)
21
+ return null;
22
+ return z.fromJSONSchema(schema);
23
+ }
24
+ /**
25
+ * Converts raw JSON config to AgentAppConfig format
26
+ * Validates structure and converts JSON schemas to Zod schemas
27
+ */
28
+ static convertToAgentAppConfig(rawConfig) {
29
+ // Convert agents, transforming JSON schemas to Zod schemas
30
+ const config = rawConfig.agents.reduce((config, agent) => {
31
+ agent.contextKeys.forEach((contextKey) => {
32
+ if (!config[contextKey]) {
33
+ config[contextKey] = [];
34
+ }
35
+ config[contextKey].push({
36
+ name: agent.name,
37
+ description: agent.description,
38
+ defaultModel: agent.defaultModel,
39
+ systemPrompt: agent.systemPrompt,
40
+ temperature: agent.temperature || 0.1,
41
+ maxTokens: agent.maxTokens || 2000,
42
+ tools: agent.tools.map((tool) => ConfigHelper.convertTool(tool)),
43
+ outputSchema: agent.outputSchema ? ConfigHelper.jsonSchemaToZod(agent.outputSchema) : undefined
44
+ });
45
+ });
46
+ return config;
47
+ }, {});
48
+ return config;
49
+ }
50
+ /**
51
+ * Converts a tool from JSON format (with JSON schemas) to AgentTool format (with Zod schemas)
52
+ */
53
+ static convertTool(tool) {
54
+ var _a;
55
+ if (tool.type === AgentToolType.WEB_SEARCH) {
56
+ return {
57
+ type: AgentToolType.WEB_SEARCH,
58
+ data: {
59
+ title: AgentToolType.WEB_SEARCH,
60
+ }
61
+ };
62
+ }
63
+ if (tool.type === AgentToolType.API_TOOL) {
64
+ return {
65
+ type: AgentToolType.API_TOOL,
66
+ data: {
67
+ title: tool.data.title,
68
+ description: tool.data.description,
69
+ headersToPass: tool.data.headersToPass,
70
+ method: tool.data.method,
71
+ url: tool.data.url,
72
+ body: tool.data.body ? ConfigHelper.jsonSchemaToZod(tool.data.body) : undefined,
73
+ queryParams: tool.data.queryParams ? ConfigHelper.jsonSchemaToZod(tool.data.queryParams) : undefined,
74
+ needsApproval: (_a = tool.data.needsApproval) !== null && _a !== void 0 ? _a : false,
75
+ }
76
+ };
77
+ }
78
+ throw new Error(`Unknown tool type: ${tool.type}`);
79
+ }
80
+ /**
81
+ * Validates the AgentAppConfig structure
82
+ * @throws Error if validation fails
83
+ */
84
+ static validateConfig(config) {
85
+ if (!config.agents || !Array.isArray(config.agents)) {
86
+ throw new Error('Config must have an "agents" array');
87
+ }
88
+ if (!config.contexts || typeof config.contexts !== 'object') {
89
+ throw new Error('Config must have a "contexts" object');
90
+ }
91
+ // Validate agents
92
+ const agentNames = new Set();
93
+ for (const agent of config.agents) {
94
+ if (!agent.name) {
95
+ throw new Error('All agents must have a "name" field');
96
+ }
97
+ if (agentNames.has(agent.name)) {
98
+ throw new Error(`Duplicate agent name found: ${agent.name}`);
99
+ }
100
+ agentNames.add(agent.name);
101
+ if (!agent.systemPrompt) {
102
+ throw new Error(`Agent "${agent.name}" must have a "systemPrompt" field`);
103
+ }
104
+ }
105
+ // Validate contexts reference valid agents
106
+ for (const [contextKey, contextAgentNames] of Object.entries(config.contexts)) {
107
+ if (!Array.isArray(contextAgentNames)) {
108
+ throw new Error(`Context "${contextKey}" must have an array of agent names`);
109
+ }
110
+ for (const agentName of contextAgentNames) {
111
+ if (!agentNames.has(agentName)) {
112
+ throw new Error(`Context "${contextKey}" references unknown agent: ${agentName}`);
113
+ }
114
+ }
115
+ }
116
+ }
117
+ }
118
+ //# sourceMappingURL=ConfigHelper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConfigHelper.js","sourceRoot":"","sources":["../../src/helpers/ConfigHelper.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,82 @@
1
+ import { AgentMessage } from '@multiplayer-app/ai-agent-types';
2
+ /**
3
+ * Options for limiting chat context
4
+ */
5
+ export interface ContextLimitOptions {
6
+ /**
7
+ * Maximum number of messages to include in context.
8
+ * Default: 50 (common practice: 20-100 messages depending on use case)
9
+ */
10
+ maxMessages?: number;
11
+ /**
12
+ * Maximum token count (if token counting is implemented).
13
+ * This is a future enhancement - currently not used.
14
+ */
15
+ maxTokens?: number;
16
+ /**
17
+ * Whether to always keep the first user message (often contains important context).
18
+ * Default: true
19
+ */
20
+ keepFirstUserMessage?: boolean;
21
+ /**
22
+ * Whether to keep all system messages (if any exist).
23
+ * Default: true
24
+ */
25
+ keepSystemMessages?: boolean;
26
+ }
27
+ /**
28
+ * Common practices for limiting AI context:
29
+ *
30
+ * 1. **Message Count Limiting** (implemented here)
31
+ * - Keep only the last N messages
32
+ * - Most common and simplest approach
33
+ * - Typical values: 20-100 messages depending on use case
34
+ *
35
+ * 2. **Token-Based Limiting** (future enhancement)
36
+ * - Count tokens and keep messages until hitting token budget
37
+ * - More accurate for cost control
38
+ * - Requires token counting library (e.g., tiktoken, @anthropic-ai/tokenizer)
39
+ *
40
+ * 3. **Hybrid Approach** (future enhancement)
41
+ * - Combine message count with token budget as safety check
42
+ * - Best of both worlds
43
+ *
44
+ * 4. **Sliding Window with Summary** (advanced)
45
+ * - Keep recent messages + summarize older ones
46
+ * - Requires summarization step
47
+ *
48
+ * 5. **Priority-Based** (implemented via keepFirstUserMessage)
49
+ * - Always keep system messages, first user message, and recent messages
50
+ * - Preserves important context while limiting size
51
+ */
52
+ export declare class ContextLimiter {
53
+ /**
54
+ * Limits the context by keeping only the most recent messages
55
+ * while preserving important messages (first user message, system messages).
56
+ *
57
+ * @param messages - All messages from the chat (assumed to be in chronological order)
58
+ * @param options - Limiting options
59
+ * @returns Limited array of messages in original order
60
+ */
61
+ static limitContext(messages: AgentMessage[], options?: ContextLimitOptions): AgentMessage[];
62
+ /**
63
+ * Estimates token count for a message (rough approximation).
64
+ * For accurate token counting, use a proper tokenizer library.
65
+ *
66
+ * This is a simple approximation: ~4 characters per token for English text.
67
+ *
68
+ * @param message - Message to estimate tokens for
69
+ * @returns Estimated token count
70
+ */
71
+ static estimateTokens(message: AgentMessage): number;
72
+ /**
73
+ * Limits context by token count (future enhancement).
74
+ * Currently not implemented - requires proper tokenizer.
75
+ *
76
+ * @param messages - All messages from the chat
77
+ * @param maxTokens - Maximum token count
78
+ * @returns Limited array of messages
79
+ */
80
+ static limitByTokens(messages: AgentMessage[], maxTokens: number): AgentMessage[];
81
+ }
82
+ //# sourceMappingURL=ContextLimiter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ContextLimiter.d.ts","sourceRoot":"","sources":["../../src/helpers/ContextLimiter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAe,MAAM,iCAAiC,CAAC;AAE5E;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;;OAGG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAE/B;;;OAGG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,qBAAa,cAAc;IACzB;;;;;;;OAOG;IACH,MAAM,CAAC,YAAY,CACjB,QAAQ,EAAE,YAAY,EAAE,EACxB,OAAO,GAAE,mBAAwB,GAChC,YAAY,EAAE;IA0EjB;;;;;;;;OAQG;IACH,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM;IAwBpD;;;;;;;OAOG;IACH,MAAM,CAAC,aAAa,CAClB,QAAQ,EAAE,YAAY,EAAE,EACxB,SAAS,EAAE,MAAM,GAChB,YAAY,EAAE;CAwClB"}