@msbayindir/context-rag 1.0.0-beta.1 → 1.0.0-beta.3

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/README.md CHANGED
@@ -35,6 +35,21 @@ yarn add context-rag
35
35
 
36
36
  ---
37
37
 
38
+ ## 🖥️ CLI Commands
39
+
40
+ ```bash
41
+ # Initialize Context-RAG in your project (adds Prisma models to your schema)
42
+ npx @msbayindir/context-rag init
43
+
44
+ # Force overwrite existing models
45
+ npx @msbayindir/context-rag init --force
46
+
47
+ # Check setup status (Prisma models, pgvector, env variables)
48
+ npx @msbayindir/context-rag status
49
+ ```
50
+
51
+ ---
52
+
38
53
  ## 🛠️ Prerequisites
39
54
 
40
55
  ### 1. PostgreSQL with pgvector Extension
package/dist/bin/cli.cjs CHANGED
@@ -27,7 +27,7 @@ var fs__namespace = /*#__PURE__*/_interopNamespace(fs);
27
27
  var path__namespace = /*#__PURE__*/_interopNamespace(path);
28
28
 
29
29
  var program = new commander.Command();
30
- program.name("context-rag").description("Context-RAG CLI - Setup and management tools").version("0.1.0");
30
+ program.name("context-rag").description("Context-RAG CLI - Setup and management tools").version("1.0.0-beta.1");
31
31
  program.command("init").description("Initialize Context-RAG in your project").option("-f, --force", "Overwrite existing files").action(async (options) => {
32
32
  console.log("\u{1F680} Initializing Context-RAG...\n");
33
33
  try {
@@ -69,19 +69,20 @@ program.command("init").description("Initialize Context-RAG in your project").op
69
69
  // Context-RAG Models
70
70
  // ============================================
71
71
 
72
+ /// Stores prompt configurations for different document types
72
73
  model ContextRagPromptConfig {
73
74
  id String @id @default(uuid())
74
- documentType String
75
+ documentType String @map("document_type")
75
76
  name String
76
- systemPrompt String @db.Text
77
- chunkStrategy Json
77
+ systemPrompt String @map("system_prompt") @db.Text
78
+ chunkStrategy Json @map("chunk_strategy")
78
79
  version Int @default(1)
79
- isActive Boolean @default(true)
80
- isDefault Boolean @default(false)
81
- createdBy String?
82
- changeLog String?
83
- createdAt DateTime @default(now())
84
- updatedAt DateTime @updatedAt
80
+ isActive Boolean @default(true) @map("is_active")
81
+ isDefault Boolean @default(false) @map("is_default")
82
+ createdBy String? @map("created_by")
83
+ changeLog String? @map("change_log")
84
+ createdAt DateTime @default(now()) @map("created_at")
85
+ updatedAt DateTime @updatedAt @map("updated_at")
85
86
 
86
87
  chunks ContextRagChunk[]
87
88
 
@@ -90,80 +91,110 @@ model ContextRagPromptConfig {
90
91
  @@map("context_rag_prompt_configs")
91
92
  }
92
93
 
94
+ /// Stores vector chunks for semantic search
93
95
  model ContextRagChunk {
94
96
  id String @id @default(uuid())
95
- promptConfigId String
97
+ promptConfigId String @map("prompt_config_id")
96
98
  promptConfig ContextRagPromptConfig @relation(fields: [promptConfigId], references: [id], onDelete: Cascade)
97
- documentId String
98
- chunkIndex Int
99
- chunkType String
99
+ documentId String @map("document_id")
100
+ chunkIndex Int @map("chunk_index")
101
+ chunkType String @map("chunk_type")
100
102
 
101
- searchContent String @db.Text
102
- searchVector Unsupported("vector(768)")
103
- displayContent String @db.Text
103
+ /// Plain text content optimized for vector search
104
+ searchContent String @map("search_content") @db.Text
104
105
 
105
- sourcePageStart Int
106
- sourcePageEnd Int
107
- confidenceScore Float @default(0.5)
106
+ /// Enriched content: context + searchContent (for RAG enhancement)
107
+ enrichedContent String? @map("enriched_content") @db.Text
108
+
109
+ /// AI-generated context text only (for debugging)
110
+ contextText String? @map("context_text") @db.Text
111
+
112
+ /// Vector embedding (768 dimensions for Gemini)
113
+ searchVector Unsupported("vector(768)") @map("search_vector")
114
+
115
+ /// Rich Markdown content for display
116
+ displayContent String @map("display_content") @db.Text
117
+
118
+ sourcePageStart Int @map("source_page_start")
119
+ sourcePageEnd Int @map("source_page_end")
120
+ confidenceScore Float @default(0.5) @map("confidence_score")
108
121
  metadata Json
109
122
 
110
- createdAt DateTime @default(now())
123
+ createdAt DateTime @default(now()) @map("created_at")
111
124
 
112
125
  @@index([promptConfigId])
113
126
  @@index([documentId])
114
127
  @@index([chunkType])
128
+ @@index([confidenceScore])
115
129
  @@map("context_rag_chunks")
116
130
  }
117
131
 
132
+ /// Tracks document processing state
118
133
  model ContextRagDocument {
119
134
  id String @id @default(uuid())
120
135
  filename String
121
- fileHash String @unique
122
- fileSize Int
123
- pageCount Int
124
- documentType String?
136
+ fileHash String @map("file_hash")
137
+ fileSize Int @map("file_size")
138
+ pageCount Int @map("page_count")
139
+ documentType String? @map("document_type")
140
+
141
+ /// Experiment identifier for A/B testing models
142
+ experimentId String? @map("experiment_id")
143
+
144
+ /// AI model used for processing
145
+ modelName String? @map("model_name")
146
+
147
+ /// Model configuration as JSON
148
+ modelConfig Json? @map("model_config")
149
+
125
150
  status String @default("PENDING")
126
151
 
127
- promptConfigId String?
128
- totalBatches Int @default(0)
129
- completedBatches Int @default(0)
130
- failedBatches Int @default(0)
152
+ promptConfigId String? @map("prompt_config_id")
153
+ totalBatches Int @default(0) @map("total_batches")
154
+ completedBatches Int @default(0) @map("completed_batches")
155
+ failedBatches Int @default(0) @map("failed_batches")
131
156
 
132
- tokenUsage Json?
133
- processingMs Int?
134
- errorMessage String?
157
+ tokenUsage Json? @map("token_usage")
158
+ processingMs Int? @map("processing_ms")
159
+ errorMessage String? @map("error_message")
135
160
 
136
- createdAt DateTime @default(now())
137
- completedAt DateTime?
161
+ createdAt DateTime @default(now()) @map("created_at")
162
+ completedAt DateTime? @map("completed_at")
138
163
 
139
164
  batches ContextRagBatch[]
140
165
 
166
+ @@unique([fileHash, experimentId])
141
167
  @@index([status])
142
168
  @@index([fileHash])
169
+ @@index([documentType])
170
+ @@index([experimentId])
143
171
  @@map("context_rag_documents")
144
172
  }
145
173
 
174
+ /// Tracks individual batch processing jobs
146
175
  model ContextRagBatch {
147
176
  id String @id @default(uuid())
148
- documentId String
177
+ documentId String @map("document_id")
149
178
  document ContextRagDocument @relation(fields: [documentId], references: [id], onDelete: Cascade)
150
179
 
151
- batchIndex Int
152
- pageStart Int
153
- pageEnd Int
180
+ batchIndex Int @map("batch_index")
181
+ pageStart Int @map("page_start")
182
+ pageEnd Int @map("page_end")
154
183
  status String @default("PENDING")
155
- retryCount Int @default(0)
156
- lastError String?
184
+ retryCount Int @default(0) @map("retry_count")
185
+ lastError String? @map("last_error")
157
186
 
158
- tokenUsage Json?
159
- processingMs Int?
187
+ tokenUsage Json? @map("token_usage")
188
+ processingMs Int? @map("processing_ms")
160
189
 
161
- startedAt DateTime?
162
- completedAt DateTime?
163
- createdAt DateTime @default(now())
164
- updatedAt DateTime @updatedAt
190
+ startedAt DateTime? @map("started_at")
191
+ completedAt DateTime? @map("completed_at")
192
+ createdAt DateTime @default(now()) @map("created_at")
193
+ updatedAt DateTime @updatedAt @map("updated_at")
165
194
 
195
+ @@unique([documentId, batchIndex])
166
196
  @@index([documentId, status])
197
+ @@index([status])
167
198
  @@map("context_rag_batches")
168
199
  }
169
200
  `;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/bin/cli.ts"],"names":["Command","path","fs"],"mappings":"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","file":"cli.cjs","sourcesContent":["#!/usr/bin/env node\r\n\r\nimport { Command } from 'commander';\r\nimport * as fs from 'fs/promises';\r\nimport * as path from 'path';\r\n\r\nconst program = new Command();\r\n\r\nprogram\r\n .name('context-rag')\r\n .description('Context-RAG CLI - Setup and management tools')\r\n .version('0.1.0');\r\n\r\nprogram\r\n .command('init')\r\n .description('Initialize Context-RAG in your project')\r\n .option('-f, --force', 'Overwrite existing files')\r\n .action(async (options) => {\r\n console.log('🚀 Initializing Context-RAG...\\n');\r\n\r\n try {\r\n // Check if prisma directory exists\r\n const prismaDir = path.join(process.cwd(), 'prisma');\r\n const schemaPath = path.join(prismaDir, 'schema.prisma');\r\n\r\n let schemaExists = false;\r\n try {\r\n await fs.access(schemaPath);\r\n schemaExists = true;\r\n } catch {\r\n schemaExists = false;\r\n }\r\n\r\n if (!schemaExists) {\r\n console.log('❌ Prisma schema not found at prisma/schema.prisma');\r\n console.log(' Please run `npx prisma init` first.\\n');\r\n process.exit(1);\r\n }\r\n\r\n // Read existing schema\r\n const existingSchema = await fs.readFile(schemaPath, 'utf-8');\r\n\r\n // Check if Context-RAG models already exist\r\n if (existingSchema.includes('ContextRagChunk') && !options.force) {\r\n console.log('⚠️ Context-RAG models already exist in schema.');\r\n console.log(' Use --force to overwrite.\\n');\r\n process.exit(0);\r\n }\r\n\r\n // Check for pgvector extension\r\n if (!existingSchema.includes('postgresqlExtensions')) {\r\n console.log('⚠️ Warning: pgvector extension not enabled.');\r\n console.log(' Add the following to your schema.prisma:\\n');\r\n console.log(' generator client {');\r\n console.log(' provider = \"prisma-client-js\"');\r\n console.log(' previewFeatures = [\"postgresqlExtensions\"]');\r\n console.log(' }\\n');\r\n console.log(' datasource db {');\r\n console.log(' provider = \"postgresql\"');\r\n console.log(' url = env(\"DATABASE_URL\")');\r\n console.log(' extensions = [vector]');\r\n console.log(' }\\n');\r\n }\r\n\r\n // Context-RAG models to append\r\n const contextRagModels = `\r\n// ============================================\r\n// Context-RAG Models\r\n// ============================================\r\n\r\nmodel ContextRagPromptConfig {\r\n id String @id @default(uuid())\r\n documentType String\r\n name String\r\n systemPrompt String @db.Text\r\n chunkStrategy Json\r\n version Int @default(1)\r\n isActive Boolean @default(true)\r\n isDefault Boolean @default(false)\r\n createdBy String?\r\n changeLog String?\r\n createdAt DateTime @default(now())\r\n updatedAt DateTime @updatedAt\r\n\r\n chunks ContextRagChunk[]\r\n\r\n @@unique([documentType, version])\r\n @@index([documentType, isActive])\r\n @@map(\"context_rag_prompt_configs\")\r\n}\r\n\r\nmodel ContextRagChunk {\r\n id String @id @default(uuid())\r\n promptConfigId String\r\n promptConfig ContextRagPromptConfig @relation(fields: [promptConfigId], references: [id], onDelete: Cascade)\r\n documentId String\r\n chunkIndex Int\r\n chunkType String\r\n\r\n searchContent String @db.Text\r\n searchVector Unsupported(\"vector(768)\")\r\n displayContent String @db.Text\r\n\r\n sourcePageStart Int\r\n sourcePageEnd Int\r\n confidenceScore Float @default(0.5)\r\n metadata Json\r\n\r\n createdAt DateTime @default(now())\r\n\r\n @@index([promptConfigId])\r\n @@index([documentId])\r\n @@index([chunkType])\r\n @@map(\"context_rag_chunks\")\r\n}\r\n\r\nmodel ContextRagDocument {\r\n id String @id @default(uuid())\r\n filename String\r\n fileHash String @unique\r\n fileSize Int\r\n pageCount Int\r\n documentType String?\r\n status String @default(\"PENDING\")\r\n\r\n promptConfigId String?\r\n totalBatches Int @default(0)\r\n completedBatches Int @default(0)\r\n failedBatches Int @default(0)\r\n\r\n tokenUsage Json?\r\n processingMs Int?\r\n errorMessage String?\r\n\r\n createdAt DateTime @default(now())\r\n completedAt DateTime?\r\n\r\n batches ContextRagBatch[]\r\n\r\n @@index([status])\r\n @@index([fileHash])\r\n @@map(\"context_rag_documents\")\r\n}\r\n\r\nmodel ContextRagBatch {\r\n id String @id @default(uuid())\r\n documentId String\r\n document ContextRagDocument @relation(fields: [documentId], references: [id], onDelete: Cascade)\r\n\r\n batchIndex Int\r\n pageStart Int\r\n pageEnd Int\r\n status String @default(\"PENDING\")\r\n retryCount Int @default(0)\r\n lastError String?\r\n\r\n tokenUsage Json?\r\n processingMs Int?\r\n\r\n startedAt DateTime?\r\n completedAt DateTime?\r\n createdAt DateTime @default(now())\r\n updatedAt DateTime @updatedAt\r\n\r\n @@index([documentId, status])\r\n @@map(\"context_rag_batches\")\r\n}\r\n`;\r\n\r\n // Remove existing Context-RAG models if force\r\n let newSchema = existingSchema;\r\n if (options.force && existingSchema.includes('// Context-RAG Models')) {\r\n const startMarker = '// ============================================\\n// Context-RAG Models';\r\n const startIndex = newSchema.indexOf(startMarker);\r\n if (startIndex !== -1) {\r\n newSchema = newSchema.substring(0, startIndex).trim();\r\n }\r\n }\r\n\r\n // Append new models\r\n newSchema = newSchema.trim() + '\\n' + contextRagModels;\r\n\r\n // Write updated schema\r\n await fs.writeFile(schemaPath, newSchema);\r\n\r\n console.log('✅ Context-RAG models added to prisma/schema.prisma\\n');\r\n console.log('Next steps:');\r\n console.log(' 1. Run: npx prisma migrate dev --name add_context_rag');\r\n console.log(' 2. Enable pgvector in PostgreSQL: CREATE EXTENSION IF NOT EXISTS vector;');\r\n console.log(' 3. Start using Context-RAG!\\n');\r\n\r\n } catch (error) {\r\n console.error('❌ Error:', (error as Error).message);\r\n process.exit(1);\r\n }\r\n });\r\n\r\nprogram\r\n .command('status')\r\n .description('Check Context-RAG setup status')\r\n .action(async () => {\r\n console.log('🔍 Checking Context-RAG status...\\n');\r\n\r\n // Check schema\r\n const schemaPath = path.join(process.cwd(), 'prisma', 'schema.prisma');\r\n try {\r\n const schema = await fs.readFile(schemaPath, 'utf-8');\r\n\r\n console.log('Prisma Schema:');\r\n console.log(` ✅ schema.prisma found`);\r\n console.log(` ${schema.includes('ContextRagChunk') ? '✅' : '❌'} Context-RAG models`);\r\n console.log(` ${schema.includes('postgresqlExtensions') ? '✅' : '❌'} pgvector extension`);\r\n console.log();\r\n } catch {\r\n console.log('❌ prisma/schema.prisma not found\\n');\r\n }\r\n\r\n // Check env\r\n console.log('Environment:');\r\n console.log(` ${process.env['DATABASE_URL'] ? '✅' : '❌'} DATABASE_URL`);\r\n console.log(` ${process.env['GEMINI_API_KEY'] ? '✅' : '❌'} GEMINI_API_KEY`);\r\n console.log();\r\n });\r\n\r\nprogram.parse();\r\n"]}
1
+ {"version":3,"sources":["../../src/bin/cli.ts"],"names":["Command","path","fs"],"mappings":"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","file":"cli.cjs","sourcesContent":["#!/usr/bin/env node\r\n\r\nimport { Command } from 'commander';\r\nimport * as fs from 'fs/promises';\r\nimport * as path from 'path';\r\n\r\nconst program = new Command();\r\n\r\nprogram\r\n .name('context-rag')\r\n .description('Context-RAG CLI - Setup and management tools')\r\n .version('1.0.0-beta.1');\r\n\r\nprogram\r\n .command('init')\r\n .description('Initialize Context-RAG in your project')\r\n .option('-f, --force', 'Overwrite existing files')\r\n .action(async (options) => {\r\n console.log('🚀 Initializing Context-RAG...\\n');\r\n\r\n try {\r\n // Check if prisma directory exists\r\n const prismaDir = path.join(process.cwd(), 'prisma');\r\n const schemaPath = path.join(prismaDir, 'schema.prisma');\r\n\r\n let schemaExists = false;\r\n try {\r\n await fs.access(schemaPath);\r\n schemaExists = true;\r\n } catch {\r\n schemaExists = false;\r\n }\r\n\r\n if (!schemaExists) {\r\n console.log('❌ Prisma schema not found at prisma/schema.prisma');\r\n console.log(' Please run `npx prisma init` first.\\n');\r\n process.exit(1);\r\n }\r\n\r\n // Read existing schema\r\n const existingSchema = await fs.readFile(schemaPath, 'utf-8');\r\n\r\n // Check if Context-RAG models already exist\r\n if (existingSchema.includes('ContextRagChunk') && !options.force) {\r\n console.log('⚠️ Context-RAG models already exist in schema.');\r\n console.log(' Use --force to overwrite.\\n');\r\n process.exit(0);\r\n }\r\n\r\n // Check for pgvector extension\r\n if (!existingSchema.includes('postgresqlExtensions')) {\r\n console.log('⚠️ Warning: pgvector extension not enabled.');\r\n console.log(' Add the following to your schema.prisma:\\n');\r\n console.log(' generator client {');\r\n console.log(' provider = \"prisma-client-js\"');\r\n console.log(' previewFeatures = [\"postgresqlExtensions\"]');\r\n console.log(' }\\n');\r\n console.log(' datasource db {');\r\n console.log(' provider = \"postgresql\"');\r\n console.log(' url = env(\"DATABASE_URL\")');\r\n console.log(' extensions = [vector]');\r\n console.log(' }\\n');\r\n }\r\n\r\n // Context-RAG models to append\r\n const contextRagModels = `\r\n// ============================================\r\n// Context-RAG Models\r\n// ============================================\r\n\r\n/// Stores prompt configurations for different document types\r\nmodel ContextRagPromptConfig {\r\n id String @id @default(uuid())\r\n documentType String @map(\"document_type\")\r\n name String\r\n systemPrompt String @map(\"system_prompt\") @db.Text\r\n chunkStrategy Json @map(\"chunk_strategy\")\r\n version Int @default(1)\r\n isActive Boolean @default(true) @map(\"is_active\")\r\n isDefault Boolean @default(false) @map(\"is_default\")\r\n createdBy String? @map(\"created_by\")\r\n changeLog String? @map(\"change_log\")\r\n createdAt DateTime @default(now()) @map(\"created_at\")\r\n updatedAt DateTime @updatedAt @map(\"updated_at\")\r\n\r\n chunks ContextRagChunk[]\r\n\r\n @@unique([documentType, version])\r\n @@index([documentType, isActive])\r\n @@map(\"context_rag_prompt_configs\")\r\n}\r\n\r\n/// Stores vector chunks for semantic search\r\nmodel ContextRagChunk {\r\n id String @id @default(uuid())\r\n promptConfigId String @map(\"prompt_config_id\")\r\n promptConfig ContextRagPromptConfig @relation(fields: [promptConfigId], references: [id], onDelete: Cascade)\r\n documentId String @map(\"document_id\")\r\n chunkIndex Int @map(\"chunk_index\")\r\n chunkType String @map(\"chunk_type\")\r\n\r\n /// Plain text content optimized for vector search\r\n searchContent String @map(\"search_content\") @db.Text\r\n\r\n /// Enriched content: context + searchContent (for RAG enhancement)\r\n enrichedContent String? @map(\"enriched_content\") @db.Text\r\n\r\n /// AI-generated context text only (for debugging)\r\n contextText String? @map(\"context_text\") @db.Text\r\n\r\n /// Vector embedding (768 dimensions for Gemini)\r\n searchVector Unsupported(\"vector(768)\") @map(\"search_vector\")\r\n\r\n /// Rich Markdown content for display\r\n displayContent String @map(\"display_content\") @db.Text\r\n\r\n sourcePageStart Int @map(\"source_page_start\")\r\n sourcePageEnd Int @map(\"source_page_end\")\r\n confidenceScore Float @default(0.5) @map(\"confidence_score\")\r\n metadata Json\r\n\r\n createdAt DateTime @default(now()) @map(\"created_at\")\r\n\r\n @@index([promptConfigId])\r\n @@index([documentId])\r\n @@index([chunkType])\r\n @@index([confidenceScore])\r\n @@map(\"context_rag_chunks\")\r\n}\r\n\r\n/// Tracks document processing state\r\nmodel ContextRagDocument {\r\n id String @id @default(uuid())\r\n filename String\r\n fileHash String @map(\"file_hash\")\r\n fileSize Int @map(\"file_size\")\r\n pageCount Int @map(\"page_count\")\r\n documentType String? @map(\"document_type\")\r\n\r\n /// Experiment identifier for A/B testing models\r\n experimentId String? @map(\"experiment_id\")\r\n\r\n /// AI model used for processing\r\n modelName String? @map(\"model_name\")\r\n\r\n /// Model configuration as JSON\r\n modelConfig Json? @map(\"model_config\")\r\n\r\n status String @default(\"PENDING\")\r\n\r\n promptConfigId String? @map(\"prompt_config_id\")\r\n totalBatches Int @default(0) @map(\"total_batches\")\r\n completedBatches Int @default(0) @map(\"completed_batches\")\r\n failedBatches Int @default(0) @map(\"failed_batches\")\r\n\r\n tokenUsage Json? @map(\"token_usage\")\r\n processingMs Int? @map(\"processing_ms\")\r\n errorMessage String? @map(\"error_message\")\r\n\r\n createdAt DateTime @default(now()) @map(\"created_at\")\r\n completedAt DateTime? @map(\"completed_at\")\r\n\r\n batches ContextRagBatch[]\r\n\r\n @@unique([fileHash, experimentId])\r\n @@index([status])\r\n @@index([fileHash])\r\n @@index([documentType])\r\n @@index([experimentId])\r\n @@map(\"context_rag_documents\")\r\n}\r\n\r\n/// Tracks individual batch processing jobs\r\nmodel ContextRagBatch {\r\n id String @id @default(uuid())\r\n documentId String @map(\"document_id\")\r\n document ContextRagDocument @relation(fields: [documentId], references: [id], onDelete: Cascade)\r\n\r\n batchIndex Int @map(\"batch_index\")\r\n pageStart Int @map(\"page_start\")\r\n pageEnd Int @map(\"page_end\")\r\n status String @default(\"PENDING\")\r\n retryCount Int @default(0) @map(\"retry_count\")\r\n lastError String? @map(\"last_error\")\r\n\r\n tokenUsage Json? @map(\"token_usage\")\r\n processingMs Int? @map(\"processing_ms\")\r\n\r\n startedAt DateTime? @map(\"started_at\")\r\n completedAt DateTime? @map(\"completed_at\")\r\n createdAt DateTime @default(now()) @map(\"created_at\")\r\n updatedAt DateTime @updatedAt @map(\"updated_at\")\r\n\r\n @@unique([documentId, batchIndex])\r\n @@index([documentId, status])\r\n @@index([status])\r\n @@map(\"context_rag_batches\")\r\n}\r\n`;\r\n\r\n // Remove existing Context-RAG models if force\r\n let newSchema = existingSchema;\r\n if (options.force && existingSchema.includes('// Context-RAG Models')) {\r\n const startMarker = '// ============================================\\n// Context-RAG Models';\r\n const startIndex = newSchema.indexOf(startMarker);\r\n if (startIndex !== -1) {\r\n newSchema = newSchema.substring(0, startIndex).trim();\r\n }\r\n }\r\n\r\n // Append new models\r\n newSchema = newSchema.trim() + '\\n' + contextRagModels;\r\n\r\n // Write updated schema\r\n await fs.writeFile(schemaPath, newSchema);\r\n\r\n console.log('✅ Context-RAG models added to prisma/schema.prisma\\n');\r\n console.log('Next steps:');\r\n console.log(' 1. Run: npx prisma migrate dev --name add_context_rag');\r\n console.log(' 2. Enable pgvector in PostgreSQL: CREATE EXTENSION IF NOT EXISTS vector;');\r\n console.log(' 3. Start using Context-RAG!\\n');\r\n\r\n } catch (error) {\r\n console.error('❌ Error:', (error as Error).message);\r\n process.exit(1);\r\n }\r\n });\r\n\r\nprogram\r\n .command('status')\r\n .description('Check Context-RAG setup status')\r\n .action(async () => {\r\n console.log('🔍 Checking Context-RAG status...\\n');\r\n\r\n // Check schema\r\n const schemaPath = path.join(process.cwd(), 'prisma', 'schema.prisma');\r\n try {\r\n const schema = await fs.readFile(schemaPath, 'utf-8');\r\n\r\n console.log('Prisma Schema:');\r\n console.log(` ✅ schema.prisma found`);\r\n console.log(` ${schema.includes('ContextRagChunk') ? '✅' : '❌'} Context-RAG models`);\r\n console.log(` ${schema.includes('postgresqlExtensions') ? '✅' : '❌'} pgvector extension`);\r\n console.log();\r\n } catch {\r\n console.log('❌ prisma/schema.prisma not found\\n');\r\n }\r\n\r\n // Check env\r\n console.log('Environment:');\r\n console.log(` ${process.env['DATABASE_URL'] ? '✅' : '❌'} DATABASE_URL`);\r\n console.log(` ${process.env['GEMINI_API_KEY'] ? '✅' : '❌'} GEMINI_API_KEY`);\r\n console.log();\r\n });\r\n\r\nprogram.parse();\r\n"]}
package/dist/bin/cli.js CHANGED
@@ -4,7 +4,7 @@ import * as fs from 'fs/promises';
4
4
  import * as path from 'path';
5
5
 
6
6
  var program = new Command();
7
- program.name("context-rag").description("Context-RAG CLI - Setup and management tools").version("0.1.0");
7
+ program.name("context-rag").description("Context-RAG CLI - Setup and management tools").version("1.0.0-beta.1");
8
8
  program.command("init").description("Initialize Context-RAG in your project").option("-f, --force", "Overwrite existing files").action(async (options) => {
9
9
  console.log("\u{1F680} Initializing Context-RAG...\n");
10
10
  try {
@@ -46,19 +46,20 @@ program.command("init").description("Initialize Context-RAG in your project").op
46
46
  // Context-RAG Models
47
47
  // ============================================
48
48
 
49
+ /// Stores prompt configurations for different document types
49
50
  model ContextRagPromptConfig {
50
51
  id String @id @default(uuid())
51
- documentType String
52
+ documentType String @map("document_type")
52
53
  name String
53
- systemPrompt String @db.Text
54
- chunkStrategy Json
54
+ systemPrompt String @map("system_prompt") @db.Text
55
+ chunkStrategy Json @map("chunk_strategy")
55
56
  version Int @default(1)
56
- isActive Boolean @default(true)
57
- isDefault Boolean @default(false)
58
- createdBy String?
59
- changeLog String?
60
- createdAt DateTime @default(now())
61
- updatedAt DateTime @updatedAt
57
+ isActive Boolean @default(true) @map("is_active")
58
+ isDefault Boolean @default(false) @map("is_default")
59
+ createdBy String? @map("created_by")
60
+ changeLog String? @map("change_log")
61
+ createdAt DateTime @default(now()) @map("created_at")
62
+ updatedAt DateTime @updatedAt @map("updated_at")
62
63
 
63
64
  chunks ContextRagChunk[]
64
65
 
@@ -67,80 +68,110 @@ model ContextRagPromptConfig {
67
68
  @@map("context_rag_prompt_configs")
68
69
  }
69
70
 
71
+ /// Stores vector chunks for semantic search
70
72
  model ContextRagChunk {
71
73
  id String @id @default(uuid())
72
- promptConfigId String
74
+ promptConfigId String @map("prompt_config_id")
73
75
  promptConfig ContextRagPromptConfig @relation(fields: [promptConfigId], references: [id], onDelete: Cascade)
74
- documentId String
75
- chunkIndex Int
76
- chunkType String
76
+ documentId String @map("document_id")
77
+ chunkIndex Int @map("chunk_index")
78
+ chunkType String @map("chunk_type")
77
79
 
78
- searchContent String @db.Text
79
- searchVector Unsupported("vector(768)")
80
- displayContent String @db.Text
80
+ /// Plain text content optimized for vector search
81
+ searchContent String @map("search_content") @db.Text
81
82
 
82
- sourcePageStart Int
83
- sourcePageEnd Int
84
- confidenceScore Float @default(0.5)
83
+ /// Enriched content: context + searchContent (for RAG enhancement)
84
+ enrichedContent String? @map("enriched_content") @db.Text
85
+
86
+ /// AI-generated context text only (for debugging)
87
+ contextText String? @map("context_text") @db.Text
88
+
89
+ /// Vector embedding (768 dimensions for Gemini)
90
+ searchVector Unsupported("vector(768)") @map("search_vector")
91
+
92
+ /// Rich Markdown content for display
93
+ displayContent String @map("display_content") @db.Text
94
+
95
+ sourcePageStart Int @map("source_page_start")
96
+ sourcePageEnd Int @map("source_page_end")
97
+ confidenceScore Float @default(0.5) @map("confidence_score")
85
98
  metadata Json
86
99
 
87
- createdAt DateTime @default(now())
100
+ createdAt DateTime @default(now()) @map("created_at")
88
101
 
89
102
  @@index([promptConfigId])
90
103
  @@index([documentId])
91
104
  @@index([chunkType])
105
+ @@index([confidenceScore])
92
106
  @@map("context_rag_chunks")
93
107
  }
94
108
 
109
+ /// Tracks document processing state
95
110
  model ContextRagDocument {
96
111
  id String @id @default(uuid())
97
112
  filename String
98
- fileHash String @unique
99
- fileSize Int
100
- pageCount Int
101
- documentType String?
113
+ fileHash String @map("file_hash")
114
+ fileSize Int @map("file_size")
115
+ pageCount Int @map("page_count")
116
+ documentType String? @map("document_type")
117
+
118
+ /// Experiment identifier for A/B testing models
119
+ experimentId String? @map("experiment_id")
120
+
121
+ /// AI model used for processing
122
+ modelName String? @map("model_name")
123
+
124
+ /// Model configuration as JSON
125
+ modelConfig Json? @map("model_config")
126
+
102
127
  status String @default("PENDING")
103
128
 
104
- promptConfigId String?
105
- totalBatches Int @default(0)
106
- completedBatches Int @default(0)
107
- failedBatches Int @default(0)
129
+ promptConfigId String? @map("prompt_config_id")
130
+ totalBatches Int @default(0) @map("total_batches")
131
+ completedBatches Int @default(0) @map("completed_batches")
132
+ failedBatches Int @default(0) @map("failed_batches")
108
133
 
109
- tokenUsage Json?
110
- processingMs Int?
111
- errorMessage String?
134
+ tokenUsage Json? @map("token_usage")
135
+ processingMs Int? @map("processing_ms")
136
+ errorMessage String? @map("error_message")
112
137
 
113
- createdAt DateTime @default(now())
114
- completedAt DateTime?
138
+ createdAt DateTime @default(now()) @map("created_at")
139
+ completedAt DateTime? @map("completed_at")
115
140
 
116
141
  batches ContextRagBatch[]
117
142
 
143
+ @@unique([fileHash, experimentId])
118
144
  @@index([status])
119
145
  @@index([fileHash])
146
+ @@index([documentType])
147
+ @@index([experimentId])
120
148
  @@map("context_rag_documents")
121
149
  }
122
150
 
151
+ /// Tracks individual batch processing jobs
123
152
  model ContextRagBatch {
124
153
  id String @id @default(uuid())
125
- documentId String
154
+ documentId String @map("document_id")
126
155
  document ContextRagDocument @relation(fields: [documentId], references: [id], onDelete: Cascade)
127
156
 
128
- batchIndex Int
129
- pageStart Int
130
- pageEnd Int
157
+ batchIndex Int @map("batch_index")
158
+ pageStart Int @map("page_start")
159
+ pageEnd Int @map("page_end")
131
160
  status String @default("PENDING")
132
- retryCount Int @default(0)
133
- lastError String?
161
+ retryCount Int @default(0) @map("retry_count")
162
+ lastError String? @map("last_error")
134
163
 
135
- tokenUsage Json?
136
- processingMs Int?
164
+ tokenUsage Json? @map("token_usage")
165
+ processingMs Int? @map("processing_ms")
137
166
 
138
- startedAt DateTime?
139
- completedAt DateTime?
140
- createdAt DateTime @default(now())
141
- updatedAt DateTime @updatedAt
167
+ startedAt DateTime? @map("started_at")
168
+ completedAt DateTime? @map("completed_at")
169
+ createdAt DateTime @default(now()) @map("created_at")
170
+ updatedAt DateTime @updatedAt @map("updated_at")
142
171
 
172
+ @@unique([documentId, batchIndex])
143
173
  @@index([documentId, status])
174
+ @@index([status])
144
175
  @@map("context_rag_batches")
145
176
  }
146
177
  `;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/bin/cli.ts"],"names":[],"mappings":"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","file":"cli.js","sourcesContent":["#!/usr/bin/env node\r\n\r\nimport { Command } from 'commander';\r\nimport * as fs from 'fs/promises';\r\nimport * as path from 'path';\r\n\r\nconst program = new Command();\r\n\r\nprogram\r\n .name('context-rag')\r\n .description('Context-RAG CLI - Setup and management tools')\r\n .version('0.1.0');\r\n\r\nprogram\r\n .command('init')\r\n .description('Initialize Context-RAG in your project')\r\n .option('-f, --force', 'Overwrite existing files')\r\n .action(async (options) => {\r\n console.log('🚀 Initializing Context-RAG...\\n');\r\n\r\n try {\r\n // Check if prisma directory exists\r\n const prismaDir = path.join(process.cwd(), 'prisma');\r\n const schemaPath = path.join(prismaDir, 'schema.prisma');\r\n\r\n let schemaExists = false;\r\n try {\r\n await fs.access(schemaPath);\r\n schemaExists = true;\r\n } catch {\r\n schemaExists = false;\r\n }\r\n\r\n if (!schemaExists) {\r\n console.log('❌ Prisma schema not found at prisma/schema.prisma');\r\n console.log(' Please run `npx prisma init` first.\\n');\r\n process.exit(1);\r\n }\r\n\r\n // Read existing schema\r\n const existingSchema = await fs.readFile(schemaPath, 'utf-8');\r\n\r\n // Check if Context-RAG models already exist\r\n if (existingSchema.includes('ContextRagChunk') && !options.force) {\r\n console.log('⚠️ Context-RAG models already exist in schema.');\r\n console.log(' Use --force to overwrite.\\n');\r\n process.exit(0);\r\n }\r\n\r\n // Check for pgvector extension\r\n if (!existingSchema.includes('postgresqlExtensions')) {\r\n console.log('⚠️ Warning: pgvector extension not enabled.');\r\n console.log(' Add the following to your schema.prisma:\\n');\r\n console.log(' generator client {');\r\n console.log(' provider = \"prisma-client-js\"');\r\n console.log(' previewFeatures = [\"postgresqlExtensions\"]');\r\n console.log(' }\\n');\r\n console.log(' datasource db {');\r\n console.log(' provider = \"postgresql\"');\r\n console.log(' url = env(\"DATABASE_URL\")');\r\n console.log(' extensions = [vector]');\r\n console.log(' }\\n');\r\n }\r\n\r\n // Context-RAG models to append\r\n const contextRagModels = `\r\n// ============================================\r\n// Context-RAG Models\r\n// ============================================\r\n\r\nmodel ContextRagPromptConfig {\r\n id String @id @default(uuid())\r\n documentType String\r\n name String\r\n systemPrompt String @db.Text\r\n chunkStrategy Json\r\n version Int @default(1)\r\n isActive Boolean @default(true)\r\n isDefault Boolean @default(false)\r\n createdBy String?\r\n changeLog String?\r\n createdAt DateTime @default(now())\r\n updatedAt DateTime @updatedAt\r\n\r\n chunks ContextRagChunk[]\r\n\r\n @@unique([documentType, version])\r\n @@index([documentType, isActive])\r\n @@map(\"context_rag_prompt_configs\")\r\n}\r\n\r\nmodel ContextRagChunk {\r\n id String @id @default(uuid())\r\n promptConfigId String\r\n promptConfig ContextRagPromptConfig @relation(fields: [promptConfigId], references: [id], onDelete: Cascade)\r\n documentId String\r\n chunkIndex Int\r\n chunkType String\r\n\r\n searchContent String @db.Text\r\n searchVector Unsupported(\"vector(768)\")\r\n displayContent String @db.Text\r\n\r\n sourcePageStart Int\r\n sourcePageEnd Int\r\n confidenceScore Float @default(0.5)\r\n metadata Json\r\n\r\n createdAt DateTime @default(now())\r\n\r\n @@index([promptConfigId])\r\n @@index([documentId])\r\n @@index([chunkType])\r\n @@map(\"context_rag_chunks\")\r\n}\r\n\r\nmodel ContextRagDocument {\r\n id String @id @default(uuid())\r\n filename String\r\n fileHash String @unique\r\n fileSize Int\r\n pageCount Int\r\n documentType String?\r\n status String @default(\"PENDING\")\r\n\r\n promptConfigId String?\r\n totalBatches Int @default(0)\r\n completedBatches Int @default(0)\r\n failedBatches Int @default(0)\r\n\r\n tokenUsage Json?\r\n processingMs Int?\r\n errorMessage String?\r\n\r\n createdAt DateTime @default(now())\r\n completedAt DateTime?\r\n\r\n batches ContextRagBatch[]\r\n\r\n @@index([status])\r\n @@index([fileHash])\r\n @@map(\"context_rag_documents\")\r\n}\r\n\r\nmodel ContextRagBatch {\r\n id String @id @default(uuid())\r\n documentId String\r\n document ContextRagDocument @relation(fields: [documentId], references: [id], onDelete: Cascade)\r\n\r\n batchIndex Int\r\n pageStart Int\r\n pageEnd Int\r\n status String @default(\"PENDING\")\r\n retryCount Int @default(0)\r\n lastError String?\r\n\r\n tokenUsage Json?\r\n processingMs Int?\r\n\r\n startedAt DateTime?\r\n completedAt DateTime?\r\n createdAt DateTime @default(now())\r\n updatedAt DateTime @updatedAt\r\n\r\n @@index([documentId, status])\r\n @@map(\"context_rag_batches\")\r\n}\r\n`;\r\n\r\n // Remove existing Context-RAG models if force\r\n let newSchema = existingSchema;\r\n if (options.force && existingSchema.includes('// Context-RAG Models')) {\r\n const startMarker = '// ============================================\\n// Context-RAG Models';\r\n const startIndex = newSchema.indexOf(startMarker);\r\n if (startIndex !== -1) {\r\n newSchema = newSchema.substring(0, startIndex).trim();\r\n }\r\n }\r\n\r\n // Append new models\r\n newSchema = newSchema.trim() + '\\n' + contextRagModels;\r\n\r\n // Write updated schema\r\n await fs.writeFile(schemaPath, newSchema);\r\n\r\n console.log('✅ Context-RAG models added to prisma/schema.prisma\\n');\r\n console.log('Next steps:');\r\n console.log(' 1. Run: npx prisma migrate dev --name add_context_rag');\r\n console.log(' 2. Enable pgvector in PostgreSQL: CREATE EXTENSION IF NOT EXISTS vector;');\r\n console.log(' 3. Start using Context-RAG!\\n');\r\n\r\n } catch (error) {\r\n console.error('❌ Error:', (error as Error).message);\r\n process.exit(1);\r\n }\r\n });\r\n\r\nprogram\r\n .command('status')\r\n .description('Check Context-RAG setup status')\r\n .action(async () => {\r\n console.log('🔍 Checking Context-RAG status...\\n');\r\n\r\n // Check schema\r\n const schemaPath = path.join(process.cwd(), 'prisma', 'schema.prisma');\r\n try {\r\n const schema = await fs.readFile(schemaPath, 'utf-8');\r\n\r\n console.log('Prisma Schema:');\r\n console.log(` ✅ schema.prisma found`);\r\n console.log(` ${schema.includes('ContextRagChunk') ? '✅' : '❌'} Context-RAG models`);\r\n console.log(` ${schema.includes('postgresqlExtensions') ? '✅' : '❌'} pgvector extension`);\r\n console.log();\r\n } catch {\r\n console.log('❌ prisma/schema.prisma not found\\n');\r\n }\r\n\r\n // Check env\r\n console.log('Environment:');\r\n console.log(` ${process.env['DATABASE_URL'] ? '✅' : '❌'} DATABASE_URL`);\r\n console.log(` ${process.env['GEMINI_API_KEY'] ? '✅' : '❌'} GEMINI_API_KEY`);\r\n console.log();\r\n });\r\n\r\nprogram.parse();\r\n"]}
1
+ {"version":3,"sources":["../../src/bin/cli.ts"],"names":[],"mappings":"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","file":"cli.js","sourcesContent":["#!/usr/bin/env node\r\n\r\nimport { Command } from 'commander';\r\nimport * as fs from 'fs/promises';\r\nimport * as path from 'path';\r\n\r\nconst program = new Command();\r\n\r\nprogram\r\n .name('context-rag')\r\n .description('Context-RAG CLI - Setup and management tools')\r\n .version('1.0.0-beta.1');\r\n\r\nprogram\r\n .command('init')\r\n .description('Initialize Context-RAG in your project')\r\n .option('-f, --force', 'Overwrite existing files')\r\n .action(async (options) => {\r\n console.log('🚀 Initializing Context-RAG...\\n');\r\n\r\n try {\r\n // Check if prisma directory exists\r\n const prismaDir = path.join(process.cwd(), 'prisma');\r\n const schemaPath = path.join(prismaDir, 'schema.prisma');\r\n\r\n let schemaExists = false;\r\n try {\r\n await fs.access(schemaPath);\r\n schemaExists = true;\r\n } catch {\r\n schemaExists = false;\r\n }\r\n\r\n if (!schemaExists) {\r\n console.log('❌ Prisma schema not found at prisma/schema.prisma');\r\n console.log(' Please run `npx prisma init` first.\\n');\r\n process.exit(1);\r\n }\r\n\r\n // Read existing schema\r\n const existingSchema = await fs.readFile(schemaPath, 'utf-8');\r\n\r\n // Check if Context-RAG models already exist\r\n if (existingSchema.includes('ContextRagChunk') && !options.force) {\r\n console.log('⚠️ Context-RAG models already exist in schema.');\r\n console.log(' Use --force to overwrite.\\n');\r\n process.exit(0);\r\n }\r\n\r\n // Check for pgvector extension\r\n if (!existingSchema.includes('postgresqlExtensions')) {\r\n console.log('⚠️ Warning: pgvector extension not enabled.');\r\n console.log(' Add the following to your schema.prisma:\\n');\r\n console.log(' generator client {');\r\n console.log(' provider = \"prisma-client-js\"');\r\n console.log(' previewFeatures = [\"postgresqlExtensions\"]');\r\n console.log(' }\\n');\r\n console.log(' datasource db {');\r\n console.log(' provider = \"postgresql\"');\r\n console.log(' url = env(\"DATABASE_URL\")');\r\n console.log(' extensions = [vector]');\r\n console.log(' }\\n');\r\n }\r\n\r\n // Context-RAG models to append\r\n const contextRagModels = `\r\n// ============================================\r\n// Context-RAG Models\r\n// ============================================\r\n\r\n/// Stores prompt configurations for different document types\r\nmodel ContextRagPromptConfig {\r\n id String @id @default(uuid())\r\n documentType String @map(\"document_type\")\r\n name String\r\n systemPrompt String @map(\"system_prompt\") @db.Text\r\n chunkStrategy Json @map(\"chunk_strategy\")\r\n version Int @default(1)\r\n isActive Boolean @default(true) @map(\"is_active\")\r\n isDefault Boolean @default(false) @map(\"is_default\")\r\n createdBy String? @map(\"created_by\")\r\n changeLog String? @map(\"change_log\")\r\n createdAt DateTime @default(now()) @map(\"created_at\")\r\n updatedAt DateTime @updatedAt @map(\"updated_at\")\r\n\r\n chunks ContextRagChunk[]\r\n\r\n @@unique([documentType, version])\r\n @@index([documentType, isActive])\r\n @@map(\"context_rag_prompt_configs\")\r\n}\r\n\r\n/// Stores vector chunks for semantic search\r\nmodel ContextRagChunk {\r\n id String @id @default(uuid())\r\n promptConfigId String @map(\"prompt_config_id\")\r\n promptConfig ContextRagPromptConfig @relation(fields: [promptConfigId], references: [id], onDelete: Cascade)\r\n documentId String @map(\"document_id\")\r\n chunkIndex Int @map(\"chunk_index\")\r\n chunkType String @map(\"chunk_type\")\r\n\r\n /// Plain text content optimized for vector search\r\n searchContent String @map(\"search_content\") @db.Text\r\n\r\n /// Enriched content: context + searchContent (for RAG enhancement)\r\n enrichedContent String? @map(\"enriched_content\") @db.Text\r\n\r\n /// AI-generated context text only (for debugging)\r\n contextText String? @map(\"context_text\") @db.Text\r\n\r\n /// Vector embedding (768 dimensions for Gemini)\r\n searchVector Unsupported(\"vector(768)\") @map(\"search_vector\")\r\n\r\n /// Rich Markdown content for display\r\n displayContent String @map(\"display_content\") @db.Text\r\n\r\n sourcePageStart Int @map(\"source_page_start\")\r\n sourcePageEnd Int @map(\"source_page_end\")\r\n confidenceScore Float @default(0.5) @map(\"confidence_score\")\r\n metadata Json\r\n\r\n createdAt DateTime @default(now()) @map(\"created_at\")\r\n\r\n @@index([promptConfigId])\r\n @@index([documentId])\r\n @@index([chunkType])\r\n @@index([confidenceScore])\r\n @@map(\"context_rag_chunks\")\r\n}\r\n\r\n/// Tracks document processing state\r\nmodel ContextRagDocument {\r\n id String @id @default(uuid())\r\n filename String\r\n fileHash String @map(\"file_hash\")\r\n fileSize Int @map(\"file_size\")\r\n pageCount Int @map(\"page_count\")\r\n documentType String? @map(\"document_type\")\r\n\r\n /// Experiment identifier for A/B testing models\r\n experimentId String? @map(\"experiment_id\")\r\n\r\n /// AI model used for processing\r\n modelName String? @map(\"model_name\")\r\n\r\n /// Model configuration as JSON\r\n modelConfig Json? @map(\"model_config\")\r\n\r\n status String @default(\"PENDING\")\r\n\r\n promptConfigId String? @map(\"prompt_config_id\")\r\n totalBatches Int @default(0) @map(\"total_batches\")\r\n completedBatches Int @default(0) @map(\"completed_batches\")\r\n failedBatches Int @default(0) @map(\"failed_batches\")\r\n\r\n tokenUsage Json? @map(\"token_usage\")\r\n processingMs Int? @map(\"processing_ms\")\r\n errorMessage String? @map(\"error_message\")\r\n\r\n createdAt DateTime @default(now()) @map(\"created_at\")\r\n completedAt DateTime? @map(\"completed_at\")\r\n\r\n batches ContextRagBatch[]\r\n\r\n @@unique([fileHash, experimentId])\r\n @@index([status])\r\n @@index([fileHash])\r\n @@index([documentType])\r\n @@index([experimentId])\r\n @@map(\"context_rag_documents\")\r\n}\r\n\r\n/// Tracks individual batch processing jobs\r\nmodel ContextRagBatch {\r\n id String @id @default(uuid())\r\n documentId String @map(\"document_id\")\r\n document ContextRagDocument @relation(fields: [documentId], references: [id], onDelete: Cascade)\r\n\r\n batchIndex Int @map(\"batch_index\")\r\n pageStart Int @map(\"page_start\")\r\n pageEnd Int @map(\"page_end\")\r\n status String @default(\"PENDING\")\r\n retryCount Int @default(0) @map(\"retry_count\")\r\n lastError String? @map(\"last_error\")\r\n\r\n tokenUsage Json? @map(\"token_usage\")\r\n processingMs Int? @map(\"processing_ms\")\r\n\r\n startedAt DateTime? @map(\"started_at\")\r\n completedAt DateTime? @map(\"completed_at\")\r\n createdAt DateTime @default(now()) @map(\"created_at\")\r\n updatedAt DateTime @updatedAt @map(\"updated_at\")\r\n\r\n @@unique([documentId, batchIndex])\r\n @@index([documentId, status])\r\n @@index([status])\r\n @@map(\"context_rag_batches\")\r\n}\r\n`;\r\n\r\n // Remove existing Context-RAG models if force\r\n let newSchema = existingSchema;\r\n if (options.force && existingSchema.includes('// Context-RAG Models')) {\r\n const startMarker = '// ============================================\\n// Context-RAG Models';\r\n const startIndex = newSchema.indexOf(startMarker);\r\n if (startIndex !== -1) {\r\n newSchema = newSchema.substring(0, startIndex).trim();\r\n }\r\n }\r\n\r\n // Append new models\r\n newSchema = newSchema.trim() + '\\n' + contextRagModels;\r\n\r\n // Write updated schema\r\n await fs.writeFile(schemaPath, newSchema);\r\n\r\n console.log('✅ Context-RAG models added to prisma/schema.prisma\\n');\r\n console.log('Next steps:');\r\n console.log(' 1. Run: npx prisma migrate dev --name add_context_rag');\r\n console.log(' 2. Enable pgvector in PostgreSQL: CREATE EXTENSION IF NOT EXISTS vector;');\r\n console.log(' 3. Start using Context-RAG!\\n');\r\n\r\n } catch (error) {\r\n console.error('❌ Error:', (error as Error).message);\r\n process.exit(1);\r\n }\r\n });\r\n\r\nprogram\r\n .command('status')\r\n .description('Check Context-RAG setup status')\r\n .action(async () => {\r\n console.log('🔍 Checking Context-RAG status...\\n');\r\n\r\n // Check schema\r\n const schemaPath = path.join(process.cwd(), 'prisma', 'schema.prisma');\r\n try {\r\n const schema = await fs.readFile(schemaPath, 'utf-8');\r\n\r\n console.log('Prisma Schema:');\r\n console.log(` ✅ schema.prisma found`);\r\n console.log(` ${schema.includes('ContextRagChunk') ? '✅' : '❌'} Context-RAG models`);\r\n console.log(` ${schema.includes('postgresqlExtensions') ? '✅' : '❌'} pgvector extension`);\r\n console.log();\r\n } catch {\r\n console.log('❌ prisma/schema.prisma not found\\n');\r\n }\r\n\r\n // Check env\r\n console.log('Environment:');\r\n console.log(` ${process.env['DATABASE_URL'] ? '✅' : '❌'} DATABASE_URL`);\r\n console.log(` ${process.env['GEMINI_API_KEY'] ? '✅' : '❌'} GEMINI_API_KEY`);\r\n console.log();\r\n });\r\n\r\nprogram.parse();\r\n"]}
package/dist/index.cjs CHANGED
@@ -1937,7 +1937,7 @@ ${chunk.content}
1937
1937
  };
1938
1938
 
1939
1939
  // src/enhancements/enhancement-registry.ts
1940
- function createEnhancementHandler(config, resolvedConfig, gemini) {
1940
+ function createEnhancementHandler(config, _resolvedConfig, gemini) {
1941
1941
  if (!config || config.approach === "none") {
1942
1942
  return new NoOpHandler();
1943
1943
  }