priv/repo/migrations/20260823133243_create_box_runs.exs

main at 58e6347eeb72 · 2 KB

defmodule OpenAgents.Repo.Migrations.CreateBoxRuns do
  use Ecto.Migration

  def change do
    create table(:box_runs, primary_key: false) do
      add :id, :binary_id, primary_key: true

      add :conversation_id,
          references(:conversations, type: :binary_id, on_delete: :delete_all),
          null: false

      add :conversation_box_id,
          references(:conversation_boxes, type: :binary_id, on_delete: :restrict),
          null: false

      add :requesting_principal, :map, null: false
      add :command, :text, null: false
      add :idempotency_key, :string, null: false
      add :state, :string, null: false, default: "admitted"
      add :exit_status, :integer
      add :timed_out, :boolean, null: false, default: false
      add :output, :text, null: false, default: ""
      add :output_base_offset, :integer, null: false, default: 0
      add :last_output_offset, :integer, null: false, default: 0
      add :pid, :integer
      add :run_directory, :string, null: false
      add :failure_reason, :string
      add :dispatch_attempted_at, :utc_datetime_usec
      add :probe_attempted_at, :utc_datetime_usec
      add :admitted_at, :utc_datetime_usec, null: false
      add :dispatched_at, :utc_datetime_usec
      add :started_at, :utc_datetime_usec
      add :finished_at, :utc_datetime_usec
      add :cancellation_requested_at, :utc_datetime_usec
      add :cancellation_effective_at, :utc_datetime_usec
      add :deadline_at, :utc_datetime_usec, null: false

      timestamps(type: :utc_datetime_usec)
    end

    create unique_index(:box_runs, [:conversation_id, :idempotency_key])

    create unique_index(:box_runs, [:conversation_box_id],
             name: :box_runs_one_active_per_box_index,
             where: "state IN ('admitted', 'dispatched', 'running')"
           )

    create index(:box_runs, [:conversation_id, :inserted_at])
    create index(:box_runs, [:state])

    create constraint(:box_runs, :box_runs_state_check,
             check:
               "state IN ('admitted', 'dispatched', 'running', 'completed', 'failed', 'cancelled', 'timed_out', 'lost')"
           )

    create constraint(:box_runs, :box_runs_offsets_check,
             check: "output_base_offset >= 0 AND last_output_offset >= output_base_offset"
           )
  end
end