// SQLite-backed dev persistence (M5.9). The model is stored as a JSON snapshot // per project + a changelog of applied ops. This is the smallest shape that // gives us "refresh persists state" without committing to the full // event-sourced architecture in docs/sync.md (that lands later). // // Switch `provider` to "postgresql" + set DATABASE_URL=postgres://… to move // to a real DB later — schema is portable. generator client { provider = "prisma-client-js" } datasource db { provider = "sqlite" url = "file:./dev.db" } model Project { id String @id name String scope String tagline String createdAt DateTime @default(now()) updatedAt DateTime @updatedAt snapshots ModelSnapshot[] changes ChangelogEntry[] threads SocratesThread[] } model ModelSnapshot { id String @id @default(cuid()) projectId String version Int json String // serialized SysMLModel createdAt DateTime @default(now()) project Project @relation(fields: [projectId], references: [id], onDelete: Cascade) @@unique([projectId, version]) @@index([projectId, version]) } model ChangelogEntry { id String @id @default(cuid()) projectId String version Int // resulting model version after these ops landed ops String // JSON-encoded ModelOp[] reason String? // optional human/Socrates-supplied rationale createdAt DateTime @default(now()) project Project @relation(fields: [projectId], references: [id], onDelete: Cascade) @@index([projectId, version]) } model SocratesThread { id String @id @default(cuid()) projectId String /// Model element this thread is anchored to, if any (block id, req id, …). anchorElementId String? status String @default("open") // open | archived | resolved title String? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt project Project @relation(fields: [projectId], references: [id], onDelete: Cascade) messages SocratesMessage[] @@index([projectId]) } model SocratesMessage { id String @id @default(cuid()) threadId String role String // "user" | "assistant" /// JSON: { text, options?: [{n,label,sub?}] } content String /// Provider + model that produced this turn (assistant turns only). provider String? model String? inputTokens Int? outputTokens Int? createdAt DateTime @default(now()) thread SocratesThread @relation(fields: [threadId], references: [id], onDelete: Cascade) @@index([threadId, createdAt]) }