@opensaas/stack-rag 0.1.6 → 0.3.0
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.
- package/.turbo/turbo-build.log +1 -1
- package/CHANGELOG.md +141 -0
- package/README.md +82 -6
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +9 -0
- package/dist/config/index.js.map +1 -1
- package/dist/config/plugin.d.ts.map +1 -1
- package/dist/config/plugin.js +61 -1
- package/dist/config/plugin.js.map +1 -1
- package/dist/config/plugin.test.js +70 -14
- package/dist/config/plugin.test.js.map +1 -1
- package/dist/config/types.d.ts +186 -0
- package/dist/config/types.d.ts.map +1 -1
- package/dist/fields/index.d.ts +1 -0
- package/dist/fields/index.d.ts.map +1 -1
- package/dist/fields/index.js +1 -0
- package/dist/fields/index.js.map +1 -1
- package/dist/fields/searchable.d.ts +42 -0
- package/dist/fields/searchable.d.ts.map +1 -0
- package/dist/fields/searchable.js +51 -0
- package/dist/fields/searchable.js.map +1 -0
- package/dist/fields/searchable.test.d.ts +2 -0
- package/dist/fields/searchable.test.d.ts.map +1 -0
- package/dist/fields/searchable.test.js +112 -0
- package/dist/fields/searchable.test.js.map +1 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/providers/openai.d.ts +2 -0
- package/dist/providers/openai.d.ts.map +1 -1
- package/dist/providers/openai.js +35 -20
- package/dist/providers/openai.js.map +1 -1
- package/dist/runtime/batch.test.js +1 -1
- package/dist/runtime/build-time.d.ts +100 -0
- package/dist/runtime/build-time.d.ts.map +1 -0
- package/dist/runtime/build-time.js +185 -0
- package/dist/runtime/build-time.js.map +1 -0
- package/dist/runtime/index.d.ts +3 -0
- package/dist/runtime/index.d.ts.map +1 -1
- package/dist/runtime/index.js +6 -0
- package/dist/runtime/index.js.map +1 -1
- package/dist/runtime/markdown.d.ts +33 -0
- package/dist/runtime/markdown.d.ts.map +1 -0
- package/dist/runtime/markdown.js +94 -0
- package/dist/runtime/markdown.js.map +1 -0
- package/dist/runtime/provider-helpers.d.ts +56 -0
- package/dist/runtime/provider-helpers.d.ts.map +1 -0
- package/dist/runtime/provider-helpers.js +95 -0
- package/dist/runtime/provider-helpers.js.map +1 -0
- package/dist/runtime/types.d.ts +29 -0
- package/dist/runtime/types.d.ts.map +1 -0
- package/dist/runtime/types.js +6 -0
- package/dist/runtime/types.js.map +1 -0
- package/dist/storage/access-filter.d.ts +30 -0
- package/dist/storage/access-filter.d.ts.map +1 -0
- package/dist/storage/access-filter.js +241 -0
- package/dist/storage/access-filter.js.map +1 -0
- package/dist/storage/index.d.ts +2 -0
- package/dist/storage/index.d.ts.map +1 -1
- package/dist/storage/index.js +3 -0
- package/dist/storage/index.js.map +1 -1
- package/dist/storage/json-file.d.ts +53 -0
- package/dist/storage/json-file.d.ts.map +1 -0
- package/dist/storage/json-file.js +124 -0
- package/dist/storage/json-file.js.map +1 -0
- package/dist/storage/pgvector.d.ts.map +1 -1
- package/dist/storage/pgvector.js +26 -11
- package/dist/storage/pgvector.js.map +1 -1
- package/dist/storage/storage.test.js +2 -0
- package/dist/storage/storage.test.js.map +1 -1
- package/dist/storage/types.d.ts +5 -0
- package/dist/storage/types.d.ts.map +1 -1
- package/dist/storage/types.js.map +1 -1
- package/package.json +6 -5
- package/src/config/index.ts +9 -0
- package/src/config/plugin.test.ts +70 -14
- package/src/config/plugin.ts +72 -2
- package/src/config/types.ts +217 -0
- package/src/fields/index.ts +2 -0
- package/src/fields/searchable.test.ts +136 -0
- package/src/fields/searchable.ts +57 -0
- package/src/index.ts +6 -0
- package/src/providers/openai.ts +37 -22
- package/src/runtime/batch.test.ts +1 -1
- package/src/runtime/build-time.ts +216 -0
- package/src/runtime/index.ts +18 -0
- package/src/runtime/markdown.ts +119 -0
- package/src/runtime/provider-helpers.ts +115 -0
- package/src/runtime/types.ts +30 -0
- package/src/storage/access-filter.ts +303 -0
- package/src/storage/index.ts +4 -0
- package/src/storage/json-file.ts +157 -0
- package/src/storage/pgvector.ts +31 -11
- package/src/storage/storage.test.ts +2 -0
- package/src/storage/types.ts +6 -0
- package/tsconfig.tsbuildinfo +1 -1
package/.turbo/turbo-build.log
CHANGED
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,146 @@
|
|
|
1
1
|
# @opensaas/stack-rag
|
|
2
2
|
|
|
3
|
+
## 0.3.0
|
|
4
|
+
|
|
5
|
+
## 0.2.0
|
|
6
|
+
|
|
7
|
+
### Patch Changes
|
|
8
|
+
|
|
9
|
+
- [#132](https://github.com/OpenSaasAU/stack/pull/132) [`fcf5cb8`](https://github.com/OpenSaasAU/stack/commit/fcf5cb8bbd55d802350b8d97e342dd7f6368163b) Thanks [@borisno2](https://github.com/borisno2)! - Upgrade to Prisma 7 with database adapter support
|
|
10
|
+
|
|
11
|
+
## Breaking Changes
|
|
12
|
+
|
|
13
|
+
### Required `prismaClientConstructor`
|
|
14
|
+
|
|
15
|
+
Prisma 7 requires database adapters. All configs must now include `prismaClientConstructor`:
|
|
16
|
+
|
|
17
|
+
```typescript
|
|
18
|
+
import { PrismaBetterSQLite3 } from '@prisma/adapter-better-sqlite3'
|
|
19
|
+
import Database from 'better-sqlite3'
|
|
20
|
+
|
|
21
|
+
export default config({
|
|
22
|
+
db: {
|
|
23
|
+
provider: 'sqlite',
|
|
24
|
+
prismaClientConstructor: (PrismaClient) => {
|
|
25
|
+
const db = new Database(process.env.DATABASE_URL || './dev.db')
|
|
26
|
+
const adapter = new PrismaBetterSQLite3(db)
|
|
27
|
+
return new PrismaClient({ adapter })
|
|
28
|
+
},
|
|
29
|
+
},
|
|
30
|
+
})
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
### Removed `url` from `DatabaseConfig`
|
|
34
|
+
|
|
35
|
+
The `url` field has been removed from the `DatabaseConfig` type. Database connection URLs are now passed directly to adapters in `prismaClientConstructor`:
|
|
36
|
+
|
|
37
|
+
```typescript
|
|
38
|
+
// ❌ Before (Prisma 6)
|
|
39
|
+
db: {
|
|
40
|
+
provider: 'sqlite',
|
|
41
|
+
url: 'file:./dev.db', // url in config
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// ✅ After (Prisma 7)
|
|
45
|
+
db: {
|
|
46
|
+
provider: 'sqlite',
|
|
47
|
+
prismaClientConstructor: (PrismaClient) => {
|
|
48
|
+
const adapter = new PrismaBetterSQLite3({ url: './dev.db' }) // url in adapter
|
|
49
|
+
return new PrismaClient({ adapter })
|
|
50
|
+
},
|
|
51
|
+
}
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
### Generated Schema Changes
|
|
55
|
+
- Generator provider changed from `prisma-client-js` to `prisma-client`
|
|
56
|
+
- Removed `url` field from datasource block
|
|
57
|
+
- Database URL now passed via adapter in `prismaClientConstructor`
|
|
58
|
+
|
|
59
|
+
### Required Dependencies
|
|
60
|
+
|
|
61
|
+
Install the appropriate adapter for your database:
|
|
62
|
+
- **SQLite**: `@prisma/adapter-better-sqlite3` + `better-sqlite3`
|
|
63
|
+
- **PostgreSQL**: `@prisma/adapter-pg` + `pg`
|
|
64
|
+
- **MySQL**: `@prisma/adapter-mysql` + `mysql2`
|
|
65
|
+
|
|
66
|
+
## Migration Steps
|
|
67
|
+
1. Install Prisma 7 and adapter:
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
pnpm add @prisma/client@7 @prisma/adapter-better-sqlite3 better-sqlite3
|
|
71
|
+
pnpm add -D prisma@7
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
2. Update your `opensaas.config.ts` to include `prismaClientConstructor` (see example above)
|
|
75
|
+
3. Regenerate schema and client:
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
pnpm generate
|
|
79
|
+
npx prisma generate
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
4. Push schema to database:
|
|
83
|
+
```bash
|
|
84
|
+
pnpm db:push
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
See the updated documentation in CLAUDE.md for more examples including PostgreSQL and custom adapters.
|
|
88
|
+
|
|
89
|
+
- [#107](https://github.com/OpenSaasAU/stack/pull/107) [`f4f3966`](https://github.com/OpenSaasAU/stack/commit/f4f3966faedba07d2cf412fab826d81e30c63a6c) Thanks [@borisno2](https://github.com/borisno2)! - Add strict typing for plugin runtime services
|
|
90
|
+
|
|
91
|
+
This change implements fully typed plugin runtime services, providing autocomplete and type safety for `context.plugins` throughout the codebase.
|
|
92
|
+
|
|
93
|
+
**Core Changes:**
|
|
94
|
+
- Extended `Plugin` type with optional `runtimeServiceTypes` metadata for type-safe code generation
|
|
95
|
+
- Converted `OpenSaasConfig` and `AccessContext` from `type` to `interface` to enable module augmentation
|
|
96
|
+
- Plugins can now declare their runtime service type information
|
|
97
|
+
|
|
98
|
+
**Auth Plugin:**
|
|
99
|
+
- Added `AuthRuntimeServices` interface defining runtime service types
|
|
100
|
+
- Exported runtime types from package
|
|
101
|
+
- Users now get full autocomplete for `context.plugins.auth.getUser()` and `context.plugins.auth.getCurrentUser()`
|
|
102
|
+
|
|
103
|
+
**RAG Plugin:**
|
|
104
|
+
- Added `RAGRuntimeServices` interface defining runtime service types
|
|
105
|
+
- Exported runtime types from package
|
|
106
|
+
- Users now get full autocomplete for `context.plugins.rag.generateEmbedding()` and `context.plugins.rag.generateEmbeddings()`
|
|
107
|
+
|
|
108
|
+
**CLI Generator:**
|
|
109
|
+
- Enhanced plugin types generator to import and use plugin runtime service types
|
|
110
|
+
- Generated `.opensaas/plugin-types.ts` now includes proper type imports
|
|
111
|
+
- `PluginServices` interface extends `Record<string, Record<string, any> | undefined>` for type compatibility
|
|
112
|
+
- Maintains backwards compatibility with plugins that don't provide type metadata
|
|
113
|
+
|
|
114
|
+
**UI Package:**
|
|
115
|
+
- Updated `AdminUI` props to accept contexts with typed plugin services
|
|
116
|
+
- Ensures compatibility between generated context types and UI components
|
|
117
|
+
|
|
118
|
+
**Benefits:**
|
|
119
|
+
- Full TypeScript autocomplete for all plugin runtime methods
|
|
120
|
+
- Compile-time type checking catches errors early
|
|
121
|
+
- Better IDE experience with hover documentation and jump-to-definition
|
|
122
|
+
- Backwards compatible - third-party plugins without type metadata continue to work
|
|
123
|
+
- Zero type errors in examples
|
|
124
|
+
|
|
125
|
+
**Example:**
|
|
126
|
+
|
|
127
|
+
```typescript
|
|
128
|
+
const context = await getContext()
|
|
129
|
+
|
|
130
|
+
// Fully typed with autocomplete
|
|
131
|
+
context.plugins.auth.getUser('123') // (userId: string) => Promise<unknown>
|
|
132
|
+
context.plugins.rag.generateEmbedding('text') // (text: string, providerName?: string) => Promise<number[]>
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
## 0.1.7
|
|
136
|
+
|
|
137
|
+
### Patch Changes
|
|
138
|
+
|
|
139
|
+
- 372d467: Add `searchable` helper functions to embeddings
|
|
140
|
+
- 372d467: Add sudo to context to bypass access control
|
|
141
|
+
- Updated dependencies [372d467]
|
|
142
|
+
- @opensaas/stack-core@0.1.7
|
|
143
|
+
|
|
3
144
|
## 0.1.6
|
|
4
145
|
|
|
5
146
|
### Patch Changes
|
package/README.md
CHANGED
|
@@ -35,7 +35,7 @@ pnpm add openai # For OpenAI embeddings
|
|
|
35
35
|
import { config, list } from '@opensaas/stack-core'
|
|
36
36
|
import { text } from '@opensaas/stack-core/fields'
|
|
37
37
|
import { ragPlugin, openaiEmbeddings, pgvectorStorage } from '@opensaas/stack-rag'
|
|
38
|
-
import {
|
|
38
|
+
import { searchable } from '@opensaas/stack-rag/fields'
|
|
39
39
|
|
|
40
40
|
export default config({
|
|
41
41
|
plugins: [
|
|
@@ -55,13 +55,10 @@ export default config({
|
|
|
55
55
|
Article: list({
|
|
56
56
|
fields: {
|
|
57
57
|
title: text({ validation: { isRequired: true } }),
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
contentEmbedding: embedding({
|
|
61
|
-
sourceField: 'content', // Auto-embed when content changes
|
|
58
|
+
// Use searchable() wrapper for automatic embedding generation
|
|
59
|
+
content: searchable(text({ validation: { isRequired: true } }), {
|
|
62
60
|
provider: 'openai',
|
|
63
61
|
dimensions: 1536,
|
|
64
|
-
autoGenerate: true,
|
|
65
62
|
}),
|
|
66
63
|
},
|
|
67
64
|
}),
|
|
@@ -69,6 +66,12 @@ export default config({
|
|
|
69
66
|
})
|
|
70
67
|
```
|
|
71
68
|
|
|
69
|
+
**What's happening:**
|
|
70
|
+
|
|
71
|
+
- The `searchable()` wrapper automatically creates a `contentEmbedding` field
|
|
72
|
+
- Embeddings are auto-generated whenever `content` changes
|
|
73
|
+
- The embedding field respects all your existing access control rules
|
|
74
|
+
|
|
72
75
|
### 2. Generate schema and push to database
|
|
73
76
|
|
|
74
77
|
```bash
|
|
@@ -182,6 +185,79 @@ Good for SQLite-based apps. Requires sqlite-vss extension.
|
|
|
182
185
|
storage: sqliteVssStorage({ distanceFunction: 'cosine' })
|
|
183
186
|
```
|
|
184
187
|
|
|
188
|
+
## Field Configuration Patterns
|
|
189
|
+
|
|
190
|
+
### High-Level: `searchable()` Wrapper (Recommended)
|
|
191
|
+
|
|
192
|
+
The easiest way to add semantic search to any field:
|
|
193
|
+
|
|
194
|
+
```typescript
|
|
195
|
+
import { searchable } from '@opensaas/stack-rag/fields'
|
|
196
|
+
|
|
197
|
+
fields: {
|
|
198
|
+
content: searchable(text({ validation: { isRequired: true } }), {
|
|
199
|
+
provider: 'openai',
|
|
200
|
+
dimensions: 1536,
|
|
201
|
+
})
|
|
202
|
+
}
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
**What it does:**
|
|
206
|
+
|
|
207
|
+
- Automatically creates a companion `contentEmbedding` field
|
|
208
|
+
- Links it to the source field (`content`)
|
|
209
|
+
- Auto-generates embeddings when content changes
|
|
210
|
+
- Clean, concise syntax
|
|
211
|
+
|
|
212
|
+
**Options:**
|
|
213
|
+
|
|
214
|
+
```typescript
|
|
215
|
+
type SearchableOptions = {
|
|
216
|
+
provider?: string // Embedding provider (e.g., 'openai', 'ollama')
|
|
217
|
+
dimensions?: number // Vector dimensions (default: 1536)
|
|
218
|
+
chunking?: ChunkingConfig // Text chunking configuration
|
|
219
|
+
embeddingFieldName?: string // Custom embedding field name (default: `${fieldName}Embedding`)
|
|
220
|
+
}
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
**Custom embedding field name:**
|
|
224
|
+
|
|
225
|
+
```typescript
|
|
226
|
+
fields: {
|
|
227
|
+
body: searchable(text(), {
|
|
228
|
+
provider: 'openai',
|
|
229
|
+
embeddingFieldName: 'bodyVector', // Instead of 'bodyEmbedding'
|
|
230
|
+
})
|
|
231
|
+
}
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
### Low-Level: Manual `embedding()` Field
|
|
235
|
+
|
|
236
|
+
For advanced use cases where you need more control:
|
|
237
|
+
|
|
238
|
+
```typescript
|
|
239
|
+
import { embedding } from '@opensaas/stack-rag/fields'
|
|
240
|
+
|
|
241
|
+
fields: {
|
|
242
|
+
content: text({ validation: { isRequired: true } }),
|
|
243
|
+
contentEmbedding: embedding({
|
|
244
|
+
sourceField: 'content',
|
|
245
|
+
provider: 'openai',
|
|
246
|
+
dimensions: 1536,
|
|
247
|
+
autoGenerate: true,
|
|
248
|
+
})
|
|
249
|
+
}
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
**When to use manual pattern:**
|
|
253
|
+
|
|
254
|
+
- Need access to the embedding field in your schema
|
|
255
|
+
- Want to store embeddings without a source field
|
|
256
|
+
- Building custom embedding pipelines
|
|
257
|
+
- Need field-level hooks on the embedding field
|
|
258
|
+
|
|
259
|
+
Both patterns are fully supported and can be used interchangeably.
|
|
260
|
+
|
|
185
261
|
## MCP Integration
|
|
186
262
|
|
|
187
263
|
Automatic semantic search tools for AI assistants:
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EACT,mBAAmB,EACnB,mBAAmB,EACnB,qBAAqB,EACrB,qBAAqB,EACtB,MAAM,YAAY,CAAA;AAEnB;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,mBAAmB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EACT,mBAAmB,EACnB,mBAAmB,EACnB,qBAAqB,EACrB,qBAAqB,EACtB,MAAM,YAAY,CAAA;AAEnB;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,mBAAmB,CAuBzE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,IAAI,CAAC,qBAAqB,EAAE,MAAM,CAAC,GAC1C,qBAAqB,CAKvB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,CAAC,EAAE,IAAI,CAAC,qBAAqB,EAAE,MAAM,CAAC,GAC3C,qBAAqB,CAMvB;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,MAAM,CAAC,EAAE;IACvC,gBAAgB,CAAC,EAAE,QAAQ,GAAG,IAAI,GAAG,eAAe,CAAA;CACrD,GAAG,mBAAmB,CAKtB;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,CAAC,EAAE;IACxC,gBAAgB,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAA;CACnC,GAAG,mBAAmB,CAKtB;AAED;;;;;;;GAOG;AACH,wBAAgB,WAAW,IAAI,mBAAmB,CAEjD;AAED,YAAY,EAAE,SAAS,EAAE,mBAAmB,EAAE,CAAA;AAC9C,cAAc,YAAY,CAAA"}
|
package/dist/config/index.js
CHANGED
|
@@ -11,6 +11,15 @@ export function normalizeRAGConfig(config) {
|
|
|
11
11
|
maxTokens: config.chunking?.maxTokens || 500,
|
|
12
12
|
overlap: config.chunking?.overlap || 50,
|
|
13
13
|
},
|
|
14
|
+
buildTime: config.buildTime
|
|
15
|
+
? {
|
|
16
|
+
enabled: config.buildTime.enabled,
|
|
17
|
+
outputPath: config.buildTime.outputPath || '.embeddings/embeddings.json',
|
|
18
|
+
chunkSize: config.buildTime.chunkSize || 500,
|
|
19
|
+
chunkOverlap: config.buildTime.chunkOverlap || 50,
|
|
20
|
+
differential: config.buildTime.differential ?? true,
|
|
21
|
+
}
|
|
22
|
+
: null,
|
|
14
23
|
enableMcpTools: config.enableMcpTools ?? true,
|
|
15
24
|
batchSize: config.batchSize || 10,
|
|
16
25
|
rateLimit: config.rateLimit || 100,
|
package/dist/config/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAQA;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAAiB;IAClD,OAAO;QACL,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,IAAI;QACjC,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,EAAE;QACjC,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE;QAC3C,QAAQ,EAAE;YACR,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,QAAQ,IAAI,WAAW;YAClD,SAAS,EAAE,MAAM,CAAC,QAAQ,EAAE,SAAS,IAAI,GAAG;YAC5C,OAAO,EAAE,MAAM,CAAC,QAAQ,EAAE,OAAO,IAAI,EAAE;SACxC;QACD,cAAc,EAAE,MAAM,CAAC,cAAc,IAAI,IAAI;QAC7C,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,EAAE;QACjC,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,GAAG;KACnC,CAAA;AACH,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,gBAAgB,CAC9B,MAA2C;IAE3C,OAAO;QACL,IAAI,EAAE,QAAQ;QACd,GAAG,MAAM;KACV,CAAA;AACH,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,gBAAgB,CAC9B,MAA4C;IAE5C,OAAO;QACL,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,MAAM,EAAE,OAAO,IAAI,wBAAwB;QACpD,KAAK,EAAE,MAAM,EAAE,KAAK,IAAI,kBAAkB;KAC3C,CAAA;AACH,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,eAAe,CAAC,MAE/B;IACC,OAAO;QACL,IAAI,EAAE,UAAU;QAChB,gBAAgB,EAAE,MAAM,EAAE,gBAAgB,IAAI,QAAQ;KACvD,CAAA;AACH,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAEhC;IACC,OAAO;QACL,IAAI,EAAE,YAAY;QAClB,gBAAgB,EAAE,MAAM,EAAE,gBAAgB,IAAI,QAAQ;KACvD,CAAA;AACH,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,WAAW;IACzB,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAA;AACzB,CAAC;AAGD,cAAc,YAAY,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAQA;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAAiB;IAClD,OAAO;QACL,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,IAAI;QACjC,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,EAAE;QACjC,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE;QAC3C,QAAQ,EAAE;YACR,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,QAAQ,IAAI,WAAW;YAClD,SAAS,EAAE,MAAM,CAAC,QAAQ,EAAE,SAAS,IAAI,GAAG;YAC5C,OAAO,EAAE,MAAM,CAAC,QAAQ,EAAE,OAAO,IAAI,EAAE;SACxC;QACD,SAAS,EAAE,MAAM,CAAC,SAAS;YACzB,CAAC,CAAC;gBACE,OAAO,EAAE,MAAM,CAAC,SAAS,CAAC,OAAO;gBACjC,UAAU,EAAE,MAAM,CAAC,SAAS,CAAC,UAAU,IAAI,6BAA6B;gBACxE,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC,SAAS,IAAI,GAAG;gBAC5C,YAAY,EAAE,MAAM,CAAC,SAAS,CAAC,YAAY,IAAI,EAAE;gBACjD,YAAY,EAAE,MAAM,CAAC,SAAS,CAAC,YAAY,IAAI,IAAI;aACpD;YACH,CAAC,CAAC,IAAI;QACR,cAAc,EAAE,MAAM,CAAC,cAAc,IAAI,IAAI;QAC7C,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,EAAE;QACjC,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,GAAG;KACnC,CAAA;AACH,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,gBAAgB,CAC9B,MAA2C;IAE3C,OAAO;QACL,IAAI,EAAE,QAAQ;QACd,GAAG,MAAM;KACV,CAAA;AACH,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,gBAAgB,CAC9B,MAA4C;IAE5C,OAAO;QACL,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,MAAM,EAAE,OAAO,IAAI,wBAAwB;QACpD,KAAK,EAAE,MAAM,EAAE,KAAK,IAAI,kBAAkB;KAC3C,CAAA;AACH,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,eAAe,CAAC,MAE/B;IACC,OAAO;QACL,IAAI,EAAE,UAAU;QAChB,gBAAgB,EAAE,MAAM,EAAE,gBAAgB,IAAI,QAAQ;KACvD,CAAA;AACH,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAEhC;IACC,OAAO;QACL,IAAI,EAAE,YAAY;QAClB,gBAAgB,EAAE,MAAM,EAAE,gBAAgB,IAAI,QAAQ;KACvD,CAAA;AACH,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,WAAW;IACzB,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAA;AACzB,CAAC;AAGD,cAAc,YAAY,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../src/config/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAClD,OAAO,KAAK,EAAE,SAAS,
|
|
1
|
+
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../src/config/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAClD,OAAO,KAAK,EAAE,SAAS,EAA2C,MAAM,YAAY,CAAA;AAKpF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM,CAuPnD"}
|
package/dist/config/plugin.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { normalizeRAGConfig } from './index.js';
|
|
2
2
|
import { createEmbeddingProvider } from '../providers/index.js';
|
|
3
|
+
import { embedding } from '../fields/embedding.js';
|
|
3
4
|
/**
|
|
4
5
|
* RAG plugin for OpenSaas Stack
|
|
5
6
|
* Provides vector embeddings, semantic search, and automatic embedding generation
|
|
@@ -39,8 +40,39 @@ export function ragPlugin(config) {
|
|
|
39
40
|
return {
|
|
40
41
|
name: 'rag',
|
|
41
42
|
version: '0.1.0',
|
|
43
|
+
runtimeServiceTypes: {
|
|
44
|
+
import: "import type { RAGRuntimeServices } from '@opensaas/stack-rag'",
|
|
45
|
+
typeName: 'RAGRuntimeServices',
|
|
46
|
+
},
|
|
42
47
|
init: async (context) => {
|
|
43
|
-
//
|
|
48
|
+
// First pass: Scan for searchable() wrapped fields and inject embedding fields
|
|
49
|
+
for (const [listName, listConfig] of Object.entries(context.config.lists)) {
|
|
50
|
+
const embeddingFieldsToInject = {};
|
|
51
|
+
for (const [fieldName, fieldConfig] of Object.entries(listConfig.fields)) {
|
|
52
|
+
// Check if field has _searchable metadata
|
|
53
|
+
if ('_searchable' in fieldConfig) {
|
|
54
|
+
const meta = fieldConfig._searchable;
|
|
55
|
+
// Determine embedding field name
|
|
56
|
+
const embeddingName = meta.embeddingFieldName || `${fieldName}Embedding`;
|
|
57
|
+
// Create embedding field
|
|
58
|
+
embeddingFieldsToInject[embeddingName] = embedding({
|
|
59
|
+
sourceField: fieldName,
|
|
60
|
+
provider: meta.provider,
|
|
61
|
+
dimensions: meta.dimensions,
|
|
62
|
+
chunking: meta.chunking,
|
|
63
|
+
autoGenerate: true,
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
// Inject all embedding fields at once
|
|
68
|
+
if (Object.keys(embeddingFieldsToInject).length > 0) {
|
|
69
|
+
context.extendList(listName, {
|
|
70
|
+
fields: embeddingFieldsToInject,
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
// Second pass: Find all embedding fields with autoGenerate enabled
|
|
75
|
+
// This includes both manually defined embedding fields AND injected ones from searchable()
|
|
44
76
|
for (const [listName, listConfig] of Object.entries(context.config.lists)) {
|
|
45
77
|
for (const [fieldName, fieldConfig] of Object.entries(listConfig.fields)) {
|
|
46
78
|
if (fieldConfig.type === 'embedding' &&
|
|
@@ -176,6 +208,34 @@ export function ragPlugin(config) {
|
|
|
176
208
|
// Access at runtime via: config._pluginData.rag
|
|
177
209
|
context.setPluginData('rag', normalized);
|
|
178
210
|
},
|
|
211
|
+
runtime: () => {
|
|
212
|
+
// Provide RAG-related utilities at runtime
|
|
213
|
+
return {
|
|
214
|
+
/**
|
|
215
|
+
* Generate embedding for a given text
|
|
216
|
+
* Uses the configured embedding provider
|
|
217
|
+
*/
|
|
218
|
+
generateEmbedding: async (text) => {
|
|
219
|
+
const ragConfig = normalized;
|
|
220
|
+
if (!ragConfig || !ragConfig.provider) {
|
|
221
|
+
throw new Error('RAG plugin not configured');
|
|
222
|
+
}
|
|
223
|
+
const provider = createEmbeddingProvider(ragConfig.provider);
|
|
224
|
+
return await provider.embed(text);
|
|
225
|
+
},
|
|
226
|
+
/**
|
|
227
|
+
* Generate embeddings for multiple texts (batch)
|
|
228
|
+
*/
|
|
229
|
+
generateEmbeddings: async (texts) => {
|
|
230
|
+
const ragConfig = normalized;
|
|
231
|
+
if (!ragConfig || !ragConfig.provider) {
|
|
232
|
+
throw new Error('RAG plugin not configured');
|
|
233
|
+
}
|
|
234
|
+
const provider = createEmbeddingProvider(ragConfig.provider);
|
|
235
|
+
return await provider.embedBatch(texts);
|
|
236
|
+
},
|
|
237
|
+
};
|
|
238
|
+
},
|
|
179
239
|
};
|
|
180
240
|
}
|
|
181
241
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/config/plugin.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAC/C,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAA;
|
|
1
|
+
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/config/plugin.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAC/C,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAA;AAC/D,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAA;AAElD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,MAAM,UAAU,SAAS,CAAC,MAAiB;IACzC,MAAM,UAAU,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAA;IAE7C,OAAO;QACL,IAAI,EAAE,KAAK;QACX,OAAO,EAAE,OAAO;QAEhB,mBAAmB,EAAE;YACnB,MAAM,EAAE,+DAA+D;YACvE,QAAQ,EAAE,oBAAoB;SAC/B;QAED,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;YACtB,+EAA+E;YAC/E,KAAK,MAAM,CAAC,QAAQ,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC1E,MAAM,uBAAuB,GAAiD,EAAE,CAAA;gBAEhF,KAAK,MAAM,CAAC,SAAS,EAAE,WAAW,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;oBACzE,0CAA0C;oBAC1C,IAAI,aAAa,IAAI,WAAW,EAAE,CAAC;wBACjC,MAAM,IAAI,GAAG,WAAW,CAAC,WAAiC,CAAA;wBAE1D,iCAAiC;wBACjC,MAAM,aAAa,GAAG,IAAI,CAAC,kBAAkB,IAAI,GAAG,SAAS,WAAW,CAAA;wBAExE,yBAAyB;wBACzB,uBAAuB,CAAC,aAAa,CAAC,GAAG,SAAS,CAAC;4BACjD,WAAW,EAAE,SAAS;4BACtB,QAAQ,EAAE,IAAI,CAAC,QAAQ;4BACvB,UAAU,EAAE,IAAI,CAAC,UAAU;4BAC3B,QAAQ,EAAE,IAAI,CAAC,QAAQ;4BACvB,YAAY,EAAE,IAAI;yBACnB,CAAC,CAAA;oBACJ,CAAC;gBACH,CAAC;gBAED,sCAAsC;gBACtC,IAAI,MAAM,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACpD,OAAO,CAAC,UAAU,CAAC,QAAQ,EAAE;wBAC3B,MAAM,EAAE,uBAAuB;qBAChC,CAAC,CAAA;gBACJ,CAAC;YACH,CAAC;YAED,mEAAmE;YACnE,2FAA2F;YAC3F,KAAK,MAAM,CAAC,QAAQ,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC1E,KAAK,MAAM,CAAC,SAAS,EAAE,WAAW,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;oBACzE,IACE,WAAW,CAAC,IAAI,KAAK,WAAW;wBAC/B,WAA0C,CAAC,YAAY,EACxD,CAAC;wBACD,MAAM,eAAe,GAAG,WAIvB,CAAA;wBAED,MAAM,WAAW,GAAG,eAAe,CAAC,WAAW,CAAA;wBAC/C,IAAI,CAAC,WAAW,EAAE,CAAC;4BACjB,MAAM,IAAI,KAAK,CACb,sBAAsB,QAAQ,IAAI,SAAS,yDAAyD,CACrG,CAAA;wBACH,CAAC;wBAED,yDAAyD;wBACzD,OAAO,CAAC,UAAU,CAAC,QAAQ,EAAE;4BAC3B,KAAK,EAAE;gCACL,YAAY,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;oCAC3B,0BAA0B;oCAC1B,IAAI,CAAC,IAAI,CAAC,YAAY;wCACpB,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAA;oCAE1E,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,WAAW,CAAuB,CAAA;oCACvE,MAAM,gBAAgB,GAAG,IAAI,CAAC,YAAY,CAAC,SAAS,CAG5C,CAAA;oCAER,+BAA+B;oCAC/B,IAAI,CAAC,UAAU;wCAAE,OAAO,IAAI,CAAC,YAAY,CAAA;oCAEzC,uDAAuD;oCACvD,MAAM,UAAU,GAAG,MAAM,QAAQ,CAAC,UAAU,CAAC,CAAA;oCAC7C,IAAI,gBAAgB,IAAI,gBAAgB,CAAC,QAAQ,CAAC,UAAU,KAAK,UAAU,EAAE,CAAC;wCAC5E,gDAAgD;wCAChD,OAAO,IAAI,CAAC,YAAY,CAAA;oCAC1B,CAAC;oCAED,8BAA8B;oCAC9B,MAAM,YAAY,GAAG,eAAe,CAAC,QAAQ,IAAI,SAAS,CAAA;oCAC1D,MAAM,cAAc,GAClB,YAAY,KAAK,SAAS;wCACxB,CAAC,CAAC,UAAU,CAAC,QAAQ;wCACrB,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,YAAY,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAA;oCAE/D,IAAI,CAAC,cAAc,EAAE,CAAC;wCACpB,OAAO,CAAC,IAAI,CACV,iDAAiD,QAAQ,IAAI,SAAS,GAAG,CAC1E,CAAA;wCACD,OAAO,IAAI,CAAC,YAAY,CAAA;oCAC1B,CAAC;oCAED,qBAAqB;oCACrB,MAAM,QAAQ,GAAG,uBAAuB,CAAC,cAAc,CAAC,CAAA;oCACxD,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC,CAAA;oCAE/C,OAAO;wCACL,GAAG,IAAI,CAAC,YAAY;wCACpB,CAAC,SAAS,CAAC,EAAE;4CACX,MAAM;4CACN,QAAQ,EAAE;gDACR,KAAK,EAAE,QAAQ,CAAC,KAAK;gDACrB,QAAQ,EAAE,QAAQ,CAAC,IAAI;gDACvB,UAAU,EAAE,QAAQ,CAAC,UAAU;gDAC/B,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gDACrC,UAAU;6CACX;yCACF;qCACF,CAAA;gCACH,CAAC;6BACF;yBACF,CAAC,CAAA;oBACJ,CAAC;gBACH,CAAC;YACH,CAAC;YAED,gCAAgC;YAChC,IAAI,UAAU,CAAC,cAAc,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;gBACzD,uCAAuC;gBACvC,KAAK,MAAM,CAAC,QAAQ,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;oBAC1E,MAAM,eAAe,GAAG,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,MAAM,CAC9D,CAAC,CAAC,EAAE,WAAW,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,KAAK,WAAW,CACtD,CAAA;oBAED,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBAC/B,8CAA8C;wBAC9C,MAAM,QAAQ,GAAG,mBAAmB,QAAQ,CAAC,WAAW,EAAE,EAAE,CAAA;wBAE5D,OAAO,CAAC,eAAe,CAAC;4BACtB,IAAI,EAAE,QAAQ;4BACd,WAAW,EAAE,UAAU,QAAQ,2CAA2C;4BAC1E,WAAW,EAAE;gCACX,IAAI,EAAE,QAAQ;gCACd,UAAU,EAAE;oCACV,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,+BAA+B,EAAE;oCACvE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,iBAAiB,EAAE,OAAO,EAAE,EAAE,EAAE;oCACtE,QAAQ,EAAE;wCACR,IAAI,EAAE,QAAQ;wCACd,WAAW,EAAE,gCAAgC;wCAC7C,OAAO,EAAE,GAAG;qCACb;oCACD,KAAK,EAAE;wCACL,IAAI,EAAE,QAAQ;wCACd,WAAW,EAAE,2BAA2B;wCACxC,OAAO,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;wCAC9B,IAAI,EAAE,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC;qCAC5C;iCACF;gCACD,QAAQ,EAAE,CAAC,OAAO,CAAC;6BACpB;4BACD,OAAO,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE;gCACpC,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,EAAE,EAAE,QAAQ,GAAG,GAAG,EAAE,KAAK,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,CAAA;gCAElF,eAAe;gCACf,MAAM,cAAc,GAAG,UAAU,CAAC,QAAQ,CAAA;gCAC1C,IAAI,CAAC,cAAc,EAAE,CAAC;oCACpB,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAA;gCAC/D,CAAC;gCAED,2BAA2B;gCAC3B,MAAM,QAAQ,GAAG,uBAAuB,CAAC,cAAc,CAAC,CAAA;gCACxD,MAAM,WAAW,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;gCAE/C,0CAA0C;gCAC1C,4CAA4C;gCAC5C,wDAAwD;gCACxD,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;gCAClE,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAA;gCAEnD,4CAA4C;gCAC5C,MAAM,OAAO,GAAG,QAAQ;qCACrB,GAAG,CAAC,CAAC,IAAoD,EAAE,EAAE;oCAC5D,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,CAAA;oCAC7B,IAAI,CAAC,SAAS,IAAI,CAAC,SAAS,CAAC,MAAM;wCAAE,OAAO,IAAI,CAAA;oCAEhD,MAAM,KAAK,GAAG,gBAAgB,CAAC,WAAW,EAAE,SAAS,CAAC,MAAM,CAAC,CAAA;oCAC7D,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAA;gCACxB,CAAC,CAAC;qCACD,MAAM,CAAC,CAAC,CAA2B,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,KAAK,IAAI,QAAQ,CAAC;qCAC1E,IAAI,CAAC,CAAC,CAAoB,EAAE,CAAoB,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;qCACvE,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAA;gCAElB,OAAO;oCACL,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAmC,EAAE,EAAE;wCAC3D,4CAA4C;wCAC5C,MAAM,IAAI,GAAG,CAAC,CAAC,IAA+B,CAAA;wCAC9C,OAAO;4CACL,GAAG,IAAI;4CACP,WAAW,EAAE,CAAC,CAAC,KAAK;yCACrB,CAAA;oCACH,CAAC,CAAC;oCACF,KAAK,EAAE,OAAO,CAAC,MAAM;iCACtB,CAAA;4BACH,CAAC;yBACF,CAAC,CAAA;oBACJ,CAAC;gBACH,CAAC;YACH,CAAC;YAED,sCAAsC;YACtC,gDAAgD;YAChD,OAAO,CAAC,aAAa,CAAsB,KAAK,EAAE,UAAU,CAAC,CAAA;QAC/D,CAAC;QAED,OAAO,EAAE,GAAG,EAAE;YACZ,2CAA2C;YAC3C,OAAO;gBACL;;;mBAGG;gBACH,iBAAiB,EAAE,KAAK,EAAE,IAAY,EAAE,EAAE;oBACxC,MAAM,SAAS,GAAG,UAAU,CAAA;oBAC5B,IAAI,CAAC,SAAS,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC;wBACtC,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAA;oBAC9C,CAAC;oBAED,MAAM,QAAQ,GAAG,uBAAuB,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAA;oBAC5D,OAAO,MAAM,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;gBACnC,CAAC;gBAED;;mBAEG;gBACH,kBAAkB,EAAE,KAAK,EAAE,KAAe,EAAE,EAAE;oBAC5C,MAAM,SAAS,GAAG,UAAU,CAAA;oBAC5B,IAAI,CAAC,SAAS,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC;wBACtC,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAA;oBAC9C,CAAC;oBAED,MAAM,QAAQ,GAAG,uBAAuB,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAA;oBAC5D,OAAO,MAAM,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,CAAA;gBACzC,CAAC;aACF,CAAA;QACH,CAAC;KACF,CAAA;AACH,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,QAAQ,CAAC,IAAY;IAClC,6BAA6B;IAC7B,uEAAuE;IACvE,IAAI,IAAI,GAAG,CAAC,CAAA;IACZ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAA;QAC/B,IAAI,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,IAAI,GAAG,IAAI,CAAA;QAChC,IAAI,GAAG,IAAI,GAAG,IAAI,CAAA,CAAC,4BAA4B;IACjD,CAAC;IACD,OAAO,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;AAC1B,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB,CAAC,CAAW,EAAE,CAAW;IAChD,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAA;IACtD,CAAC;IAED,IAAI,UAAU,GAAG,CAAC,CAAA;IAClB,IAAI,KAAK,GAAG,CAAC,CAAA;IACb,IAAI,KAAK,GAAG,CAAC,CAAA;IAEb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAClC,UAAU,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;QACzB,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;QACpB,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;IACtB,CAAC;IAED,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACvD,IAAI,WAAW,KAAK,CAAC;QAAE,OAAO,CAAC,CAAA;IAE/B,OAAO,UAAU,GAAG,WAAW,CAAA;AACjC,CAAC"}
|
|
@@ -64,7 +64,11 @@ describe('RAG Plugin', () => {
|
|
|
64
64
|
const plugin = ragPlugin(config);
|
|
65
65
|
const mockContext = {
|
|
66
66
|
config: {
|
|
67
|
-
db: {
|
|
67
|
+
db: {
|
|
68
|
+
provider: 'sqlite',
|
|
69
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
70
|
+
prismaClientConstructor: (() => null),
|
|
71
|
+
},
|
|
68
72
|
lists: {
|
|
69
73
|
Article: {
|
|
70
74
|
fields: {
|
|
@@ -100,7 +104,11 @@ describe('RAG Plugin', () => {
|
|
|
100
104
|
const plugin = ragPlugin(config);
|
|
101
105
|
const mockContext = {
|
|
102
106
|
config: {
|
|
103
|
-
db: {
|
|
107
|
+
db: {
|
|
108
|
+
provider: 'sqlite',
|
|
109
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
110
|
+
prismaClientConstructor: (() => null),
|
|
111
|
+
},
|
|
104
112
|
lists: {
|
|
105
113
|
Article: {
|
|
106
114
|
fields: {
|
|
@@ -130,7 +138,11 @@ describe('RAG Plugin', () => {
|
|
|
130
138
|
const plugin = ragPlugin(config);
|
|
131
139
|
const mockContext = {
|
|
132
140
|
config: {
|
|
133
|
-
db: {
|
|
141
|
+
db: {
|
|
142
|
+
provider: 'sqlite',
|
|
143
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
144
|
+
prismaClientConstructor: (() => null),
|
|
145
|
+
},
|
|
134
146
|
lists: {
|
|
135
147
|
Article: {
|
|
136
148
|
fields: {
|
|
@@ -164,7 +176,11 @@ describe('RAG Plugin', () => {
|
|
|
164
176
|
const plugin = ragPlugin(config);
|
|
165
177
|
const mockContext = {
|
|
166
178
|
config: {
|
|
167
|
-
db: {
|
|
179
|
+
db: {
|
|
180
|
+
provider: 'sqlite',
|
|
181
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
182
|
+
prismaClientConstructor: (() => null),
|
|
183
|
+
},
|
|
168
184
|
lists: {},
|
|
169
185
|
},
|
|
170
186
|
setPluginData: vi.fn(),
|
|
@@ -190,7 +206,11 @@ describe('RAG Plugin', () => {
|
|
|
190
206
|
const plugin = ragPlugin(config);
|
|
191
207
|
const mockContext = {
|
|
192
208
|
config: {
|
|
193
|
-
db: {
|
|
209
|
+
db: {
|
|
210
|
+
provider: 'sqlite',
|
|
211
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
212
|
+
prismaClientConstructor: (() => null),
|
|
213
|
+
},
|
|
194
214
|
lists: {
|
|
195
215
|
Article: {
|
|
196
216
|
fields: {
|
|
@@ -226,7 +246,11 @@ describe('RAG Plugin', () => {
|
|
|
226
246
|
const plugin = ragPlugin(config);
|
|
227
247
|
const mockContext = {
|
|
228
248
|
config: {
|
|
229
|
-
db: {
|
|
249
|
+
db: {
|
|
250
|
+
provider: 'sqlite',
|
|
251
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
252
|
+
prismaClientConstructor: (() => null),
|
|
253
|
+
},
|
|
230
254
|
lists: {
|
|
231
255
|
Article: {
|
|
232
256
|
fields: {
|
|
@@ -270,7 +294,11 @@ describe('RAG Plugin', () => {
|
|
|
270
294
|
const plugin = ragPlugin(config);
|
|
271
295
|
const mockContext = {
|
|
272
296
|
config: {
|
|
273
|
-
db: {
|
|
297
|
+
db: {
|
|
298
|
+
provider: 'sqlite',
|
|
299
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
300
|
+
prismaClientConstructor: (() => null),
|
|
301
|
+
},
|
|
274
302
|
lists: {
|
|
275
303
|
Article: {
|
|
276
304
|
fields: {
|
|
@@ -305,7 +333,11 @@ describe('RAG Plugin', () => {
|
|
|
305
333
|
const plugin = ragPlugin(config);
|
|
306
334
|
const mockContext = {
|
|
307
335
|
config: {
|
|
308
|
-
db: {
|
|
336
|
+
db: {
|
|
337
|
+
provider: 'sqlite',
|
|
338
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
339
|
+
prismaClientConstructor: (() => null),
|
|
340
|
+
},
|
|
309
341
|
lists: {
|
|
310
342
|
Article: {
|
|
311
343
|
fields: {
|
|
@@ -335,7 +367,11 @@ describe('RAG Plugin', () => {
|
|
|
335
367
|
const plugin = ragPlugin(config);
|
|
336
368
|
const mockContext = {
|
|
337
369
|
config: {
|
|
338
|
-
db: {
|
|
370
|
+
db: {
|
|
371
|
+
provider: 'sqlite',
|
|
372
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
373
|
+
prismaClientConstructor: (() => null),
|
|
374
|
+
},
|
|
339
375
|
lists: {
|
|
340
376
|
User: {
|
|
341
377
|
fields: {
|
|
@@ -364,7 +400,11 @@ describe('RAG Plugin', () => {
|
|
|
364
400
|
const plugin = ragPlugin(config);
|
|
365
401
|
const mockContext = {
|
|
366
402
|
config: {
|
|
367
|
-
db: {
|
|
403
|
+
db: {
|
|
404
|
+
provider: 'sqlite',
|
|
405
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
406
|
+
prismaClientConstructor: (() => null),
|
|
407
|
+
},
|
|
368
408
|
lists: {
|
|
369
409
|
BlogPost: {
|
|
370
410
|
fields: {
|
|
@@ -402,7 +442,11 @@ describe('RAG Plugin', () => {
|
|
|
402
442
|
const plugin = ragPlugin(config);
|
|
403
443
|
const mockContext = {
|
|
404
444
|
config: {
|
|
405
|
-
db: {
|
|
445
|
+
db: {
|
|
446
|
+
provider: 'sqlite',
|
|
447
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
448
|
+
prismaClientConstructor: (() => null),
|
|
449
|
+
},
|
|
406
450
|
lists: {
|
|
407
451
|
Article: {
|
|
408
452
|
fields: {
|
|
@@ -444,7 +488,11 @@ describe('RAG Plugin', () => {
|
|
|
444
488
|
const plugin = ragPlugin(config);
|
|
445
489
|
const mockContext = {
|
|
446
490
|
config: {
|
|
447
|
-
db: {
|
|
491
|
+
db: {
|
|
492
|
+
provider: 'sqlite',
|
|
493
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
494
|
+
prismaClientConstructor: (() => null),
|
|
495
|
+
},
|
|
448
496
|
lists: {
|
|
449
497
|
Article: {
|
|
450
498
|
fields: {
|
|
@@ -476,7 +524,11 @@ describe('RAG Plugin', () => {
|
|
|
476
524
|
const plugin = ragPlugin(config);
|
|
477
525
|
const mockContext = {
|
|
478
526
|
config: {
|
|
479
|
-
db: {
|
|
527
|
+
db: {
|
|
528
|
+
provider: 'sqlite',
|
|
529
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
530
|
+
prismaClientConstructor: (() => null),
|
|
531
|
+
},
|
|
480
532
|
lists: {
|
|
481
533
|
Article: {
|
|
482
534
|
fields: {
|
|
@@ -510,7 +562,11 @@ describe('RAG Plugin', () => {
|
|
|
510
562
|
const plugin = ragPlugin(config);
|
|
511
563
|
const mockContext = {
|
|
512
564
|
config: {
|
|
513
|
-
db: {
|
|
565
|
+
db: {
|
|
566
|
+
provider: 'sqlite',
|
|
567
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
568
|
+
prismaClientConstructor: (() => null),
|
|
569
|
+
},
|
|
514
570
|
lists: {},
|
|
515
571
|
},
|
|
516
572
|
setPluginData: vi.fn(),
|