-- 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;