@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,323 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { embedding } from './embedding.js';
3
+ import { z } from 'zod';
4
+ describe('Embedding Field', () => {
5
+ describe('embedding field builder', () => {
6
+ it('should create embedding field with default options', () => {
7
+ const field = embedding();
8
+ expect(field.type).toBe('embedding');
9
+ expect(field.dimensions).toBe(1536); // Default OpenAI dimensions
10
+ expect(field.autoGenerate).toBe(false); // No sourceField
11
+ });
12
+ it('should create embedding field with custom dimensions', () => {
13
+ const field = embedding({ dimensions: 3072 });
14
+ expect(field.dimensions).toBe(3072);
15
+ });
16
+ it('should set autoGenerate to true when sourceField is provided', () => {
17
+ const field = embedding({ sourceField: 'content' });
18
+ expect(field.autoGenerate).toBe(true);
19
+ expect(field.sourceField).toBe('content');
20
+ });
21
+ it('should allow explicit autoGenerate override', () => {
22
+ const field = embedding({ sourceField: 'content', autoGenerate: false });
23
+ expect(field.autoGenerate).toBe(false);
24
+ expect(field.sourceField).toBe('content');
25
+ });
26
+ it('should support provider configuration', () => {
27
+ const field = embedding({ provider: 'openai' });
28
+ expect(field.provider).toBe('openai');
29
+ });
30
+ it('should support chunking configuration', () => {
31
+ const field = embedding({
32
+ sourceField: 'content',
33
+ chunking: {
34
+ strategy: 'recursive',
35
+ maxTokens: 500,
36
+ overlap: 50,
37
+ },
38
+ });
39
+ expect(field.chunking).toEqual({
40
+ strategy: 'recursive',
41
+ maxTokens: 500,
42
+ overlap: 50,
43
+ });
44
+ });
45
+ it('should support UI configuration', () => {
46
+ const field = embedding({
47
+ ui: {
48
+ showVector: true,
49
+ showMetadata: true,
50
+ },
51
+ });
52
+ expect(field.ui).toEqual({
53
+ showVector: true,
54
+ showMetadata: true,
55
+ });
56
+ });
57
+ });
58
+ describe('getZodSchema', () => {
59
+ it('should generate valid Zod schema', () => {
60
+ const field = embedding({ dimensions: 3 });
61
+ const schema = field.getZodSchema('embedding', 'create');
62
+ expect(schema).toBeDefined();
63
+ expect(schema instanceof z.ZodType).toBe(true);
64
+ });
65
+ it('should validate correct embedding structure', () => {
66
+ const field = embedding({ dimensions: 3 });
67
+ const schema = field.getZodSchema('embedding', 'create');
68
+ const validEmbedding = {
69
+ vector: [0.1, 0.2, 0.3],
70
+ metadata: {
71
+ model: 'text-embedding-3-small',
72
+ provider: 'openai',
73
+ dimensions: 3,
74
+ generatedAt: new Date().toISOString(),
75
+ },
76
+ };
77
+ expect(() => schema.parse(validEmbedding)).not.toThrow();
78
+ });
79
+ it('should accept null embedding', () => {
80
+ const field = embedding({ dimensions: 3 });
81
+ const schema = field.getZodSchema('embedding', 'create');
82
+ expect(() => schema.parse(null)).not.toThrow();
83
+ });
84
+ it('should accept undefined embedding', () => {
85
+ const field = embedding({ dimensions: 3 });
86
+ const schema = field.getZodSchema('embedding', 'create');
87
+ expect(() => schema.parse(undefined)).not.toThrow();
88
+ });
89
+ it('should reject incorrect vector dimensions', () => {
90
+ const field = embedding({ dimensions: 3 });
91
+ const schema = field.getZodSchema('embedding', 'create');
92
+ const invalidEmbedding = {
93
+ vector: [0.1, 0.2], // Only 2 dimensions, expected 3
94
+ metadata: {
95
+ model: 'test',
96
+ provider: 'test',
97
+ dimensions: 2,
98
+ generatedAt: new Date().toISOString(),
99
+ },
100
+ };
101
+ expect(() => schema.parse(invalidEmbedding)).toThrow(/exactly 3 dimensions/);
102
+ });
103
+ it('should validate metadata structure', () => {
104
+ const field = embedding({ dimensions: 3 });
105
+ const schema = field.getZodSchema('embedding', 'create');
106
+ const invalidEmbedding = {
107
+ vector: [0.1, 0.2, 0.3],
108
+ metadata: {
109
+ // Missing required fields
110
+ model: 'test',
111
+ },
112
+ };
113
+ expect(() => schema.parse(invalidEmbedding)).toThrow();
114
+ });
115
+ it('should accept optional sourceHash in metadata', () => {
116
+ const field = embedding({ dimensions: 3 });
117
+ const schema = field.getZodSchema('embedding', 'create');
118
+ const embeddingWithHash = {
119
+ vector: [0.1, 0.2, 0.3],
120
+ metadata: {
121
+ model: 'test',
122
+ provider: 'test',
123
+ dimensions: 3,
124
+ generatedAt: new Date().toISOString(),
125
+ sourceHash: 'abc123',
126
+ },
127
+ };
128
+ expect(() => schema.parse(embeddingWithHash)).not.toThrow();
129
+ });
130
+ it('should work for both create and update operations', () => {
131
+ const field = embedding({ dimensions: 3 });
132
+ const createSchema = field.getZodSchema('embedding', 'create');
133
+ const updateSchema = field.getZodSchema('embedding', 'update');
134
+ const validEmbedding = {
135
+ vector: [0.1, 0.2, 0.3],
136
+ metadata: {
137
+ model: 'test',
138
+ provider: 'test',
139
+ dimensions: 3,
140
+ generatedAt: new Date().toISOString(),
141
+ },
142
+ };
143
+ expect(() => createSchema.parse(validEmbedding)).not.toThrow();
144
+ expect(() => updateSchema.parse(validEmbedding)).not.toThrow();
145
+ });
146
+ });
147
+ describe('getPrismaType', () => {
148
+ it('should return Json type', () => {
149
+ const field = embedding();
150
+ const prismaType = field.getPrismaType('embedding');
151
+ expect(prismaType.type).toBe('Json');
152
+ });
153
+ it('should return optional modifier', () => {
154
+ const field = embedding();
155
+ const prismaType = field.getPrismaType('embedding');
156
+ expect(prismaType.modifiers).toBe('?');
157
+ });
158
+ it('should work regardless of field options', () => {
159
+ const field1 = embedding();
160
+ const field2 = embedding({ dimensions: 3072, provider: 'openai' });
161
+ const type1 = field1.getPrismaType('embedding');
162
+ const type2 = field2.getPrismaType('embedding');
163
+ expect(type1).toEqual(type2);
164
+ expect(type1.type).toBe('Json');
165
+ expect(type1.modifiers).toBe('?');
166
+ });
167
+ });
168
+ describe('getTypeScriptType', () => {
169
+ it('should return StoredEmbedding type', () => {
170
+ const field = embedding();
171
+ const tsType = field.getTypeScriptType();
172
+ expect(tsType.type).toBe('StoredEmbedding | null');
173
+ });
174
+ it('should be optional', () => {
175
+ const field = embedding();
176
+ const tsType = field.getTypeScriptType();
177
+ expect(tsType.optional).toBe(true);
178
+ });
179
+ it('should work regardless of field options', () => {
180
+ const field1 = embedding();
181
+ const field2 = embedding({ dimensions: 3072, provider: 'openai' });
182
+ const type1 = field1.getTypeScriptType();
183
+ const type2 = field2.getTypeScriptType();
184
+ expect(type1).toEqual(type2);
185
+ expect(type1.type).toBe('StoredEmbedding | null');
186
+ expect(type1.optional).toBe(true);
187
+ });
188
+ });
189
+ describe('Field configuration combinations', () => {
190
+ it('should support manual embedding storage', () => {
191
+ const field = embedding({
192
+ dimensions: 1536,
193
+ provider: 'openai',
194
+ });
195
+ expect(field.autoGenerate).toBe(false);
196
+ expect(field.sourceField).toBeUndefined();
197
+ expect(field.dimensions).toBe(1536);
198
+ expect(field.provider).toBe('openai');
199
+ });
200
+ it('should support automatic embedding generation', () => {
201
+ const field = embedding({
202
+ sourceField: 'content',
203
+ provider: 'openai',
204
+ dimensions: 1536,
205
+ autoGenerate: true,
206
+ });
207
+ expect(field.autoGenerate).toBe(true);
208
+ expect(field.sourceField).toBe('content');
209
+ expect(field.dimensions).toBe(1536);
210
+ expect(field.provider).toBe('openai');
211
+ });
212
+ it('should support chunking for long documents', () => {
213
+ const field = embedding({
214
+ sourceField: 'content',
215
+ chunking: {
216
+ strategy: 'recursive',
217
+ maxTokens: 500,
218
+ overlap: 50,
219
+ },
220
+ });
221
+ expect(field.chunking?.strategy).toBe('recursive');
222
+ expect(field.chunking?.maxTokens).toBe(500);
223
+ expect(field.chunking?.overlap).toBe(50);
224
+ });
225
+ it('should support multiple providers via provider name', () => {
226
+ const openaiField = embedding({ provider: 'openai' });
227
+ const ollamaField = embedding({ provider: 'ollama' });
228
+ expect(openaiField.provider).toBe('openai');
229
+ expect(ollamaField.provider).toBe('ollama');
230
+ });
231
+ });
232
+ describe('Field type conformance', () => {
233
+ it('should conform to BaseFieldConfig interface', () => {
234
+ const field = embedding();
235
+ expect(field).toHaveProperty('type');
236
+ expect(field).toHaveProperty('getZodSchema');
237
+ expect(field).toHaveProperty('getPrismaType');
238
+ expect(field).toHaveProperty('getTypeScriptType');
239
+ });
240
+ it('should have all required builder methods', () => {
241
+ const field = embedding();
242
+ expect(typeof field.getZodSchema).toBe('function');
243
+ expect(typeof field.getPrismaType).toBe('function');
244
+ expect(typeof field.getTypeScriptType).toBe('function');
245
+ });
246
+ it('should return consistent types across methods', () => {
247
+ const field = embedding({ dimensions: 1536 });
248
+ const zodSchema = field.getZodSchema('embedding', 'create');
249
+ const prismaType = field.getPrismaType('embedding');
250
+ const tsType = field.getTypeScriptType();
251
+ // All methods should be callable and return valid results
252
+ expect(zodSchema).toBeDefined();
253
+ expect(prismaType).toBeDefined();
254
+ expect(tsType).toBeDefined();
255
+ // Types should be consistent (Json in Prisma, StoredEmbedding in TS)
256
+ expect(prismaType.type).toBe('Json');
257
+ expect(tsType.type).toContain('StoredEmbedding');
258
+ });
259
+ });
260
+ describe('UI configuration', () => {
261
+ it('should default to hiding vector display', () => {
262
+ const field = embedding();
263
+ expect(field.ui?.showVector).toBeUndefined();
264
+ });
265
+ it('should allow showing vector in UI', () => {
266
+ const field = embedding({
267
+ ui: { showVector: true },
268
+ });
269
+ expect(field.ui?.showVector).toBe(true);
270
+ });
271
+ it('should default to showing metadata', () => {
272
+ const field = embedding();
273
+ expect(field.ui?.showMetadata).toBeUndefined();
274
+ });
275
+ it('should allow customizing metadata display', () => {
276
+ const field = embedding({
277
+ ui: { showMetadata: false },
278
+ });
279
+ expect(field.ui?.showMetadata).toBe(false);
280
+ });
281
+ });
282
+ describe('Edge cases', () => {
283
+ it('should handle very large dimensions', () => {
284
+ const field = embedding({ dimensions: 10000 });
285
+ expect(field.dimensions).toBe(10000);
286
+ const schema = field.getZodSchema('embedding', 'create');
287
+ const largeVector = Array(10000).fill(0.1);
288
+ const validEmbedding = {
289
+ vector: largeVector,
290
+ metadata: {
291
+ model: 'test',
292
+ provider: 'test',
293
+ dimensions: 10000,
294
+ generatedAt: new Date().toISOString(),
295
+ },
296
+ };
297
+ expect(() => schema.parse(validEmbedding)).not.toThrow();
298
+ });
299
+ it('should handle minimum dimensions', () => {
300
+ const field = embedding({ dimensions: 1 });
301
+ expect(field.dimensions).toBe(1);
302
+ const schema = field.getZodSchema('embedding', 'create');
303
+ const validEmbedding = {
304
+ vector: [0.5],
305
+ metadata: {
306
+ model: 'test',
307
+ provider: 'test',
308
+ dimensions: 1,
309
+ generatedAt: new Date().toISOString(),
310
+ },
311
+ };
312
+ expect(() => schema.parse(validEmbedding)).not.toThrow();
313
+ });
314
+ it('should handle empty sourceField gracefully', () => {
315
+ const field = embedding({ sourceField: '' });
316
+ expect(field.sourceField).toBe('');
317
+ // Empty string is truthy (it's a defined value), so autoGenerate will be true
318
+ // unless explicitly set to false
319
+ expect(field.autoGenerate).toBe(true);
320
+ });
321
+ });
322
+ });
323
+ //# sourceMappingURL=embedding.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embedding.test.js","sourceRoot":"","sources":["../../src/fields/embedding.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * RAG field types
3
+ */
4
+ export { embedding } from './embedding.js';
5
+ export type { EmbeddingField } from './embedding.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/fields/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC1C,YAAY,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * RAG field types
3
+ */
4
+ export { embedding } from './embedding.js';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/fields/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * @opensaas/stack-rag
3
+ * RAG and AI embeddings integration for OpenSaas Stack
4
+ */
5
+ export { openaiEmbeddings, ollamaEmbeddings, pgvectorStorage, sqliteVssStorage, jsonStorage, } from './config/index.js';
6
+ export { ragPlugin } from './config/plugin.js';
7
+ export type { RAGConfig, NormalizedRAGConfig, EmbeddingProviderConfig, OpenAIEmbeddingConfig, OllamaEmbeddingConfig, VectorStorageConfig, PgVectorStorageConfig, SqliteVssStorageConfig, JsonStorageConfig, ChunkingConfig, ChunkingStrategy, EmbeddingMetadata, StoredEmbedding, SearchResult, } from './config/types.js';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,WAAW,GACZ,MAAM,mBAAmB,CAAA;AAG1B,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAE9C,YAAY,EACV,SAAS,EACT,mBAAmB,EACnB,uBAAuB,EACvB,qBAAqB,EACrB,qBAAqB,EACrB,mBAAmB,EACnB,qBAAqB,EACrB,sBAAsB,EACtB,iBAAiB,EACjB,cAAc,EACd,gBAAgB,EAChB,iBAAiB,EACjB,eAAe,EACf,YAAY,GACb,MAAM,mBAAmB,CAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,9 @@
1
+ /**
2
+ * @opensaas/stack-rag
3
+ * RAG and AI embeddings integration for OpenSaas Stack
4
+ */
5
+ // Config exports
6
+ export { openaiEmbeddings, ollamaEmbeddings, pgvectorStorage, sqliteVssStorage, jsonStorage, } from './config/index.js';
7
+ // Plugin export
8
+ export { ragPlugin } from './config/plugin.js';
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,iBAAiB;AACjB,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,WAAW,GACZ,MAAM,mBAAmB,CAAA;AAE1B,gBAAgB;AAChB,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * MCP (Model Context Protocol) integration for RAG
3
+ *
4
+ * MCP tools for semantic search are automatically generated by the ragPlugin.
5
+ * This export is provided for future extensibility and custom MCP tool generation.
6
+ */
7
+ export type { SearchResult } from '../config/types.js';
8
+ export type { SemanticSearchOptions } from '../runtime/search.js';
9
+ /**
10
+ * MCP tools are automatically generated by ragPlugin when:
11
+ * - MCP is enabled in main config
12
+ * - ragPlugin has enableMcpTools: true (default)
13
+ *
14
+ * Generated tools:
15
+ * - semantic_search_{listKey} - Search by natural language query
16
+ *
17
+ * See packages/rag/src/config/plugin.ts for implementation details.
18
+ */
19
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,YAAY,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACtD,YAAY,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAA;AAEjE;;;;;;;;;GASG"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * MCP (Model Context Protocol) integration for RAG
3
+ *
4
+ * MCP tools for semantic search are automatically generated by the ragPlugin.
5
+ * This export is provided for future extensibility and custom MCP tool generation.
6
+ */
7
+ export {};
8
+ /**
9
+ * MCP tools are automatically generated by ragPlugin when:
10
+ * - MCP is enabled in main config
11
+ * - ragPlugin has enableMcpTools: true (default)
12
+ *
13
+ * Generated tools:
14
+ * - semantic_search_{listKey} - Search by natural language query
15
+ *
16
+ * See packages/rag/src/config/plugin.ts for implementation details.
17
+ */
18
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;;AAMH;;;;;;;;;GASG"}
@@ -0,0 +1,38 @@
1
+ import type { EmbeddingProvider } from './types.js';
2
+ import type { EmbeddingProviderConfig } from '../config/types.js';
3
+ /**
4
+ * Register a custom embedding provider factory
5
+ * Use this to add support for custom embedding providers
6
+ *
7
+ * @example
8
+ * ```typescript
9
+ * import { registerEmbeddingProvider } from '@opensaas/stack-rag/providers'
10
+ *
11
+ * registerEmbeddingProvider('custom', (config) => {
12
+ * return new CustomEmbeddingProvider(config)
13
+ * })
14
+ * ```
15
+ */
16
+ export declare function registerEmbeddingProvider(type: string, factory: (config: EmbeddingProviderConfig) => EmbeddingProvider): void;
17
+ /**
18
+ * Create an embedding provider instance from configuration
19
+ * Automatically selects the correct provider based on config.type
20
+ *
21
+ * @example
22
+ * ```typescript
23
+ * import { createEmbeddingProvider } from '@opensaas/stack-rag/providers'
24
+ *
25
+ * const provider = createEmbeddingProvider({
26
+ * type: 'openai',
27
+ * apiKey: process.env.OPENAI_API_KEY!,
28
+ * model: 'text-embedding-3-small'
29
+ * })
30
+ *
31
+ * const embedding = await provider.embed('Hello world')
32
+ * ```
33
+ */
34
+ export declare function createEmbeddingProvider(config: EmbeddingProviderConfig): EmbeddingProvider;
35
+ export * from './types.js';
36
+ export { OpenAIEmbeddingProvider, createOpenAIProvider } from './openai.js';
37
+ export { OllamaEmbeddingProvider, createOllamaProvider } from './ollama.js';
38
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AACnD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAA;AA0BjE;;;;;;;;;;;;GAYG;AACH,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,CAAC,MAAM,EAAE,uBAAuB,KAAK,iBAAiB,GAC9D,IAAI,CAEN;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,uBAAuB,GAAG,iBAAiB,CAW1F;AAGD,cAAc,YAAY,CAAA;AAC1B,OAAO,EAAE,uBAAuB,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AAC3E,OAAO,EAAE,uBAAuB,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA"}
@@ -0,0 +1,68 @@
1
+ import { createOpenAIProvider } from './openai.js';
2
+ import { createOllamaProvider } from './ollama.js';
3
+ /**
4
+ * Provider factory registry
5
+ * Maps provider types to factory functions
6
+ */
7
+ const providerFactories = new Map();
8
+ /**
9
+ * Register the built-in providers
10
+ */
11
+ providerFactories.set('openai', (config) => {
12
+ if (config.type !== 'openai') {
13
+ throw new Error('Invalid config type for OpenAI provider');
14
+ }
15
+ return createOpenAIProvider(config);
16
+ });
17
+ providerFactories.set('ollama', (config) => {
18
+ if (config.type !== 'ollama') {
19
+ throw new Error('Invalid config type for Ollama provider');
20
+ }
21
+ return createOllamaProvider(config);
22
+ });
23
+ /**
24
+ * Register a custom embedding provider factory
25
+ * Use this to add support for custom embedding providers
26
+ *
27
+ * @example
28
+ * ```typescript
29
+ * import { registerEmbeddingProvider } from '@opensaas/stack-rag/providers'
30
+ *
31
+ * registerEmbeddingProvider('custom', (config) => {
32
+ * return new CustomEmbeddingProvider(config)
33
+ * })
34
+ * ```
35
+ */
36
+ export function registerEmbeddingProvider(type, factory) {
37
+ providerFactories.set(type, factory);
38
+ }
39
+ /**
40
+ * Create an embedding provider instance from configuration
41
+ * Automatically selects the correct provider based on config.type
42
+ *
43
+ * @example
44
+ * ```typescript
45
+ * import { createEmbeddingProvider } from '@opensaas/stack-rag/providers'
46
+ *
47
+ * const provider = createEmbeddingProvider({
48
+ * type: 'openai',
49
+ * apiKey: process.env.OPENAI_API_KEY!,
50
+ * model: 'text-embedding-3-small'
51
+ * })
52
+ *
53
+ * const embedding = await provider.embed('Hello world')
54
+ * ```
55
+ */
56
+ export function createEmbeddingProvider(config) {
57
+ const factory = providerFactories.get(config.type);
58
+ if (!factory) {
59
+ throw new Error(`Unknown embedding provider type: ${config.type}. ` +
60
+ `Available providers: ${Array.from(providerFactories.keys()).join(', ')}`);
61
+ }
62
+ return factory(config);
63
+ }
64
+ // Export types and individual providers
65
+ export * from './types.js';
66
+ export { OpenAIEmbeddingProvider, createOpenAIProvider } from './openai.js';
67
+ export { OllamaEmbeddingProvider, createOllamaProvider } from './ollama.js';
68
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AAClD,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AAElD;;;GAGG;AACH,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAAkE,CAAA;AAEnG;;GAEG;AACH,iBAAiB,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE;IACzC,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAA;IAC5D,CAAC;IACD,OAAO,oBAAoB,CAAC,MAA4D,CAAC,CAAA;AAC3F,CAAC,CAAC,CAAA;AACF,iBAAiB,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE;IACzC,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAA;IAC5D,CAAC;IACD,OAAO,oBAAoB,CAAC,MAA4D,CAAC,CAAA;AAC3F,CAAC,CAAC,CAAA;AAEF;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,yBAAyB,CACvC,IAAY,EACZ,OAA+D;IAE/D,iBAAiB,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;AACtC,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,uBAAuB,CAAC,MAA+B;IACrE,MAAM,OAAO,GAAG,iBAAiB,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IAElD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CACb,oCAAoC,MAAM,CAAC,IAAI,IAAI;YACjD,wBAAwB,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC5E,CAAA;IACH,CAAC;IAED,OAAO,OAAO,CAAC,MAAM,CAAC,CAAA;AACxB,CAAC;AAED,wCAAwC;AACxC,cAAc,YAAY,CAAA;AAC1B,OAAO,EAAE,uBAAuB,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AAC3E,OAAO,EAAE,uBAAuB,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA"}
@@ -0,0 +1,49 @@
1
+ import type { EmbeddingProvider } from './types.js';
2
+ import type { OllamaEmbeddingConfig } from '../config/types.js';
3
+ /**
4
+ * Ollama embedding provider
5
+ * Uses local Ollama instance for embedding generation
6
+ */
7
+ export declare class OllamaEmbeddingProvider implements EmbeddingProvider {
8
+ readonly type = "ollama";
9
+ readonly model: string;
10
+ dimensions: number;
11
+ private baseURL;
12
+ private dimensionsInitialized;
13
+ constructor(config: OllamaEmbeddingConfig);
14
+ /**
15
+ * Initialize dimensions by generating a test embedding
16
+ */
17
+ private initializeDimensions;
18
+ /**
19
+ * Make HTTP request to Ollama API
20
+ */
21
+ private makeRequest;
22
+ /**
23
+ * Generate embedding for a single text
24
+ */
25
+ embed(text: string): Promise<number[]>;
26
+ /**
27
+ * Generate embeddings for multiple texts in a batch
28
+ * Note: Ollama doesn't have native batch API, so we make parallel requests
29
+ */
30
+ embedBatch(texts: string[]): Promise<number[][]>;
31
+ }
32
+ /**
33
+ * Create an Ollama embedding provider instance
34
+ *
35
+ * @example
36
+ * ```typescript
37
+ * import { createOllamaProvider } from '@opensaas/stack-rag/providers'
38
+ *
39
+ * const provider = createOllamaProvider({
40
+ * type: 'ollama',
41
+ * baseURL: 'http://localhost:11434',
42
+ * model: 'nomic-embed-text'
43
+ * })
44
+ *
45
+ * const embedding = await provider.embed('Hello world')
46
+ * ```
47
+ */
48
+ export declare function createOllamaProvider(config: OllamaEmbeddingConfig): OllamaEmbeddingProvider;
49
+ //# sourceMappingURL=ollama.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ollama.d.ts","sourceRoot":"","sources":["../../src/providers/ollama.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AACnD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAA;AAa/D;;;GAGG;AACH,qBAAa,uBAAwB,YAAW,iBAAiB;IAC/D,QAAQ,CAAC,IAAI,YAAW;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,UAAU,EAAE,MAAM,CAAI;IAEtB,OAAO,CAAC,OAAO,CAAQ;IACvB,OAAO,CAAC,qBAAqB,CAAQ;gBAEzB,MAAM,EAAE,qBAAqB;IAUzC;;OAEG;YACW,oBAAoB;IAgBlC;;OAEG;YACW,WAAW;IA0BzB;;OAEG;IACG,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAuB5C;;;OAGG;IACG,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;CAmDvD;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,qBAAqB,GAAG,uBAAuB,CAE3F"}