@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 @@
1
+ {"version":3,"file":"ModelStore.test.d.ts","sourceRoot":"","sources":["../../src/store/ModelStore.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,390 @@
1
+ import { describe, it, expect, beforeEach } from 'vitest';
2
+ import { ModelStore } from './ModelStore';
3
+ describe('ModelStore', () => {
4
+ let modelStore;
5
+ // Helper to create mock models
6
+ const createMockModel = (id, label, provider, options) => ({
7
+ id,
8
+ label,
9
+ provider,
10
+ ...options
11
+ });
12
+ beforeEach(() => {
13
+ // Clear the singleton instance before each test
14
+ // We need to access the private instance property, so we'll clear via clear()
15
+ modelStore = ModelStore.getInstance();
16
+ modelStore.clear();
17
+ });
18
+ describe('getInstance', () => {
19
+ it('should return the same singleton instance on multiple calls', () => {
20
+ const instance1 = ModelStore.getInstance();
21
+ const instance2 = ModelStore.getInstance();
22
+ expect(instance1).toBe(instance2);
23
+ });
24
+ it('should return an instance of ModelStore', () => {
25
+ const instance = ModelStore.getInstance();
26
+ expect(instance).toBeInstanceOf(ModelStore);
27
+ });
28
+ });
29
+ describe('setModels', () => {
30
+ it('should set models in the store', () => {
31
+ const models = [
32
+ createMockModel('openai/gpt-4', 'GPT-4', 'openai'),
33
+ createMockModel('anthropic/claude-3', 'Claude 3', 'anthropic')
34
+ ];
35
+ modelStore.setModels(models);
36
+ expect(modelStore.getModels()).toEqual(models);
37
+ });
38
+ it('should update lastFetched timestamp when setting models', () => {
39
+ const models = [
40
+ createMockModel('openai/gpt-4', 'GPT-4', 'openai')
41
+ ];
42
+ const beforeSet = new Date();
43
+ modelStore.setModels(models);
44
+ const afterSet = new Date();
45
+ const lastFetched = modelStore.getLastFetched();
46
+ expect(lastFetched).not.toBeNull();
47
+ expect(lastFetched.getTime()).toBeGreaterThanOrEqual(beforeSet.getTime());
48
+ expect(lastFetched.getTime()).toBeLessThanOrEqual(afterSet.getTime());
49
+ });
50
+ it('should handle empty array', () => {
51
+ modelStore.setModels([]);
52
+ expect(modelStore.getModels()).toEqual([]);
53
+ expect(modelStore.hasModels()).toBe(false);
54
+ });
55
+ it('should replace existing models when called multiple times', () => {
56
+ const models1 = [
57
+ createMockModel('openai/gpt-4', 'GPT-4', 'openai')
58
+ ];
59
+ const models2 = [
60
+ createMockModel('anthropic/claude-3', 'Claude 3', 'anthropic'),
61
+ createMockModel('openai/gpt-3.5', 'GPT-3.5', 'openai')
62
+ ];
63
+ modelStore.setModels(models1);
64
+ expect(modelStore.getModels()).toHaveLength(1);
65
+ modelStore.setModels(models2);
66
+ expect(modelStore.getModels()).toHaveLength(2);
67
+ expect(modelStore.getModels()).toEqual(models2);
68
+ });
69
+ });
70
+ describe('getModels', () => {
71
+ it('should return empty array when no models are set', () => {
72
+ expect(modelStore.getModels()).toEqual([]);
73
+ });
74
+ it('should return all models that were set', () => {
75
+ const models = [
76
+ createMockModel('openai/gpt-4', 'GPT-4', 'openai'),
77
+ createMockModel('anthropic/claude-3', 'Claude 3', 'anthropic'),
78
+ createMockModel('google/gemini-pro', 'Gemini Pro', 'google')
79
+ ];
80
+ modelStore.setModels(models);
81
+ expect(modelStore.getModels()).toEqual(models);
82
+ expect(modelStore.getModels()).toHaveLength(3);
83
+ });
84
+ it('should return the same array reference (direct reference to internal array)', () => {
85
+ const models = [
86
+ createMockModel('openai/gpt-4', 'GPT-4', 'openai')
87
+ ];
88
+ modelStore.setModels(models);
89
+ const retrieved = modelStore.getModels();
90
+ // Note: getModels() returns the internal array directly, not a copy
91
+ expect(retrieved).toBe(modelStore.getModels()); // Same reference on multiple calls
92
+ expect(retrieved).toEqual(models); // Same content
93
+ });
94
+ });
95
+ describe('getModelsByProvider', () => {
96
+ beforeEach(() => {
97
+ modelStore.setModels([
98
+ createMockModel('openai/gpt-4', 'GPT-4', 'openai'),
99
+ createMockModel('openai/gpt-3.5', 'GPT-3.5', 'openai'),
100
+ createMockModel('anthropic/claude-3', 'Claude 3', 'anthropic'),
101
+ createMockModel('google/gemini-pro', 'Gemini Pro', 'google')
102
+ ]);
103
+ });
104
+ it('should return models for a specific provider', () => {
105
+ const openaiModels = modelStore.getModelsByProvider('openai');
106
+ expect(openaiModels).toHaveLength(2);
107
+ expect(openaiModels.every((m) => m.provider === 'openai')).toBe(true);
108
+ });
109
+ it('should return empty array for non-existent provider', () => {
110
+ const models = modelStore.getModelsByProvider('nonexistent');
111
+ expect(models).toEqual([]);
112
+ });
113
+ it('should return empty array for provider with no models', () => {
114
+ const models = modelStore.getModelsByProvider('azure');
115
+ expect(models).toEqual([]);
116
+ });
117
+ it('should handle case-sensitive provider names', () => {
118
+ const models = modelStore.getModelsByProvider('OpenAI');
119
+ expect(models).toEqual([]); // Should be case-sensitive
120
+ });
121
+ it('should return models without provider when filtering for empty string', () => {
122
+ modelStore.setModels([
123
+ createMockModel('model-1', 'Model 1'), // No provider
124
+ createMockModel('openai/gpt-4', 'GPT-4', 'openai')
125
+ ]);
126
+ const modelsWithoutProvider = modelStore.getModelsByProvider('');
127
+ expect(modelsWithoutProvider).toHaveLength(0); // Empty string won't match undefined
128
+ });
129
+ });
130
+ describe('getModelById', () => {
131
+ beforeEach(() => {
132
+ modelStore.setModels([
133
+ createMockModel('openai/gpt-4', 'GPT-4', 'openai'),
134
+ createMockModel('anthropic/claude-3-opus', 'Claude 3 Opus', 'anthropic'),
135
+ createMockModel('google/gemini-pro', 'Gemini Pro', 'google'),
136
+ createMockModel('simple-model', 'Simple Model', 'custom')
137
+ ]);
138
+ });
139
+ it('should return model when exact ID matches', () => {
140
+ const model = modelStore.getModelById('openai/gpt-4');
141
+ expect(model).toBeDefined();
142
+ expect(model === null || model === void 0 ? void 0 : model.id).toBe('openai/gpt-4');
143
+ expect(model === null || model === void 0 ? void 0 : model.label).toBe('GPT-4');
144
+ });
145
+ it('should return model using fallback logic when exact match not found', () => {
146
+ // split('/', 2) limits to 2 parts, so 'some/prefix/gpt-4' becomes ['some', 'prefix/gpt-4']
147
+ // The fallback looks for models ending with 'prefix/gpt-4', which won't match 'openai/gpt-4'
148
+ // So this test should expect undefined, or we need to test with a 2-part ID
149
+ const model = modelStore.getModelById('some/gpt-4');
150
+ expect(model).toBeDefined();
151
+ expect(model === null || model === void 0 ? void 0 : model.id).toBe('openai/gpt-4');
152
+ });
153
+ it('should return model using fallback when ID has no provider information', () => {
154
+ const model = modelStore.getModelById('claude-3-opus');
155
+ expect(model).toBeDefined();
156
+ expect(model === null || model === void 0 ? void 0 : model.id).toBe('anthropic/claude-3-opus');
157
+ });
158
+ it('should return model when ID has provider info, but model list does not', () => {
159
+ const model = modelStore.getModelById('custom/simple-model');
160
+ expect(model).toBeDefined();
161
+ expect(model === null || model === void 0 ? void 0 : model.id).toBe('simple-model');
162
+ });
163
+ it('should return undefined when model not found', () => {
164
+ // Note: empty string ID will match any model because endsWith('') is always true
165
+ // So we test with a clearly non-matching ID
166
+ const model = modelStore.getModelById('nonexistent/definitely-not-a-model');
167
+ expect(model).toBeUndefined();
168
+ });
169
+ it('should return first model for empty string ID (endsWith edge case)', () => {
170
+ // Empty string causes split('/') to return [''], and endsWith('') matches all strings
171
+ // This is a known edge case in the implementation
172
+ const model = modelStore.getModelById('');
173
+ expect(model).toBeDefined(); // Will match first model due to endsWith('') behavior
174
+ });
175
+ it('should handle ID without slash (no fallback needed)', () => {
176
+ const model = modelStore.getModelById('simple-model');
177
+ expect(model).toBeDefined();
178
+ expect(model === null || model === void 0 ? void 0 : model.id).toBe('simple-model');
179
+ });
180
+ it('should handle ID with only one segment (no slash)', () => {
181
+ // When split('/') returns array with one element, idData[idData.length - 1] is that element
182
+ const model = modelStore.getModelById('simple-model');
183
+ expect(model).toBeDefined();
184
+ expect(model === null || model === void 0 ? void 0 : model.id).toBe('simple-model');
185
+ });
186
+ it('should prefer exact match over fallback', () => {
187
+ // If we have both exact match and a model that would match fallback
188
+ modelStore.setModels([
189
+ createMockModel('openai/gpt-4', 'GPT-4', 'openai'),
190
+ createMockModel('custom/gpt-4', 'Custom GPT-4', 'custom')
191
+ ]);
192
+ const model = modelStore.getModelById('openai/gpt-4');
193
+ expect(model === null || model === void 0 ? void 0 : model.id).toBe('openai/gpt-4'); // Should get exact match
194
+ });
195
+ });
196
+ describe('getProviders', () => {
197
+ it('should return empty array when no models are set', () => {
198
+ expect(modelStore.getProviders()).toEqual([]);
199
+ });
200
+ it('should return unique providers from models', () => {
201
+ modelStore.setModels([
202
+ createMockModel('openai/gpt-4', 'GPT-4', 'openai'),
203
+ createMockModel('openai/gpt-3.5', 'GPT-3.5', 'openai'),
204
+ createMockModel('anthropic/claude-3', 'Claude 3', 'anthropic')
205
+ ]);
206
+ const providers = modelStore.getProviders();
207
+ expect(providers).toHaveLength(2);
208
+ expect(providers).toContain('openai');
209
+ expect(providers).toContain('anthropic');
210
+ });
211
+ it('should not include duplicates', () => {
212
+ modelStore.setModels([
213
+ createMockModel('openai/gpt-4', 'GPT-4', 'openai'),
214
+ createMockModel('openai/gpt-3.5', 'GPT-3.5', 'openai'),
215
+ createMockModel('openai/gpt-4-turbo', 'GPT-4 Turbo', 'openai')
216
+ ]);
217
+ const providers = modelStore.getProviders();
218
+ expect(providers).toHaveLength(1);
219
+ expect(providers).toEqual(['openai']);
220
+ });
221
+ it('should exclude models without provider', () => {
222
+ modelStore.setModels([
223
+ createMockModel('model-1', 'Model 1'), // No provider
224
+ createMockModel('openai/gpt-4', 'GPT-4', 'openai'),
225
+ createMockModel('model-2', 'Model 2') // No provider
226
+ ]);
227
+ const providers = modelStore.getProviders();
228
+ expect(providers).toEqual(['openai']);
229
+ });
230
+ it('should return empty array when all models have no provider', () => {
231
+ modelStore.setModels([
232
+ createMockModel('model-1', 'Model 1'),
233
+ createMockModel('model-2', 'Model 2')
234
+ ]);
235
+ const providers = modelStore.getProviders();
236
+ expect(providers).toEqual([]);
237
+ });
238
+ });
239
+ describe('getLastFetched', () => {
240
+ it('should return null when no models have been set', () => {
241
+ expect(modelStore.getLastFetched()).toBeNull();
242
+ });
243
+ it('should return date when models have been set', () => {
244
+ const models = [
245
+ createMockModel('openai/gpt-4', 'GPT-4', 'openai')
246
+ ];
247
+ modelStore.setModels(models);
248
+ const lastFetched = modelStore.getLastFetched();
249
+ expect(lastFetched).not.toBeNull();
250
+ expect(lastFetched).toBeInstanceOf(Date);
251
+ });
252
+ it('should return null after clear()', () => {
253
+ modelStore.setModels([
254
+ createMockModel('openai/gpt-4', 'GPT-4', 'openai')
255
+ ]);
256
+ expect(modelStore.getLastFetched()).not.toBeNull();
257
+ modelStore.clear();
258
+ expect(modelStore.getLastFetched()).toBeNull();
259
+ });
260
+ it('should update timestamp when setModels is called again', async () => {
261
+ const models = [
262
+ createMockModel('openai/gpt-4', 'GPT-4', 'openai')
263
+ ];
264
+ modelStore.setModels(models);
265
+ const firstTimestamp = modelStore.getLastFetched().getTime();
266
+ // Wait a small amount to ensure different timestamp
267
+ await new Promise((resolve) => setTimeout(resolve, 10));
268
+ modelStore.setModels(models);
269
+ const secondTimestamp = modelStore.getLastFetched().getTime();
270
+ expect(secondTimestamp).toBeGreaterThan(firstTimestamp);
271
+ });
272
+ });
273
+ describe('hasModels', () => {
274
+ it('should return false when no models are set', () => {
275
+ expect(modelStore.hasModels()).toBe(false);
276
+ });
277
+ it('should return true when models are set', () => {
278
+ modelStore.setModels([
279
+ createMockModel('openai/gpt-4', 'GPT-4', 'openai')
280
+ ]);
281
+ expect(modelStore.hasModels()).toBe(true);
282
+ });
283
+ it('should return false after clear()', () => {
284
+ modelStore.setModels([
285
+ createMockModel('openai/gpt-4', 'GPT-4', 'openai')
286
+ ]);
287
+ expect(modelStore.hasModels()).toBe(true);
288
+ modelStore.clear();
289
+ expect(modelStore.hasModels()).toBe(false);
290
+ });
291
+ it('should return false when empty array is set', () => {
292
+ modelStore.setModels([]);
293
+ expect(modelStore.hasModels()).toBe(false);
294
+ });
295
+ });
296
+ describe('clear', () => {
297
+ it('should clear all models', () => {
298
+ modelStore.setModels([
299
+ createMockModel('openai/gpt-4', 'GPT-4', 'openai'),
300
+ createMockModel('anthropic/claude-3', 'Claude 3', 'anthropic')
301
+ ]);
302
+ expect(modelStore.hasModels()).toBe(true);
303
+ modelStore.clear();
304
+ expect(modelStore.hasModels()).toBe(false);
305
+ expect(modelStore.getModels()).toEqual([]);
306
+ });
307
+ it('should reset lastFetched to null', () => {
308
+ modelStore.setModels([
309
+ createMockModel('openai/gpt-4', 'GPT-4', 'openai')
310
+ ]);
311
+ expect(modelStore.getLastFetched()).not.toBeNull();
312
+ modelStore.clear();
313
+ expect(modelStore.getLastFetched()).toBeNull();
314
+ });
315
+ it('should be safe to call when store is already empty', () => {
316
+ expect(() => modelStore.clear()).not.toThrow();
317
+ expect(modelStore.hasModels()).toBe(false);
318
+ });
319
+ it('should clear providers list', () => {
320
+ modelStore.setModels([
321
+ createMockModel('openai/gpt-4', 'GPT-4', 'openai')
322
+ ]);
323
+ expect(modelStore.getProviders()).toHaveLength(1);
324
+ modelStore.clear();
325
+ expect(modelStore.getProviders()).toEqual([]);
326
+ });
327
+ });
328
+ describe('integration scenarios', () => {
329
+ it('should handle complete workflow: set, query, clear, set again', () => {
330
+ // Initial state
331
+ expect(modelStore.hasModels()).toBe(false);
332
+ expect(modelStore.getModels()).toEqual([]);
333
+ // Set models
334
+ const models1 = [
335
+ createMockModel('openai/gpt-4', 'GPT-4', 'openai'),
336
+ createMockModel('anthropic/claude-3', 'Claude 3', 'anthropic')
337
+ ];
338
+ modelStore.setModels(models1);
339
+ expect(modelStore.hasModels()).toBe(true);
340
+ expect(modelStore.getModels()).toHaveLength(2);
341
+ expect(modelStore.getProviders()).toHaveLength(2);
342
+ expect(modelStore.getModelById('openai/gpt-4')).toBeDefined();
343
+ // Clear
344
+ modelStore.clear();
345
+ expect(modelStore.hasModels()).toBe(false);
346
+ expect(modelStore.getModels()).toEqual([]);
347
+ expect(modelStore.getProviders()).toEqual([]);
348
+ // Set again
349
+ const models2 = [
350
+ createMockModel('google/gemini-pro', 'Gemini Pro', 'google')
351
+ ];
352
+ modelStore.setModels(models2);
353
+ expect(modelStore.hasModels()).toBe(true);
354
+ expect(modelStore.getModels()).toHaveLength(1);
355
+ expect(modelStore.getProviders()).toEqual(['google']);
356
+ });
357
+ it('should handle models with all optional fields', () => {
358
+ const complexModels = [
359
+ {
360
+ id: 'openai/gpt-4',
361
+ label: 'GPT-4',
362
+ provider: 'openai',
363
+ reasoning: 'deep',
364
+ contexts: ['context1', 'context2'],
365
+ description: 'A powerful model'
366
+ },
367
+ {
368
+ id: 'anthropic/claude-3',
369
+ label: 'Claude 3',
370
+ provider: 'anthropic',
371
+ reasoning: 'concise',
372
+ contexts: ['context1']
373
+ },
374
+ {
375
+ id: 'simple-model',
376
+ label: 'Simple'
377
+ // No optional fields
378
+ }
379
+ ];
380
+ modelStore.setModels(complexModels);
381
+ expect(modelStore.getModels()).toHaveLength(3);
382
+ expect(modelStore.getProviders()).toHaveLength(2); // Only 2 have providers
383
+ const gpt4 = modelStore.getModelById('openai/gpt-4');
384
+ expect(gpt4 === null || gpt4 === void 0 ? void 0 : gpt4.reasoning).toBe('deep');
385
+ expect(gpt4 === null || gpt4 === void 0 ? void 0 : gpt4.contexts).toEqual(['context1', 'context2']);
386
+ expect(gpt4 === null || gpt4 === void 0 ? void 0 : gpt4.description).toBe('A powerful model');
387
+ });
388
+ });
389
+ });
390
+ //# sourceMappingURL=ModelStore.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ModelStore.test.js","sourceRoot":"","sources":["../../src/store/ModelStore.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export * from './ConfigStore';
2
+ export * from './AgentStore';
3
+ export * from './ArtifactStore';
4
+ export * from './ModelStore';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/store/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC"}
@@ -0,0 +1,5 @@
1
+ export * from './ConfigStore';
2
+ export * from './AgentStore';
3
+ export * from './ArtifactStore';
4
+ export * from './ModelStore';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/store/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC"}
@@ -0,0 +1,24 @@
1
+ export declare const generateChartToolName = "generate-chart";
2
+ /**
3
+ * Tool for generating chart visualizations from various data sources.
4
+ * The tool returns structured data that the frontend renderer can visualize.
5
+ */
6
+ export declare const createGenerateChartTool: () => import("ai").Tool<{
7
+ chartType: "line" | "bar" | "area" | "pie";
8
+ dataSource: "custom" | "stock" | "exchange" | "weather";
9
+ symbol?: string | undefined;
10
+ timeframe?: "1d" | "1w" | "1m" | "3m" | "1y" | undefined;
11
+ }, {
12
+ chartType: "line" | "bar" | "area" | "pie";
13
+ dataSource: string;
14
+ title: string;
15
+ yAxisLabel: string;
16
+ data: {
17
+ date: string;
18
+ value: number;
19
+ label?: string | undefined;
20
+ }[];
21
+ symbol?: string | undefined;
22
+ timeframe?: string | undefined;
23
+ }>;
24
+ //# sourceMappingURL=generateChartTool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generateChartTool.d.ts","sourceRoot":"","sources":["../../src/tools/generateChartTool.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,qBAAqB,mBAAmB,CAAA;AAErD;;;GAGG;AACH,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;EAyHhC,CAAA"}
@@ -0,0 +1,124 @@
1
+ import { tool } from 'ai';
2
+ import { z } from 'zod';
3
+ export const generateChartToolName = 'generate-chart';
4
+ /**
5
+ * Tool for generating chart visualizations from various data sources.
6
+ * The tool returns structured data that the frontend renderer can visualize.
7
+ */
8
+ export const createGenerateChartTool = () => tool({
9
+ title: generateChartToolName,
10
+ description: 'Create visualizations from data sources. Supports stock prices, exchange rates, weather data, and custom datasets. Returns structured chart data for rendering.',
11
+ inputSchema: z.object({
12
+ chartType: z.enum(['line', 'bar', 'area', 'pie']).describe('Type of chart to generate'),
13
+ dataSource: z.enum(['stock', 'exchange', 'weather', 'custom']).describe('Source of data for the chart'),
14
+ symbol: z.string().optional().describe('Stock ticker, currency pair, or location identifier'),
15
+ timeframe: z.enum(['1d', '1w', '1m', '3m', '1y']).optional().describe('Time period for data')
16
+ }),
17
+ outputSchema: z.object({
18
+ chartType: z.enum(['line', 'bar', 'area', 'pie']),
19
+ dataSource: z.string(),
20
+ symbol: z.string().optional(),
21
+ timeframe: z.string().optional(),
22
+ title: z.string(),
23
+ yAxisLabel: z.string(),
24
+ data: z.array(z.object({
25
+ date: z.string(),
26
+ value: z.number(),
27
+ label: z.string().optional()
28
+ }))
29
+ }),
30
+ execute: async (input) => {
31
+ // Generate mock data based on data source
32
+ let data = [];
33
+ let title = '';
34
+ let yAxisLabel = '';
35
+ if (input.dataSource === 'stock') {
36
+ title = `${input.symbol || 'AAPL'} Stock Price (${input.timeframe || '1m'})`;
37
+ yAxisLabel = 'Price ($)';
38
+ const basePrice = input.symbol === 'AAPL' ? 175 : input.symbol === 'GOOGL' ? 140 : input.symbol === 'MSFT' ? 380 : 100;
39
+ const days = input.timeframe === '1d' ? 24 : input.timeframe === '1w' ? 7 : input.timeframe === '1m' ? 30 : input.timeframe === '3m' ? 90 : 365;
40
+ const interval = input.timeframe === '1d' ? 'hour' : 'day';
41
+ for (let i = days; i >= 0; i--) {
42
+ const date = new Date();
43
+ if (interval === 'hour') {
44
+ date.setHours(date.getHours() - i);
45
+ }
46
+ else {
47
+ date.setDate(date.getDate() - i);
48
+ }
49
+ const variation = (Math.random() - 0.5) * 0.1;
50
+ const trend = (days - i) / days * 0.15;
51
+ const value = basePrice * (1 + trend + variation);
52
+ data.push({
53
+ date: interval === 'hour'
54
+ ? date.toLocaleTimeString('en-US', { hour: '2-digit', minute: '2-digit' })
55
+ : date.toLocaleDateString('en-US', { month: 'short', day: 'numeric' }),
56
+ value: Math.round(value * 100) / 100
57
+ });
58
+ }
59
+ }
60
+ else if (input.dataSource === 'exchange') {
61
+ title = `${input.symbol || 'EUR/USD'} Exchange Rate (${input.timeframe || '1m'})`;
62
+ yAxisLabel = 'Rate';
63
+ const baseRate = input.symbol === 'EUR/USD' ? 1.08 : input.symbol === 'GBP/USD' ? 1.27 : input.symbol === 'JPY/USD' ? 0.0067 : 1.0;
64
+ const days = input.timeframe === '1d' ? 24 : input.timeframe === '1w' ? 7 : input.timeframe === '1m' ? 30 : 90;
65
+ for (let i = days; i >= 0; i--) {
66
+ const date = new Date();
67
+ date.setDate(date.getDate() - i);
68
+ const variation = (Math.random() - 0.5) * 0.02;
69
+ const value = baseRate * (1 + variation);
70
+ data.push({
71
+ date: date.toLocaleDateString('en-US', { month: 'short', day: 'numeric' }),
72
+ value: Math.round(value * 10000) / 10000
73
+ });
74
+ }
75
+ }
76
+ else if (input.dataSource === 'weather') {
77
+ title = `Weather in ${input.symbol || 'NYC'} (${input.timeframe || '1d'})`;
78
+ yAxisLabel = 'Temperature (°F)';
79
+ const days = input.timeframe === '1d' ? 24 : input.timeframe === '1w' ? 7 : 30;
80
+ const baseTemp = 65;
81
+ for (let i = days; i >= 0; i--) {
82
+ const date = new Date();
83
+ if (input.timeframe === '1d') {
84
+ date.setHours(date.getHours() - i);
85
+ }
86
+ else {
87
+ date.setDate(date.getDate() - i);
88
+ }
89
+ const hourOfDay = date.getHours();
90
+ const dailyVariation = Math.sin((hourOfDay / 24) * Math.PI * 2) * 15;
91
+ const randomVariation = (Math.random() - 0.5) * 5;
92
+ const value = baseTemp + dailyVariation + randomVariation;
93
+ data.push({
94
+ date: input.timeframe === '1d'
95
+ ? date.toLocaleTimeString('en-US', { hour: '2-digit', minute: '2-digit' })
96
+ : date.toLocaleDateString('en-US', { month: 'short', day: 'numeric' }),
97
+ value: Math.round(value)
98
+ });
99
+ }
100
+ }
101
+ else {
102
+ // Custom data
103
+ title = 'Custom Dataset';
104
+ yAxisLabel = 'Value';
105
+ for (let i = 0; i < 10; i++) {
106
+ data.push({
107
+ date: `Item ${i + 1}`,
108
+ value: Math.round(Math.random() * 100),
109
+ label: `Category ${i + 1}`
110
+ });
111
+ }
112
+ }
113
+ return {
114
+ chartType: input.chartType,
115
+ dataSource: input.dataSource,
116
+ symbol: input.symbol,
117
+ timeframe: input.timeframe,
118
+ title,
119
+ yAxisLabel,
120
+ data
121
+ };
122
+ }
123
+ });
124
+ //# sourceMappingURL=generateChartTool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generateChartTool.js","sourceRoot":"","sources":["../../src/tools/generateChartTool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ export declare const proposeFormValuesToolName = "propose_form_values";
2
+ /**
3
+ * A no-side-effect tool: it exists to force the model to emit structured form fill proposals.
4
+ * The UI will render these proposals and the host app will decide what to apply.
5
+ */
6
+ export declare const createProposeFormValuesTool: () => import("ai").Tool<{
7
+ formId: string;
8
+ fields: {
9
+ name: string;
10
+ label: string;
11
+ value: string;
12
+ inputType?: "number" | "text" | "date" | "select" | "radio" | "textarea" | "checkbox" | "email" | "tel" | undefined;
13
+ options?: {
14
+ value: string;
15
+ label: string;
16
+ }[] | undefined;
17
+ }[];
18
+ formName?: string | undefined;
19
+ notes?: string | undefined;
20
+ }, {
21
+ formId: string;
22
+ fields: {
23
+ name: string;
24
+ label: string;
25
+ value: string;
26
+ inputType?: "number" | "text" | "date" | "select" | "radio" | "textarea" | "checkbox" | "email" | "tel" | undefined;
27
+ options?: {
28
+ value: string;
29
+ label: string;
30
+ }[] | undefined;
31
+ }[];
32
+ formName?: string | undefined;
33
+ notes?: string | undefined;
34
+ }>;
35
+ //# sourceMappingURL=proposeFormValuesTool.d.ts.map