@opensaas/stack-rag 0.1.6

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 (149) hide show
  1. package/.turbo/turbo-build.log +4 -0
  2. package/CHANGELOG.md +10 -0
  3. package/CLAUDE.md +565 -0
  4. package/LICENSE +21 -0
  5. package/README.md +406 -0
  6. package/dist/config/index.d.ts +63 -0
  7. package/dist/config/index.d.ts.map +1 -0
  8. package/dist/config/index.js +94 -0
  9. package/dist/config/index.js.map +1 -0
  10. package/dist/config/plugin.d.ts +38 -0
  11. package/dist/config/plugin.d.ts.map +1 -0
  12. package/dist/config/plugin.js +215 -0
  13. package/dist/config/plugin.js.map +1 -0
  14. package/dist/config/plugin.test.d.ts +2 -0
  15. package/dist/config/plugin.test.d.ts.map +1 -0
  16. package/dist/config/plugin.test.js +554 -0
  17. package/dist/config/plugin.test.js.map +1 -0
  18. package/dist/config/types.d.ts +249 -0
  19. package/dist/config/types.d.ts.map +1 -0
  20. package/dist/config/types.js +5 -0
  21. package/dist/config/types.js.map +1 -0
  22. package/dist/fields/embedding.d.ts +85 -0
  23. package/dist/fields/embedding.d.ts.map +1 -0
  24. package/dist/fields/embedding.js +81 -0
  25. package/dist/fields/embedding.js.map +1 -0
  26. package/dist/fields/embedding.test.d.ts +2 -0
  27. package/dist/fields/embedding.test.d.ts.map +1 -0
  28. package/dist/fields/embedding.test.js +323 -0
  29. package/dist/fields/embedding.test.js.map +1 -0
  30. package/dist/fields/index.d.ts +6 -0
  31. package/dist/fields/index.d.ts.map +1 -0
  32. package/dist/fields/index.js +5 -0
  33. package/dist/fields/index.js.map +1 -0
  34. package/dist/index.d.ts +8 -0
  35. package/dist/index.d.ts.map +1 -0
  36. package/dist/index.js +9 -0
  37. package/dist/index.js.map +1 -0
  38. package/dist/mcp/index.d.ts +19 -0
  39. package/dist/mcp/index.d.ts.map +1 -0
  40. package/dist/mcp/index.js +18 -0
  41. package/dist/mcp/index.js.map +1 -0
  42. package/dist/providers/index.d.ts +38 -0
  43. package/dist/providers/index.d.ts.map +1 -0
  44. package/dist/providers/index.js +68 -0
  45. package/dist/providers/index.js.map +1 -0
  46. package/dist/providers/ollama.d.ts +49 -0
  47. package/dist/providers/ollama.d.ts.map +1 -0
  48. package/dist/providers/ollama.js +151 -0
  49. package/dist/providers/ollama.js.map +1 -0
  50. package/dist/providers/openai.d.ts +41 -0
  51. package/dist/providers/openai.d.ts.map +1 -0
  52. package/dist/providers/openai.js +126 -0
  53. package/dist/providers/openai.js.map +1 -0
  54. package/dist/providers/providers.test.d.ts +2 -0
  55. package/dist/providers/providers.test.d.ts.map +1 -0
  56. package/dist/providers/providers.test.js +224 -0
  57. package/dist/providers/providers.test.js.map +1 -0
  58. package/dist/providers/types.d.ts +88 -0
  59. package/dist/providers/types.d.ts.map +1 -0
  60. package/dist/providers/types.js +2 -0
  61. package/dist/providers/types.js.map +1 -0
  62. package/dist/runtime/batch.d.ts +183 -0
  63. package/dist/runtime/batch.d.ts.map +1 -0
  64. package/dist/runtime/batch.js +240 -0
  65. package/dist/runtime/batch.js.map +1 -0
  66. package/dist/runtime/batch.test.d.ts +2 -0
  67. package/dist/runtime/batch.test.d.ts.map +1 -0
  68. package/dist/runtime/batch.test.js +251 -0
  69. package/dist/runtime/batch.test.js.map +1 -0
  70. package/dist/runtime/chunking.d.ts +42 -0
  71. package/dist/runtime/chunking.d.ts.map +1 -0
  72. package/dist/runtime/chunking.js +264 -0
  73. package/dist/runtime/chunking.js.map +1 -0
  74. package/dist/runtime/chunking.test.d.ts +2 -0
  75. package/dist/runtime/chunking.test.d.ts.map +1 -0
  76. package/dist/runtime/chunking.test.js +212 -0
  77. package/dist/runtime/chunking.test.js.map +1 -0
  78. package/dist/runtime/embeddings.d.ts +147 -0
  79. package/dist/runtime/embeddings.d.ts.map +1 -0
  80. package/dist/runtime/embeddings.js +201 -0
  81. package/dist/runtime/embeddings.js.map +1 -0
  82. package/dist/runtime/embeddings.test.d.ts +2 -0
  83. package/dist/runtime/embeddings.test.d.ts.map +1 -0
  84. package/dist/runtime/embeddings.test.js +366 -0
  85. package/dist/runtime/embeddings.test.js.map +1 -0
  86. package/dist/runtime/index.d.ts +14 -0
  87. package/dist/runtime/index.d.ts.map +1 -0
  88. package/dist/runtime/index.js +18 -0
  89. package/dist/runtime/index.js.map +1 -0
  90. package/dist/runtime/search.d.ts +135 -0
  91. package/dist/runtime/search.d.ts.map +1 -0
  92. package/dist/runtime/search.js +101 -0
  93. package/dist/runtime/search.js.map +1 -0
  94. package/dist/storage/index.d.ts +41 -0
  95. package/dist/storage/index.d.ts.map +1 -0
  96. package/dist/storage/index.js +73 -0
  97. package/dist/storage/index.js.map +1 -0
  98. package/dist/storage/json.d.ts +34 -0
  99. package/dist/storage/json.d.ts.map +1 -0
  100. package/dist/storage/json.js +82 -0
  101. package/dist/storage/json.js.map +1 -0
  102. package/dist/storage/pgvector.d.ts +53 -0
  103. package/dist/storage/pgvector.d.ts.map +1 -0
  104. package/dist/storage/pgvector.js +168 -0
  105. package/dist/storage/pgvector.js.map +1 -0
  106. package/dist/storage/sqlite-vss.d.ts +49 -0
  107. package/dist/storage/sqlite-vss.d.ts.map +1 -0
  108. package/dist/storage/sqlite-vss.js +148 -0
  109. package/dist/storage/sqlite-vss.js.map +1 -0
  110. package/dist/storage/storage.test.d.ts +2 -0
  111. package/dist/storage/storage.test.d.ts.map +1 -0
  112. package/dist/storage/storage.test.js +440 -0
  113. package/dist/storage/storage.test.js.map +1 -0
  114. package/dist/storage/types.d.ts +79 -0
  115. package/dist/storage/types.d.ts.map +1 -0
  116. package/dist/storage/types.js +49 -0
  117. package/dist/storage/types.js.map +1 -0
  118. package/package.json +82 -0
  119. package/src/config/index.ts +116 -0
  120. package/src/config/plugin.test.ts +664 -0
  121. package/src/config/plugin.ts +257 -0
  122. package/src/config/types.ts +283 -0
  123. package/src/fields/embedding.test.ts +408 -0
  124. package/src/fields/embedding.ts +150 -0
  125. package/src/fields/index.ts +6 -0
  126. package/src/index.ts +33 -0
  127. package/src/mcp/index.ts +21 -0
  128. package/src/providers/index.ts +81 -0
  129. package/src/providers/ollama.ts +186 -0
  130. package/src/providers/openai.ts +161 -0
  131. package/src/providers/providers.test.ts +275 -0
  132. package/src/providers/types.ts +100 -0
  133. package/src/runtime/batch.test.ts +332 -0
  134. package/src/runtime/batch.ts +424 -0
  135. package/src/runtime/chunking.test.ts +258 -0
  136. package/src/runtime/chunking.ts +334 -0
  137. package/src/runtime/embeddings.test.ts +441 -0
  138. package/src/runtime/embeddings.ts +380 -0
  139. package/src/runtime/index.ts +51 -0
  140. package/src/runtime/search.ts +243 -0
  141. package/src/storage/index.ts +86 -0
  142. package/src/storage/json.ts +106 -0
  143. package/src/storage/pgvector.ts +206 -0
  144. package/src/storage/sqlite-vss.ts +193 -0
  145. package/src/storage/storage.test.ts +521 -0
  146. package/src/storage/types.ts +126 -0
  147. package/tsconfig.json +13 -0
  148. package/tsconfig.tsbuildinfo +1 -0
  149. package/vitest.config.ts +18 -0
