Skip to main content

lib/pi/protocol/session/snapshot.ex

defmodule Pi.Protocol.Session.Snapshot do
  @moduledoc "Renderer-neutral snapshot of a server-owned Pi session."

  use JSONCodec, case: :camel, fast_path: :json

  alias Pi.Protocol.Session.Event

  defstruct [
    :id,
    :parent_id,
    :name,
    :status,
    :result,
    :error,
    :started_at,
    :updated_at,
    :last_activity_at,
    :completed_at,
    :current_started_at,
    :duration_ms,
    :prompt,
    :response,
    :latest,
    :current,
    usage: nil,
    run_count: 0,
    turn_count: 0,
    message_count: 0,
    recent_output: [],
    events: []
  ]

  @type t :: %__MODULE__{
          id: String.t(),
          parent_id: String.t() | nil,
          name: String.t() | nil,
          status: String.t(),
          result: term(),
          error: String.t() | nil,
          started_at: String.t() | nil,
          updated_at: String.t() | nil,
          last_activity_at: String.t() | nil,
          completed_at: String.t() | nil,
          current_started_at: String.t() | nil,
          duration_ms: non_neg_integer() | nil,
          prompt: String.t() | nil,
          response: String.t() | nil,
          latest: String.t() | nil,
          current: String.t() | nil,
          usage: map() | nil,
          run_count: non_neg_integer(),
          turn_count: non_neg_integer(),
          message_count: non_neg_integer(),
          recent_output: [String.t()],
          events: [Event.t()]
        }
end