Settings

Schema and implementation notes

Current Prisma-backed schema snapshot for DDAI operator surfaces and demo workflow entities.


generator client {
  provider = "prisma-client"
  output   = "../src/generated/prisma"
}

datasource db {
  provider = "sqlite"
}

enum LeadStatus {
  NEW
  QUALIFIED
  SCRAPED
  DEMO_DRAFT
  PUBLISHED
  SENT
  ENGAGED
}

enum Channel {
  WHATSAPP
  EMAIL
  HYBRID
}

enum RenderMode {
  IFRAME
  SCREENSHOT
  RECONSTRUCTED
}

enum DemoPageStatus {
  DRAFT
  PUBLISHED
}

enum KnowledgeStatus {
  DRAFT
  READY
}

enum AgentStatus {
  DRAFT
  READY
}

enum JobType {
  SCRAPE
  TRAIN
  BUILD_DEMO
  PUBLISH
}

enum JobStatus {
  QUEUED
  RUNNING
  COMPLETED
  FAILED
}

model Lead {
  id               String            @id @default(cuid())
  businessName     String
  contactName      String?
  email            String?
  phone            String?
  whatsappNumber   String?
  websiteUrl       String?
  niche            String?
  city             String?
  source           String?
  notes            String?
  status           LeadStatus        @default(NEW)
  qualified        Boolean           @default(false)
  preferredChannel Channel           @default(WHATSAPP)
  scrapes          ProspectScrape[]
  knowledgeBases   KnowledgeBase[]
  chatAgents       ChatAgent[]
  demoPages        DemoPage[]
  deliveryEvents   DeliveryEvent[]
  engagements      EngagementEvent[]
  demoJobs         DemoJob[]
  createdAt        DateTime          @default(now())
  updatedAt        DateTime          @updatedAt
}

model PersonaTemplate {
  id                 String           @id @default(cuid())
  name               String
  vertical           String?
  tone               String?
  objective          String?
  qualificationSteps Json?
  guardrails         Json?
  avatarUrl          String?
  knowledgeBases     KnowledgeBase[]
  chatAgents         ChatAgent[]
  createdAt          DateTime         @default(now())
  updatedAt          DateTime         @updatedAt
}

model ProspectScrape {
  id                   String     @id @default(cuid())
  leadId               String
  scrapeStatus         String
  iframeAllowed        Boolean    @default(false)
  siteQualityScore     Int?
  homepageTitle        String?
  summary              String?
  servicesJson         Json?
  faqsJson             Json?
  screenshotUrl        String?
  embedModeRecommended RenderMode @default(SCREENSHOT)
  lead                 Lead       @relation(fields: [leadId], references: [id], onDelete: Cascade)
  createdAt            DateTime   @default(now())
  updatedAt            DateTime   @updatedAt
}

model KnowledgeBase {
  id                String           @id @default(cuid())
  leadId            String
  version           Int              @default(1)
  status            KnowledgeStatus  @default(DRAFT)
  systemPrompt      String?
  highlights        Json?
  retrievalMode     String?
  personaTemplateId String?
  lead              Lead             @relation(fields: [leadId], references: [id], onDelete: Cascade)
  personaTemplate   PersonaTemplate? @relation(fields: [personaTemplateId], references: [id], onDelete: SetNull)
  createdAt         DateTime         @default(now())
  updatedAt         DateTime         @updatedAt
}

model ChatAgent {
  id                String           @id @default(cuid())
  leadId            String
  provider          String?
  externalAgentId   String?
  widgetId          String?
  status            AgentStatus      @default(DRAFT)
  handoffMode       String?
  personaTemplateId String?
  lead              Lead             @relation(fields: [leadId], references: [id], onDelete: Cascade)
  personaTemplate   PersonaTemplate? @relation(fields: [personaTemplateId], references: [id], onDelete: SetNull)
  createdAt         DateTime         @default(now())
  updatedAt         DateTime         @updatedAt
}

model DemoPage {
  id                String         @id @default(cuid())
  leadId            String
  slug              String         @unique
  title             String
  headline          String
  subheadline       String
  bulletsJson       Json?
  primaryCtaLabel   String
  primaryCtaUrl     String
  secondaryCtaLabel String?
  secondaryCtaUrl   String?
  bookingUrl        String?
  renderMode        RenderMode     @default(IFRAME)
  websiteUrl        String?
  screenshotUrl     String?
  status            DemoPageStatus @default(DRAFT)
  lead              Lead           @relation(fields: [leadId], references: [id], onDelete: Cascade)
  createdAt         DateTime       @default(now())
  updatedAt         DateTime       @updatedAt
}

model DemoJob {
  id          String    @id @default(cuid())
  leadId      String
  jobType     JobType
  status      JobStatus @default(QUEUED)
  owner       String?
  startedAt   DateTime?
  completedAt DateTime?
  lead        Lead      @relation(fields: [leadId], references: [id], onDelete: Cascade)
  createdAt   DateTime  @default(now())
  updatedAt   DateTime  @updatedAt
}

model DeliveryEvent {
  id         String   @id @default(cuid())
  leadId     String
  demoPageId String?
  channel    Channel
  eventType  String
  recipient  String?
  metadata   Json?
  lead       Lead     @relation(fields: [leadId], references: [id], onDelete: Cascade)
  createdAt  DateTime @default(now())
}

model EngagementEvent {
  id         String   @id @default(cuid())
  leadId     String
  demoPageId String?
  eventType  String
  sessionId  String?
  metadata   Json?
  lead       Lead     @relation(fields: [leadId], references: [id], onDelete: Cascade)
  createdAt  DateTime @default(now())
}

model IntegrationSetting {
  id         String   @id @default(cuid())
  provider   String   @unique
  configJson Json?
  createdAt  DateTime @default(now())
  updatedAt  DateTime @updatedAt
}