// This is your Prisma schema file, // learn more about it in the docs: https://pris.ly/d/prisma-schema generator client { provider = "prisma-client-js" binaryTargets = ["native"] engineType = "binary" } datasource db { provider = "postgresql" url = env("DATABASE_URL") } // NOTE: Vector embeddings are stored in Neo4j, not PostgreSQL // This schema handles relational data only // ============================================ // UI State & Configuration // ============================================ model Widget { id String @id @default(uuid()) name String type String config Json? active Boolean @default(true) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt @@map("widgets") } model Layout { id String @id @default(uuid()) userId String orgId String layoutData Json createdAt DateTime @default(now()) updatedAt DateTime @updatedAt @@unique([userId, orgId]) @@map("layouts") } // ============================================ // Memory & Knowledge Graph // ============================================ model MemoryEntity { id Int @id @default(autoincrement()) orgId String @map("org_id") userId String? @map("user_id") entityType String @map("entity_type") content String importance Int @default(3) createdAt DateTime @default(now()) @map("created_at") tags MemoryTag[] relationsFrom MemoryRelation[] @relation("SourceEntity") relationsTo MemoryRelation[] @relation("TargetEntity") @@index([orgId, userId]) @@index([entityType]) @@map("memory_entities") } model MemoryRelation { id Int @id @default(autoincrement()) orgId String @map("org_id") sourceId Int @map("source_id") targetId Int @map("target_id") relationType String @map("relation_type") createdAt DateTime @default(now()) @map("created_at") source MemoryEntity @relation("SourceEntity", fields: [sourceId], references: [id], onDelete: Cascade) target MemoryEntity @relation("TargetEntity", fields: [targetId], references: [id], onDelete: Cascade) @@index([sourceId]) @@index([targetId]) @@index([orgId]) @@map("memory_relations") } model MemoryTag { id Int @id @default(autoincrement()) entityId Int @map("entity_id") tag String createdAt DateTime @default(now()) @map("created_at") entity MemoryEntity @relation(fields: [entityId], references: [id], onDelete: Cascade) @@index([tag]) @@index([entityId]) @@map("memory_tags") } // ============================================ // PAL (Personal Assistant Layer) // ============================================ model PalUserProfile { id Int @id @default(autoincrement()) userId String @map("user_id") orgId String @map("org_id") preferenceTone String @default("neutral") @map("preference_tone") createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @default(now()) @updatedAt @map("updated_at") @@unique([userId, orgId]) @@map("pal_user_profiles") } model PalFocusWindow { id Int @id @default(autoincrement()) userId String @map("user_id") orgId String @map("org_id") weekday Int startHour Int @map("start_hour") endHour Int @map("end_hour") createdAt DateTime @default(now()) @map("created_at") @@index([userId, orgId]) @@map("pal_focus_windows") } model PalEvent { id Int @id @default(autoincrement()) userId String @map("user_id") orgId String @map("org_id") eventType String @map("event_type") payload Json detectedStressLevel Int? @map("detected_stress_level") createdAt DateTime @default(now()) @map("created_at") @@index([userId, orgId]) @@index([eventType]) @@map("pal_events") } // ============================================ // SRAG (Structured RAG) // ============================================ model RawDocument { id Int @id @default(autoincrement()) orgId String @map("org_id") sourceType String @map("source_type") sourcePath String @map("source_path") content String createdAt DateTime @default(now()) @map("created_at") facts StructuredFact[] @@index([orgId]) @@map("raw_documents") } model StructuredFact { id Int @id @default(autoincrement()) orgId String @map("org_id") docId Int? @map("doc_id") factType String @map("fact_type") jsonPayload Json @map("json_payload") occurredAt DateTime? @map("occurred_at") createdAt DateTime @default(now()) @map("created_at") document RawDocument? @relation(fields: [docId], references: [id], onDelete: SetNull) @@index([orgId]) @@index([factType]) @@map("structured_facts") } // ============================================ // Document Metadata (vectors stored in Neo4j) // ============================================ model VectorDocument { id String @id @default(uuid()) content String // NOTE: Embeddings are stored in Neo4j, not here metadata Json? namespace String @default("default") userId String orgId String createdAt DateTime @default(now()) updatedAt DateTime @updatedAt @@index([namespace]) @@index([userId, orgId]) @@map("vector_documents") } // ============================================ // Autonomous Agent & Tasks // ============================================ model AgentTask { id String @id @default(uuid()) type String payload Json status String @default("pending") // pending, running, completed, failed, waiting_approval priority Int @default(50) result Json? error String? userId String @default("system") orgId String @default("default") createdAt DateTime @default(now()) updatedAt DateTime @updatedAt completedAt DateTime? @@index([status]) @@index([priority]) @@index([userId, orgId]) @@map("agent_tasks") } model ExecutionLog { id String @id @default(uuid()) taskId String? taskType String success Boolean duration Int? // milliseconds result Json? error String? userId String @default("system") orgId String @default("default") createdAt DateTime @default(now()) @@index([taskType]) @@index([createdAt]) @@index([userId, orgId]) @@map("execution_logs") } // ============================================ // Data Sources & Ingestion // ============================================ model DataSource { id String @id @default(uuid()) name String @unique type String description String? enabled Boolean @default(false) requiresApproval Boolean @default(true) config Json? lastUsedAt DateTime? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt @@map("data_sources") } model IngestedDocument { id String @id @default(uuid()) sourceId String externalId String title String? content String? metadata Json? userId String orgId String ingestedAt DateTime @default(now()) @@unique([sourceId, externalId]) @@index([userId, orgId]) @@map("ingested_documents") } // ============================================ // MCP Resources & Prompts // ============================================ model MCPResource { id String @id @default(uuid()) uri String @unique name String description String? mimeType String? payload Json createdAt DateTime @default(now()) updatedAt DateTime @updatedAt @@map("mcp_resources") } model AgentPrompt { id String @id @default(uuid()) agentId String version Int promptText String active Boolean @default(true) performance Json? // KPIs, metrics createdAt DateTime @default(now()) @@unique([agentId, version]) @@map("agent_prompts") } // ============================================ // Security search + activity // ============================================ model SecuritySearchTemplate { id String @id name String description String query String severity String timeframe String sources Json createdAt DateTime @default(now()) @map("created_at") @@map("security_search_templates") } model SecuritySearchHistory { id String @id query String severity String timeframe String sources Json results Int @map("results_count") latencyMs Int @map("latency_ms") createdAt DateTime @default(now()) @map("created_at") @@map("security_search_history") } model SecurityActivityEvent { id String @id title String description String category String severity String source String rule String? channel String payload Json? createdAt DateTime @default(now()) @map("created_at") acknowledged Boolean @default(false) @@map("security_activity_events") } // ============================================ // Widget permissions // ============================================ model WidgetPermission { widgetId String @map("widget_id") resourceType String @map("resource_type") accessLevel String @map("access_level") override Boolean @default(false) @@id([widgetId, resourceType]) @@map("widget_permissions") } // ============================================ // PRD Prototypes // ============================================ model Prototype { id String @id @default(uuid()) name String htmlContent String prdId String? version Int @default(1) style String @default("modern") status String @default("complete") // generating, complete, error metadata Json? userId String @default("system") orgId String @default("default") createdAt DateTime @default(now()) updatedAt DateTime @updatedAt @@unique([name, userId, orgId]) @@index([userId, orgId]) @@index([prdId]) @@map("prototypes") } // ============================================ // Notes (migrated from sql.js) // ============================================ model Note { id Int @id @default(autoincrement()) userId String @map("user_id") orgId String @map("org_id") source String title String body String tags String @default("") owner String compliance String @default("clean") // clean, review, restricted retention String @default("90d") // 30d, 90d, 1y, archive riskScore Int @default(0) @map("risk_score") attachments Int @default(0) createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @default(now()) @updatedAt @map("updated_at") @@index([userId, orgId]) @@index([source]) @@index([compliance]) @@map("notes") }