The one item type whose text streams in deltas, so the runtime needs it typed. attrs still carries the complete protocol payload — phase and status are conveniences read from it, not a replacement for it.
attrs
phase
status
@type t() :: %CodexEx.AppServer.ThreadItem.AgentMessage{ attrs: CodexEx.AppServer.Types.json_object(), id: binary(), phase: CodexEx.AppServer.Types.json_value() | nil, status: CodexEx.AppServer.Types.json_value() | nil, text: binary() | nil, type: binary() }