diff --git a/apps/api/prisma/migrations/20260307004007_ms23_mission_control_schema/migration.sql b/apps/api/prisma/migrations/20260307004007_ms23_mission_control_schema/migration.sql new file mode 100644 index 0000000..2e192bb --- /dev/null +++ b/apps/api/prisma/migrations/20260307004007_ms23_mission_control_schema/migration.sql @@ -0,0 +1,83 @@ +-- CreateTable +CREATE TABLE "AgentConversationMessage" ( + "id" TEXT NOT NULL, + "sessionId" TEXT NOT NULL, + "provider" TEXT NOT NULL DEFAULT 'internal', + "role" TEXT NOT NULL, + "content" TEXT NOT NULL, + "timestamp" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "metadata" JSONB NOT NULL DEFAULT '{}', + + CONSTRAINT "AgentConversationMessage_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "AgentSessionTree" ( + "id" TEXT NOT NULL, + "sessionId" TEXT NOT NULL, + "parentSessionId" TEXT, + "provider" TEXT NOT NULL DEFAULT 'internal', + "missionId" TEXT, + "taskId" TEXT, + "taskSource" TEXT DEFAULT 'internal', + "agentType" TEXT, + "status" TEXT NOT NULL DEFAULT 'spawning', + "spawnedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "completedAt" TIMESTAMP(3), + "metadata" JSONB NOT NULL DEFAULT '{}', + + CONSTRAINT "AgentSessionTree_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "AgentProviderConfig" ( + "id" TEXT NOT NULL, + "workspaceId" TEXT NOT NULL, + "name" TEXT NOT NULL, + "provider" TEXT NOT NULL, + "gatewayUrl" TEXT NOT NULL, + "credentials" JSONB NOT NULL DEFAULT '{}', + "isActive" BOOLEAN NOT NULL DEFAULT true, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "AgentProviderConfig_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "OperatorAuditLog" ( + "id" TEXT NOT NULL, + "userId" TEXT NOT NULL, + "sessionId" TEXT NOT NULL, + "provider" TEXT NOT NULL, + "action" TEXT NOT NULL, + "content" TEXT, + "metadata" JSONB NOT NULL DEFAULT '{}', + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "OperatorAuditLog_pkey" PRIMARY KEY ("id") +); + +-- CreateIndex +CREATE INDEX "AgentConversationMessage_sessionId_timestamp_idx" ON "AgentConversationMessage"("sessionId", "timestamp"); + +-- CreateIndex +CREATE UNIQUE INDEX "AgentSessionTree_sessionId_key" ON "AgentSessionTree"("sessionId"); + +-- CreateIndex +CREATE INDEX "AgentSessionTree_parentSessionId_idx" ON "AgentSessionTree"("parentSessionId"); + +-- CreateIndex +CREATE INDEX "AgentSessionTree_missionId_idx" ON "AgentSessionTree"("missionId"); + +-- CreateIndex +CREATE UNIQUE INDEX "AgentProviderConfig_workspaceId_name_key" ON "AgentProviderConfig"("workspaceId", "name"); + +-- CreateIndex +CREATE INDEX "OperatorAuditLog_sessionId_idx" ON "OperatorAuditLog"("sessionId"); + +-- CreateIndex +CREATE INDEX "OperatorAuditLog_userId_idx" ON "OperatorAuditLog"("userId"); + +-- CreateIndex +CREATE INDEX "OperatorAuditLog_createdAt_idx" ON "OperatorAuditLog"("createdAt"); diff --git a/apps/api/prisma/schema.prisma b/apps/api/prisma/schema.prisma index 33ed985..eba9bce 100644 --- a/apps/api/prisma/schema.prisma +++ b/apps/api/prisma/schema.prisma @@ -1739,3 +1739,66 @@ model UserAgent { @@unique([userId, name]) @@index([userId]) } + +// MS23: Agent conversation messages for Mission Control streaming +model AgentConversationMessage { + id String @id @default(cuid()) + sessionId String + provider String @default("internal") + role String + content String + timestamp DateTime @default(now()) + metadata Json @default("{}") + + @@index([sessionId, timestamp]) +} + +// MS23: Agent session tree for parent/child relationships +model AgentSessionTree { + id String @id @default(cuid()) + sessionId String @unique + parentSessionId String? + provider String @default("internal") + missionId String? + taskId String? + taskSource String? @default("internal") + agentType String? + status String @default("spawning") + spawnedAt DateTime @default(now()) + completedAt DateTime? + metadata Json @default("{}") + + @@index([parentSessionId]) + @@index([missionId]) +} + +// MS23: External agent provider configuration per workspace +model AgentProviderConfig { + id String @id @default(cuid()) + workspaceId String + name String + provider String + gatewayUrl String + credentials Json @default("{}") + isActive Boolean @default(true) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + @@unique([workspaceId, name]) +} + +// MS23: Audit log for operator interventions +model OperatorAuditLog { + id String @id @default(cuid()) + userId String + sessionId String + provider String + action String + content String? + metadata Json @default("{}") + createdAt DateTime @default(now()) + + @@index([sessionId]) + @@index([userId]) + @@index([createdAt]) +}