Kraft102's picture
Update backend source
34367da verified
// 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")
}