// This is your Prisma schema file,
// learn more about it in the docs: https://pris.ly/d/prisma-schema

// Looking for ways to speed up your queries, or scale easily with your serverless or edge functions?
// Try Prisma Accelerate: https://pris.ly/cli/accelerate-init

generator client {
  provider = "prisma-client-js"
}

datasource db {
  provider = "sqlite"
  url      = env("DATABASE_URL")
}

model Project {
  id              Int     @id @default(autoincrement())
  userId          String
  name            String
  state           String?
  draft           String?
  instanceId      String?
  deployKey       String?
  deployKeyPublic String?
  envVars         String?
  githubToken     String?
  access          String?
  geminiApiKey    String?
  anthropicApiKey String?
  logs            Log[]
}

model Log {
  id              Int     @id @default(autoincrement())
  projectId       Int
  project         Project @relation(fields: [projectId], references: [id], onDelete: Cascade)
  timestampMilli  BigInt
  contents        String
  commit          String?
  serviceName     String
  workerId        String
  runId           String
}