Add Prisma schema for runner jobs, job steps, and job events to support the autonomous runner infrastructure (M4.2). Enums added: - RunnerJobStatus: PENDING, QUEUED, RUNNING, COMPLETED, FAILED, CANCELLED - JobStepPhase: SETUP, EXECUTION, VALIDATION, CLEANUP - JobStepType: COMMAND, AI_ACTION, GATE, ARTIFACT - JobStepStatus: PENDING, RUNNING, COMPLETED, FAILED, SKIPPED Models added: - RunnerJob: Top-level job tracking linked to workspace and agent_tasks - JobStep: Granular step tracking within jobs with phase organization - JobEvent: Immutable event sourcing audit log for jobs and steps Foreign key relationships: - runner_jobs → workspaces (workspace_id, CASCADE) - runner_jobs → agent_tasks (agent_task_id, SET NULL) - job_steps → runner_jobs (job_id, CASCADE) - job_events → runner_jobs (job_id, CASCADE) - job_events → job_steps (step_id, CASCADE) Indexes added for performance on workspace_id, status, priority, timestamp. Migration: 20260201205935_add_job_tracking Quality gates passed: typecheck, lint, build Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
113 lines
3.6 KiB
SQL
113 lines
3.6 KiB
SQL
-- CreateEnum
|
|
CREATE TYPE "RunnerJobStatus" AS ENUM ('PENDING', 'QUEUED', 'RUNNING', 'COMPLETED', 'FAILED', 'CANCELLED');
|
|
|
|
-- CreateEnum
|
|
CREATE TYPE "JobStepPhase" AS ENUM ('SETUP', 'EXECUTION', 'VALIDATION', 'CLEANUP');
|
|
|
|
-- CreateEnum
|
|
CREATE TYPE "JobStepType" AS ENUM ('COMMAND', 'AI_ACTION', 'GATE', 'ARTIFACT');
|
|
|
|
-- CreateEnum
|
|
CREATE TYPE "JobStepStatus" AS ENUM ('PENDING', 'RUNNING', 'COMPLETED', 'FAILED', 'SKIPPED');
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "runner_jobs" (
|
|
"id" UUID NOT NULL,
|
|
"workspace_id" UUID NOT NULL,
|
|
"agent_task_id" UUID,
|
|
"type" TEXT NOT NULL,
|
|
"status" "RunnerJobStatus" NOT NULL DEFAULT 'PENDING',
|
|
"priority" INTEGER NOT NULL,
|
|
"progress_percent" INTEGER NOT NULL DEFAULT 0,
|
|
"result" JSONB,
|
|
"error" TEXT,
|
|
"created_at" TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"started_at" TIMESTAMPTZ,
|
|
"completed_at" TIMESTAMPTZ,
|
|
|
|
CONSTRAINT "runner_jobs_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "job_steps" (
|
|
"id" UUID NOT NULL,
|
|
"job_id" UUID NOT NULL,
|
|
"ordinal" INTEGER NOT NULL,
|
|
"phase" "JobStepPhase" NOT NULL,
|
|
"name" TEXT NOT NULL,
|
|
"type" "JobStepType" NOT NULL,
|
|
"status" "JobStepStatus" NOT NULL DEFAULT 'PENDING',
|
|
"output" TEXT,
|
|
"tokens_input" INTEGER,
|
|
"tokens_output" INTEGER,
|
|
"started_at" TIMESTAMPTZ,
|
|
"completed_at" TIMESTAMPTZ,
|
|
"duration_ms" INTEGER,
|
|
|
|
CONSTRAINT "job_steps_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "job_events" (
|
|
"id" UUID NOT NULL,
|
|
"job_id" UUID NOT NULL,
|
|
"step_id" UUID,
|
|
"type" TEXT NOT NULL,
|
|
"timestamp" TIMESTAMPTZ NOT NULL,
|
|
"actor" TEXT NOT NULL,
|
|
"payload" JSONB NOT NULL,
|
|
|
|
CONSTRAINT "job_events_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "runner_jobs_id_workspace_id_key" ON "runner_jobs"("id", "workspace_id");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "runner_jobs_workspace_id_idx" ON "runner_jobs"("workspace_id");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "runner_jobs_workspace_id_status_idx" ON "runner_jobs"("workspace_id", "status");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "runner_jobs_agent_task_id_idx" ON "runner_jobs"("agent_task_id");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "runner_jobs_priority_idx" ON "runner_jobs"("priority");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "job_steps_job_id_idx" ON "job_steps"("job_id");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "job_steps_job_id_ordinal_idx" ON "job_steps"("job_id", "ordinal");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "job_steps_status_idx" ON "job_steps"("status");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "job_events_job_id_idx" ON "job_events"("job_id");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "job_events_step_id_idx" ON "job_events"("step_id");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "job_events_timestamp_idx" ON "job_events"("timestamp");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "job_events_type_idx" ON "job_events"("type");
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "runner_jobs" ADD CONSTRAINT "runner_jobs_workspace_id_fkey" FOREIGN KEY ("workspace_id") REFERENCES "workspaces"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "runner_jobs" ADD CONSTRAINT "runner_jobs_agent_task_id_fkey" FOREIGN KEY ("agent_task_id") REFERENCES "agent_tasks"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "job_steps" ADD CONSTRAINT "job_steps_job_id_fkey" FOREIGN KEY ("job_id") REFERENCES "runner_jobs"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "job_events" ADD CONSTRAINT "job_events_job_id_fkey" FOREIGN KEY ("job_id") REFERENCES "runner_jobs"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "job_events" ADD CONSTRAINT "job_events_step_id_fkey" FOREIGN KEY ("step_id") REFERENCES "job_steps"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|