@@ -0,0 +1,554 @@
1
+ import { describe, it, expect, vi } from 'vitest';
2
+ import { ragPlugin } from './plugin.js';
3
+ describe('RAG Plugin', () => {
4
+ describe('plugin creation', () => {
5
+ it('should create plugin with minimal config', () => {
6
+ const config = {
7
+ provider: {
8
+ type: 'openai',
9
+ apiKey: 'test-key',
10
+ },
11
+ };
12
+ const plugin = ragPlugin(config);
13
+ expect(plugin.name).toBe('rag');
14
+ expect(plugin.version).toBe('0.1.0');
15
+ expect(plugin.init).toBeDefined();
16
+ expect(typeof plugin.init).toBe('function');
17
+ });
18
+ it('should create plugin with full config', () => {
19
+ const config = {
20
+ provider: {
21
+ type: 'openai',
22
+ apiKey: 'test-key',
23
+ },
24
+ storage: {
25
+ type: 'json',
26
+ },
27
+ enableMcpTools: true,
28
+ batchSize: 20,
29
+ rateLimit: 200,
30
+ };
31
+ const plugin = ragPlugin(config);
32
+ expect(plugin).toBeDefined();
33
+ expect(plugin.name).toBe('rag');
34
+ });
35
+ it('should create plugin with multiple providers', () => {
36
+ const config = {
37
+ providers: {
38
+ openai: {
39
+ type: 'openai',
40
+ apiKey: 'test-key',
41
+ },
42
+ ollama: {
43
+ type: 'ollama',
44
+ baseURL: 'http://localhost:11434',
45
+ },
46
+ },
47
+ storage: {
48
+ type: 'json',
49
+ },
50
+ };
51
+ const plugin = ragPlugin(config);
52
+ expect(plugin).toBeDefined();
53
+ expect(plugin.name).toBe('rag');
54
+ });
55
+ });
56
+ describe('plugin initialization', () => {
57
+ it('should find and process embedding fields with autoGenerate', async () => {
58
+ const config = {
59
+ provider: {
60
+ type: 'openai',
61
+ apiKey: 'test-key',
62
+ },
63
+ };
64
+ const plugin = ragPlugin(config);
65
+ const mockContext = {
66
+ config: {
67
+ db: { provider: 'sqlite', url: 'file:./test.db' },
68
+ lists: {
69
+ Article: {
70
+ fields: {
71
+ content: { type: 'text' },
72
+ contentEmbedding: {
73
+ type: 'embedding',
74
+ sourceField: 'content',
75
+ autoGenerate: true,
76
+ provider: 'openai',
77
+ dimensions: 1536,
78
+ },
79
+ },
80
+ },
81
+ },
82
+ },
83
+ extendList: vi.fn(),
84
+ setPluginData: vi.fn(),
85
+ registerMcpTool: vi.fn(),
86
+ addList: vi.fn(),
87
+ };
88
+ await plugin.init(mockContext);
89
+ expect(mockContext.extendList).toHaveBeenCalledWith('Article', expect.objectContaining({
90
+ hooks: expect.any(Object),
91
+ }));
92
+ });
93
+ it('should throw error if autoGenerate is enabled without sourceField', async () => {
94
+ const config = {
95
+ provider: {
96
+ type: 'openai',
97
+ apiKey: 'test-key',
98
+ },
99
+ };
100
+ const plugin = ragPlugin(config);
101
+ const mockContext = {
102
+ config: {
103
+ db: { provider: 'sqlite', url: 'file:./test.db' },
104
+ lists: {
105
+ Article: {
106
+ fields: {
107
+ embedding: {
108
+ type: 'embedding',
109
+ autoGenerate: true,
110
+ // Missing sourceField
111
+ },
112
+ },
113
+ },
114
+ },
115
+ },
116
+ extendList: vi.fn(),
117
+ setPluginData: vi.fn(),
118
+ registerMcpTool: vi.fn(),
119
+ addList: vi.fn(),
120
+ };
121
+ await expect(plugin.init(mockContext)).rejects.toThrow(/has autoGenerate enabled but no sourceField specified/);
122
+ });
123
+ it('should skip fields without autoGenerate', async () => {
124
+ const config = {
125
+ provider: {
126
+ type: 'openai',
127
+ apiKey: 'test-key',
128
+ },
129
+ };
130
+ const plugin = ragPlugin(config);
131
+ const mockContext = {
132
+ config: {
133
+ db: { provider: 'sqlite', url: 'file:./test.db' },
134
+ lists: {
135
+ Article: {
136
+ fields: {
137
+ embedding: {
138
+ type: 'embedding',
139
+ // autoGenerate is false
140
+ },
141
+ },
142
+ },
143
+ },
144
+ },
145
+ extendList: vi.fn(),
146
+ setPluginData: vi.fn(),
147
+ registerMcpTool: vi.fn(),
148
+ addList: vi.fn(),
149
+ };
150
+ await plugin.init(mockContext);
151
+ // Should not extend list for fields without autoGenerate
152
+ expect(mockContext.extendList).not.toHaveBeenCalled();
153
+ });
154
+ it('should store normalized config in plugin data', async () => {
155
+ const config = {
156
+ provider: {
157
+ type: 'openai',
158
+ apiKey: 'test-key',
159
+ },
160
+ storage: {
161
+ type: 'json',
162
+ },
163
+ };
164
+ const plugin = ragPlugin(config);
165
+ const mockContext = {
166
+ config: {
167
+ db: { provider: 'sqlite', url: 'file:./test.db' },
168
+ lists: {},
169
+ },
170
+ setPluginData: vi.fn(),
171
+ registerMcpTool: vi.fn(),
172
+ extendList: vi.fn(),
173
+ addList: vi.fn(),
174
+ };
175
+ await plugin.init(mockContext);
176
+ expect(mockContext.setPluginData).toHaveBeenCalledWith('rag', expect.objectContaining({
177
+ provider: expect.any(Object),
178
+ storage: expect.any(Object),
179
+ }));
180
+ });
181
+ });
182
+ describe('automatic embedding generation', () => {
183
+ it('should inject afterOperation hook for autoGenerate fields', async () => {
184
+ const config = {
185
+ provider: {
186
+ type: 'openai',
187
+ apiKey: 'test-key',
188
+ },
189
+ };
190
+ const plugin = ragPlugin(config);
191
+ const mockContext = {
192
+ config: {
193
+ db: { provider: 'sqlite', url: 'file:./test.db' },
194
+ lists: {
195
+ Article: {
196
+ fields: {
197
+ content: { type: 'text' },
198
+ contentEmbedding: {
199
+ type: 'embedding',
200
+ sourceField: 'content',
201
+ autoGenerate: true,
202
+ },
203
+ },
204
+ },
205
+ },
206
+ },
207
+ extendList: vi.fn(),
208
+ setPluginData: vi.fn(),
209
+ registerMcpTool: vi.fn(),
210
+ addList: vi.fn(),
211
+ };
212
+ await plugin.init(mockContext);
213
+ expect(mockContext.extendList).toHaveBeenCalledWith('Article', expect.objectContaining({
214
+ hooks: expect.objectContaining({
215
+ resolveInput: expect.any(Function),
216
+ }),
217
+ }));
218
+ });
219
+ it('should handle multiple embedding fields in same list', async () => {
220
+ const config = {
221
+ providers: {
222
+ openai: { type: 'openai', apiKey: 'key1' },
223
+ ollama: { type: 'ollama' },
224
+ },
225
+ };
226
+ const plugin = ragPlugin(config);
227
+ const mockContext = {
228
+ config: {
229
+ db: { provider: 'sqlite', url: 'file:./test.db' },
230
+ lists: {
231
+ Article: {
232
+ fields: {
233
+ title: { type: 'text' },
234
+ content: { type: 'text' },
235
+ titleEmbedding: {
236
+ type: 'embedding',
237
+ sourceField: 'title',
238
+ autoGenerate: true,
239
+ provider: 'ollama',
240
+ },
241
+ contentEmbedding: {
242
+ type: 'embedding',
243
+ sourceField: 'content',
244
+ autoGenerate: true,
245
+ provider: 'openai',
246
+ },
247
+ },
248
+ },
249
+ },
250
+ },
251
+ extendList: vi.fn(),
252
+ setPluginData: vi.fn(),
253
+ registerMcpTool: vi.fn(),
254
+ addList: vi.fn(),
255
+ };
256
+ await plugin.init(mockContext);
257
+ // Should be called once per list (hooks are merged)
258
+ expect(mockContext.extendList).toHaveBeenCalledTimes(2);
259
+ });
260
+ });
261
+ describe('MCP integration', () => {
262
+ it('should register MCP tools when enabled', async () => {
263
+ const config = {
264
+ provider: {
265
+ type: 'openai',
266
+ apiKey: 'test-key',
267
+ },
268
+ enableMcpTools: true,
269
+ };
270
+ const plugin = ragPlugin(config);
271
+ const mockContext = {
272
+ config: {
273
+ db: { provider: 'sqlite', url: 'file:./test.db' },
274
+ lists: {
275
+ Article: {
276
+ fields: {
277
+ contentEmbedding: {
278
+ type: 'embedding',
279
+ },
280
+ },
281
+ },
282
+ },
283
+ },
284
+ extendList: vi.fn(),
285
+ setPluginData: vi.fn(),
286
+ registerMcpTool: vi.fn(),
287
+ addList: vi.fn(),
288
+ };
289
+ await plugin.init(mockContext);
290
+ expect(mockContext.registerMcpTool).toHaveBeenCalledWith(expect.objectContaining({
291
+ name: 'semantic_search_article',
292
+ description: expect.stringContaining('Search Article'),
293
+ inputSchema: expect.any(Object),
294
+ handler: expect.any(Function),
295
+ }));
296
+ });
297
+ it('should not register MCP tools when disabled', async () => {
298
+ const config = {
299
+ provider: {
300
+ type: 'openai',
301
+ apiKey: 'test-key',
302
+ },
303
+ enableMcpTools: false,
304
+ };
305
+ const plugin = ragPlugin(config);
306
+ const mockContext = {
307
+ config: {
308
+ db: { provider: 'sqlite', url: 'file:./test.db' },
309
+ lists: {
310
+ Article: {
311
+ fields: {
312
+ contentEmbedding: {
313
+ type: 'embedding',
314
+ },
315
+ },
316
+ },
317
+ },
318
+ },
319
+ extendList: vi.fn(),
320
+ setPluginData: vi.fn(),
321
+ registerMcpTool: vi.fn(),
322
+ addList: vi.fn(),
323
+ };
324
+ await plugin.init(mockContext);
325
+ expect(mockContext.registerMcpTool).not.toHaveBeenCalled();
326
+ });
327
+ it('should skip lists without embedding fields for MCP', async () => {
328
+ const config = {
329
+ provider: {
330
+ type: 'openai',
331
+ apiKey: 'test-key',
332
+ },
333
+ enableMcpTools: true,
334
+ };
335
+ const plugin = ragPlugin(config);
336
+ const mockContext = {
337
+ config: {
338
+ db: { provider: 'sqlite', url: 'file:./test.db' },
339
+ lists: {
340
+ User: {
341
+ fields: {
342
+ name: { type: 'text' },
343
+ email: { type: 'text' },
344
+ },
345
+ },
346
+ },
347
+ },
348
+ extendList: vi.fn(),
349
+ setPluginData: vi.fn(),
350
+ registerMcpTool: vi.fn(),
351
+ addList: vi.fn(),
352
+ };
353
+ await plugin.init(mockContext);
354
+ expect(mockContext.registerMcpTool).not.toHaveBeenCalled();
355
+ });
356
+ it('should generate correct MCP tool names', async () => {
357
+ const config = {
358
+ provider: {
359
+ type: 'openai',
360
+ apiKey: 'test-key',
361
+ },
362
+ enableMcpTools: true,
363
+ };
364
+ const plugin = ragPlugin(config);
365
+ const mockContext = {
366
+ config: {
367
+ db: { provider: 'sqlite', url: 'file:./test.db' },
368
+ lists: {
369
+ BlogPost: {
370
+ fields: {
371
+ embedding: { type: 'embedding' },
372
+ },
373
+ },
374
+ UserProfile: {
375
+ fields: {
376
+ embedding: { type: 'embedding' },
377
+ },
378
+ },
379
+ },
380
+ },
381
+ extendList: vi.fn(),
382
+ setPluginData: vi.fn(),
383
+ registerMcpTool: vi.fn(),
384
+ addList: vi.fn(),
385
+ };
386
+ await plugin.init(mockContext);
387
+ expect(mockContext.registerMcpTool).toHaveBeenCalledWith(expect.objectContaining({
388
+ name: 'semantic_search_blogpost',
389
+ }));
390
+ expect(mockContext.registerMcpTool).toHaveBeenCalledWith(expect.objectContaining({
391
+ name: 'semantic_search_userprofile',
392
+ }));
393
+ });
394
+ it('should create tool with correct input schema', async () => {
395
+ const config = {
396
+ provider: {
397
+ type: 'openai',
398
+ apiKey: 'test-key',
399
+ },
400
+ enableMcpTools: true,
401
+ };
402
+ const plugin = ragPlugin(config);
403
+ const mockContext = {
404
+ config: {
405
+ db: { provider: 'sqlite', url: 'file:./test.db' },
406
+ lists: {
407
+ Article: {
408
+ fields: {
409
+ embedding1: { type: 'embedding' },
410
+ embedding2: { type: 'embedding' },
411
+ },
412
+ },
413
+ },
414
+ },
415
+ extendList: vi.fn(),
416
+ setPluginData: vi.fn(),
417
+ registerMcpTool: vi.fn(),
418
+ addList: vi.fn(),
419
+ };
420
+ await plugin.init(mockContext);
421
+ const toolCall = mockContext.registerMcpTool.mock.calls[0][0];
422
+ expect(toolCall.inputSchema).toEqual(expect.objectContaining({
423
+ type: 'object',
424
+ properties: expect.objectContaining({
425
+ query: expect.any(Object),
426
+ limit: expect.any(Object),
427
+ minScore: expect.any(Object),
428
+ field: expect.objectContaining({
429
+ enum: ['embedding1', 'embedding2'],
430
+ }),
431
+ }),
432
+ required: ['query'],
433
+ }));
434
+ });
435
+ });
436
+ describe('provider selection', () => {
437
+ it('should use default provider when field does not specify one', async () => {
438
+ const config = {
439
+ provider: {
440
+ type: 'openai',
441
+ apiKey: 'test-key',
442
+ },
443
+ };
444
+ const plugin = ragPlugin(config);
445
+ const mockContext = {
446
+ config: {
447
+ db: { provider: 'sqlite', url: 'file:./test.db' },
448
+ lists: {
449
+ Article: {
450
+ fields: {
451
+ embedding: {
452
+ type: 'embedding',
453
+ sourceField: 'content',
454
+ autoGenerate: true,
455
+ // No provider specified, should use default
456
+ },
457
+ },
458
+ },
459
+ },
460
+ },
461
+ extendList: vi.fn(),
462
+ setPluginData: vi.fn(),
463
+ registerMcpTool: vi.fn(),
464
+ addList: vi.fn(),
465
+ };
466
+ await plugin.init(mockContext);
467
+ expect(mockContext.extendList).toHaveBeenCalled();
468
+ });
469
+ it('should use named provider when field specifies one', async () => {
470
+ const config = {
471
+ providers: {
472
+ openai: { type: 'openai', apiKey: 'key1' },
473
+ ollama: { type: 'ollama' },
474
+ },
475
+ };
476
+ const plugin = ragPlugin(config);
477
+ const mockContext = {
478
+ config: {
479
+ db: { provider: 'sqlite', url: 'file:./test.db' },
480
+ lists: {
481
+ Article: {
482
+ fields: {
483
+ embedding: {
484
+ type: 'embedding',
485
+ sourceField: 'content',
486
+ autoGenerate: true,
487
+ provider: 'ollama', // Use named provider
488
+ },
489
+ },
490
+ },
491
+ },
492
+ },
493
+ extendList: vi.fn(),
494
+ setPluginData: vi.fn(),
495
+ registerMcpTool: vi.fn(),
496
+ addList: vi.fn(),
497
+ };
498
+ await plugin.init(mockContext);
499
+ expect(mockContext.extendList).toHaveBeenCalled();
500
+ });
501
+ });
502
+ describe('configuration normalization', () => {
503
+ it('should apply default values', async () => {
504
+ const config = {
505
+ provider: {
506
+ type: 'openai',
507
+ apiKey: 'test-key',
508
+ },
509
+ };
510
+ const plugin = ragPlugin(config);
511
+ const mockContext = {
512
+ config: {
513
+ db: { provider: 'sqlite', url: 'file:./test.db' },
514
+ lists: {},
515
+ },
516
+ setPluginData: vi.fn(),
517
+ registerMcpTool: vi.fn(),
518
+ extendList: vi.fn(),
519
+ addList: vi.fn(),
520
+ };
521
+ await plugin.init(mockContext);
522
+ const normalizedConfig = mockContext.setPluginData.mock.calls[0][1];
523
+ expect(normalizedConfig).toMatchObject({
524
+ enableMcpTools: expect.any(Boolean),
525
+ batchSize: expect.any(Number),
526
+ rateLimit: expect.any(Number),
527
+ storage: expect.any(Object),
528
+ chunking: expect.objectContaining({
529
+ strategy: expect.any(String),
530
+ maxTokens: expect.any(Number),
531
+ overlap: expect.any(Number),
532
+ }),
533
+ });
534
+ });
535
+ });
536
+ describe('plugin interface conformance', () => {
537
+ it('should conform to Plugin interface', () => {
538
+ const config = {
539
+ provider: {
540
+ type: 'openai',
541
+ apiKey: 'test-key',
542
+ },
543
+ };
544
+ const plugin = ragPlugin(config);
545
+ expect(plugin.name).toBeDefined();
546
+ expect(plugin.version).toBeDefined();
547
+ expect(plugin.init).toBeDefined();
548
+ expect(typeof plugin.name).toBe('string');
549
+ expect(typeof plugin.version).toBe('string');
550
+ expect(typeof plugin.init).toBe('function');
551
+ });
552
+ });
553
+ });
554
+ //# sourceMappingURL=plugin.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.test.js","sourceRoot":"","sources":["../../src/config/plugin.test.ts"],"names":[],"mappings":"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"}