Current section
Files
Jump to
Current section
Files
lib/codex/protocol/collab_agent_status_entry.ex
defmodule Codex.Protocol.CollabAgentStatusEntry do
@moduledoc """
Typed association between an agent reference and its lifecycle state.
"""
use TypedStruct
alias Codex.Protocol.CollabAgentRef
alias Codex.Protocol.CollabAgentState
typedstruct do
field(:thread_id, String.t(), enforce: true)
field(:agent_nickname, String.t() | nil)
field(:agent_role, String.t() | nil)
field(:status, CollabAgentState.t(), enforce: true)
end
@spec from_map(map() | t()) :: t()
def from_map(%__MODULE__{} = entry), do: entry
def from_map(%{} = value) do
ref = CollabAgentRef.from_map(value)
%__MODULE__{
thread_id: ref.thread_id,
agent_nickname: ref.agent_nickname,
agent_role: ref.agent_role,
status: value |> fetch_status() |> CollabAgentState.from_map()
}
end
@spec to_map(t()) :: map()
def to_map(%__MODULE__{} = entry) do
%{
"thread_id" => entry.thread_id,
"status" => CollabAgentState.to_event_value(entry.status)
}
|> maybe_put("agent_nickname", entry.agent_nickname)
|> maybe_put("agent_role", entry.agent_role)
end
defp fetch_status(%{} = value), do: Map.get(value, "status") || Map.get(value, :status)
defp maybe_put(map, _key, nil), do: map
defp maybe_put(map, key, value), do: Map.put(map, key, value)
end