Todo tracking helpers for BeamAgent message streams.
This module extracts, filters, and summarizes todo items from the message history produced by any agentic coder backend. Backends emit structured todo lists as part of their message streams; this module provides a uniform API for consuming them regardless of which backend produced the messages.
When to use directly vs through BeamAgent
Use this module when you need to inspect task progress in a session — for example, to display a task dashboard, poll for completion, or gate downstream actions on todo status.
Quick example
{:ok, messages} = BeamAgent.SessionStore.get_session_messages(session_id)
todos = BeamAgent.Todo.extract_todos(messages)
in_progress = BeamAgent.Todo.filter_by_status(todos, :in_progress)
summary = BeamAgent.Todo.todo_summary(todos)
# => %{total: 5, pending: 2, in_progress: 1, completed: 2}Core concepts
Todo items: maps with a
:contentstring (the task description) and a:status(:pending,:in_progress, or:completed). Some items also carry an:active_formfield with the in-progress display variant.Extraction:
extract_todos/1scans a flat message list for messages that carry todo arrays and returns all todo items found, in order.Summary:
todo_summary/1returns a map with:totaland one key per distinct status value, giving counts at a glance.
Architecture deep dive
This module is a thin Elixir facade that delegates to :beam_agent_todo. All
functions are pure — no ETS, no processes, no side effects.
Summary
Functions
Extract all todo items from a flat list of messages.
Filter a todo list by status.
Summarize a todo list as a count map.
Types
@type todo_item() :: %{ :content => binary(), :status => todo_status(), optional(:active_form) => binary() }
@type todo_status() :: :pending | :in_progress | :completed
Functions
@spec extract_todos([BeamAgent.message()]) :: [todo_item()]
Extract all todo items from a flat list of messages.
Scans the message list for messages that carry todo arrays (as emitted by agentic coder backends) and returns all todo items in order.
Example
{:ok, messages} = BeamAgent.SessionStore.get_session_messages(session_id)
todos = BeamAgent.Todo.extract_todos(messages)
@spec filter_by_status([todo_item()], todo_status()) :: [todo_item()]
Filter a todo list by status.
Returns only the todo items whose :status matches status.
Example
pending = BeamAgent.Todo.filter_by_status(todos, :pending)
completed = BeamAgent.Todo.filter_by_status(todos, :completed)
@spec todo_summary([todo_item()]) :: %{ :total => non_neg_integer(), required(atom()) => non_neg_integer() }
Summarize a todo list as a count map.
Returns a map with :total and one key per distinct status (:pending,
:in_progress, :completed), giving counts at a glance.
Example
%{total: 5, pending: 2, in_progress: 1, completed: 2} =
BeamAgent.Todo.todo_summary(todos)