From 7a46c81897d930112ff5e857e4f3fb8f7a6447d3 Mon Sep 17 00:00:00 2001 From: Jason Woltje Date: Sun, 1 Mar 2026 08:41:45 -0600 Subject: [PATCH] feat(api): add agent fleet Prisma schema (MS22-P1a) --- .../migration.sql | 109 ++++++++++++++++++ apps/api/prisma/schema.prisma | 78 +++++++++++++ 2 files changed, 187 insertions(+) create mode 100644 apps/api/prisma/migrations/20260301144006_ms22_agent_fleet_schema/migration.sql diff --git a/apps/api/prisma/migrations/20260301144006_ms22_agent_fleet_schema/migration.sql b/apps/api/prisma/migrations/20260301144006_ms22_agent_fleet_schema/migration.sql new file mode 100644 index 0000000..e680137 --- /dev/null +++ b/apps/api/prisma/migrations/20260301144006_ms22_agent_fleet_schema/migration.sql @@ -0,0 +1,109 @@ +-- CreateTable +CREATE TABLE "SystemConfig" ( + "id" TEXT NOT NULL, + "key" TEXT NOT NULL, + "value" TEXT NOT NULL, + "encrypted" BOOLEAN NOT NULL DEFAULT false, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "SystemConfig_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "BreakglassUser" ( + "id" TEXT NOT NULL, + "username" TEXT NOT NULL, + "passwordHash" TEXT NOT NULL, + "isActive" BOOLEAN NOT NULL DEFAULT true, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "BreakglassUser_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "LlmProvider" ( + "id" TEXT NOT NULL, + "userId" TEXT NOT NULL, + "name" TEXT NOT NULL, + "displayName" TEXT NOT NULL, + "type" TEXT NOT NULL, + "baseUrl" TEXT, + "apiKey" TEXT, + "apiType" TEXT NOT NULL DEFAULT 'openai-completions', + "models" JSONB NOT NULL DEFAULT '[]', + "isActive" BOOLEAN NOT NULL DEFAULT true, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "LlmProvider_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "UserContainer" ( + "id" TEXT NOT NULL, + "userId" TEXT NOT NULL, + "containerId" TEXT, + "containerName" TEXT NOT NULL, + "gatewayPort" INTEGER, + "gatewayToken" TEXT NOT NULL, + "status" TEXT NOT NULL DEFAULT 'stopped', + "lastActiveAt" TIMESTAMP(3), + "idleTimeoutMin" INTEGER NOT NULL DEFAULT 30, + "config" JSONB NOT NULL DEFAULT '{}', + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "UserContainer_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "SystemContainer" ( + "id" TEXT NOT NULL, + "name" TEXT NOT NULL, + "role" TEXT NOT NULL, + "containerId" TEXT, + "gatewayPort" INTEGER, + "gatewayToken" TEXT NOT NULL, + "status" TEXT NOT NULL DEFAULT 'stopped', + "primaryModel" TEXT NOT NULL, + "isActive" BOOLEAN NOT NULL DEFAULT true, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "SystemContainer_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "UserAgentConfig" ( + "id" TEXT NOT NULL, + "userId" TEXT NOT NULL, + "primaryModel" TEXT, + "fallbackModels" JSONB NOT NULL DEFAULT '[]', + "personality" TEXT, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "UserAgentConfig_pkey" PRIMARY KEY ("id") +); + +-- CreateIndex +CREATE UNIQUE INDEX "SystemConfig_key_key" ON "SystemConfig"("key"); + +-- CreateIndex +CREATE UNIQUE INDEX "BreakglassUser_username_key" ON "BreakglassUser"("username"); + +-- CreateIndex +CREATE INDEX "LlmProvider_userId_idx" ON "LlmProvider"("userId"); + +-- CreateIndex +CREATE UNIQUE INDEX "LlmProvider_userId_name_key" ON "LlmProvider"("userId", "name"); + +-- CreateIndex +CREATE UNIQUE INDEX "UserContainer_userId_key" ON "UserContainer"("userId"); + +-- CreateIndex +CREATE UNIQUE INDEX "SystemContainer_name_key" ON "SystemContainer"("name"); + +-- CreateIndex +CREATE UNIQUE INDEX "UserAgentConfig_userId_key" ON "UserAgentConfig"("userId"); diff --git a/apps/api/prisma/schema.prisma b/apps/api/prisma/schema.prisma index 936538b..97312c1 100644 --- a/apps/api/prisma/schema.prisma +++ b/apps/api/prisma/schema.prisma @@ -1625,3 +1625,81 @@ model ConversationArchive { @@index([startedAt]) @@map("conversation_archives") } + +// ============================================ +// AGENT FLEET MODULE +// ============================================ + +model SystemConfig { + id String @id @default(cuid()) + key String @unique + value String + encrypted Boolean @default(false) + updatedAt DateTime @updatedAt +} + +model BreakglassUser { + id String @id @default(cuid()) + username String @unique + passwordHash String + isActive Boolean @default(true) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt +} + +model LlmProvider { + id String @id @default(cuid()) + userId String + name String + displayName String + type String + baseUrl String? + apiKey String? + apiType String @default("openai-completions") + models Json @default("[]") + isActive Boolean @default(true) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + @@unique([userId, name]) + @@index([userId]) +} + +model UserContainer { + id String @id @default(cuid()) + userId String @unique + containerId String? + containerName String + gatewayPort Int? + gatewayToken String + status String @default("stopped") + lastActiveAt DateTime? + idleTimeoutMin Int @default(30) + config Json @default("{}") + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt +} + +model SystemContainer { + id String @id @default(cuid()) + name String @unique + role String + containerId String? + gatewayPort Int? + gatewayToken String + status String @default("stopped") + primaryModel String + isActive Boolean @default(true) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt +} + +model UserAgentConfig { + id String @id @default(cuid()) + userId String @unique + primaryModel String? + fallbackModels Json @default("[]") + personality String? + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt +}