This is a historical map of Codex session rollout files under
~/.codex/sessions/YYYY/MM/DD/rollout-*.jsonl.
For the broader app-level state, event, and troubleshooting guide, see tracking-and-debugging.md.
Checked against the Codex source on 2026-05-16. Nectus task agents now run through ACP chat, so the app no longer tails Codex rollout JSONL for task attention, activity, idle, or resume metadata. The broader event catalog below is an external snapshot, so treat it as point-in-time — Codex can add or rename event types.
Paths below are relative to the Codex repository root.
codex-rs/protocol/src/protocol.rsRolloutLineRolloutItemEventMsgSessionMetaLineTurnContextItemCompactedItem
codex-rs/protocol/src/items.rsTurnItem
codex-rs/protocol/src/models.rsResponseItem
codex-rs/rollout/src/policy.rs- which
RolloutItem,ResponseItem, andEventMsgvariants are persisted
- which
codex-rs/rollout/src/recorder.rs- writer for session rollout JSONL
Generated TypeScript protocol files can help when building UI models, but the session JSONL source of truth is the Rust protocol plus rollout persistence policy.
Each line is a RolloutLine: a timestamp plus a flattened RolloutItem.
{
"timestamp": "2026-05-16T12:00:00.000Z",
"type": "event_msg",
"payload": {
"type": "task_complete",
"turn_id": "turn-id",
"last_agent_message": "Done"
}
}These are the possible RolloutItem values.
JSON type |
Rust variant | Purpose | Persisted |
|---|---|---|---|
session_meta |
RolloutItem::SessionMeta |
Session identity and environment metadata. Usually the first line. | Yes |
response_item |
RolloutItem::ResponseItem |
Raw model/conversation/tool history item. Used for replay/resume. | Some variants |
compacted |
RolloutItem::Compacted |
Compaction summary plus optional replacement history. | Yes |
turn_context |
RolloutItem::TurnContext |
Per-turn durable context: cwd, model, sandbox, approvals, instructions, date/timezone. | Yes |
event_msg |
RolloutItem::EventMsg |
Runtime event emitted by Codex. task_complete lives here. |
Some variants |
These appear as type: "response_item" with a nested payload.type.
Persisted by default:
messagereasoninglocal_shell_callfunction_calltool_search_callfunction_call_outputtool_search_outputcustom_tool_callcustom_tool_call_outputweb_search_callimage_generation_callcompactioncontext_compaction
Defined but not persisted by rollout policy:
compaction_triggerother
These appear as type: "event_msg" with a nested payload.type.
These are written in the default limited persistence mode.
JSON payload.type |
Rust variant | Notes |
|---|---|---|
user_message |
EventMsg::UserMessage |
User/system input sent to the model. |
agent_message |
EventMsg::AgentMessage |
Agent text output. |
agent_reasoning |
EventMsg::AgentReasoning |
Reasoning summary event. |
agent_reasoning_raw_content |
EventMsg::AgentReasoningRawContent |
Raw reasoning content when enabled. |
patch_apply_end |
EventMsg::PatchApplyEnd |
Patch application completed. |
token_count |
EventMsg::TokenCount |
Running usage/context count. |
thread_goal_updated |
EventMsg::ThreadGoalUpdated |
Goal metadata changed. |
context_compacted |
EventMsg::ContextCompacted |
Conversation context compacted. |
entered_review_mode |
EventMsg::EnteredReviewMode |
Review mode started. |
exited_review_mode |
EventMsg::ExitedReviewMode |
Review mode ended. |
mcp_tool_call_end |
EventMsg::McpToolCallEnd |
MCP call completed. |
thread_rolled_back |
EventMsg::ThreadRolledBack |
Thread history rollback completed. |
turn_aborted |
EventMsg::TurnAborted |
Turn was interrupted/aborted. |
task_started |
EventMsg::TurnStarted |
Legacy v1 wire name. Also accepts alias turn_started. |
task_complete |
EventMsg::TurnComplete |
Legacy v1 wire name. Also accepts alias turn_complete. This is the current best idle signal. |
web_search_end |
EventMsg::WebSearchEnd |
Web search completed. |
image_generation_end |
EventMsg::ImageGenerationEnd |
Image generation completed. |
item_completed |
EventMsg::ItemCompleted |
Persisted only when the completed item is a plan. |
These are defined, but rollout policy only writes them when the recorder is in extended persistence mode.
errorguardian_assessmentexec_command_endview_image_tool_callcollab_agent_spawn_endcollab_agent_interaction_endcollab_waiting_endcollab_close_endcollab_resume_enddynamic_tool_call_requestdynamic_tool_call_response
These exist in EventMsg, but the rollout persistence policy returns None
for them in the checked Codex source.
warningguardian_warningrealtime_conversation_startedrealtime_conversation_realtimerealtime_conversation_closedrealtime_conversation_sdpmodel_reroutemodel_verificationagent_reasoning_section_breaksession_configuredmcp_startup_updatemcp_startup_completemcp_tool_call_beginweb_search_beginimage_generation_beginexec_command_beginexec_command_output_deltaterminal_interactionexec_approval_requestrequest_permissionsrequest_user_inputelicitation_requestapply_patch_approval_requestdeprecation_noticestream_errorpatch_apply_beginpatch_apply_updatedturn_diffrealtime_conversation_list_voices_responseplan_updateshutdown_completeraw_response_itemitem_startedhook_startedhook_completedagent_message_content_deltaplan_deltareasoning_content_deltareasoning_raw_content_deltacollab_agent_spawn_begincollab_agent_interaction_begincollab_waiting_begincollab_close_begincollab_resume_begin
Nectus no longer reads Codex rollout JSONL for task-agent state. Codex task work
uses the ACP provider descriptor in native/src/sessions/acp.rs; transcript,
activity, permission requests, usage, and process exit flow through
session_chat, session_chat_usage, session_chat_runtime, and
chat_session_exited.
Current behavior:
- No
session_idle,session_activity, orsession_needs_inputevents are emitted from Codex rollout JSONL. - No Codex rollout
session_metascan is used to resume task chats. ACP resume is based on the stored chat row'sacp_session_idplus provider support forsession/load. - The reference below remains useful when comparing older databases, older docs, or historical task-session behavior.
Important caveat: the checked Codex rollout policy says approval/input request
event_msg variants such as exec_approval_request, request_permissions,
request_user_input, and apply_patch_approval_request are defined but not
persisted by default. response_item function calls are persisted by default in
that historical protocol.
In sample Codex rollout files inspected for this snapshot, the observed top-level entry types were:
session_metaturn_contextresponse_itemevent_msg
Observed nested event_msg payload types:
agent_messageitem_completedmcp_tool_call_endpatch_apply_endtask_completetask_startedtoken_countturn_aborteduser_messageweb_search_end
Observed nested response_item payload types:
custom_tool_callcustom_tool_call_outputfunction_callfunction_call_outputmessagereasoningweb_search_call
High-confidence signals from default JSONL:
- Idle/done:
event_msg.payload.type == "task_complete" - Active turn started:
task_started - Interrupted/aborted:
turn_aborted - User input needed:
response_item.payload.type == "function_call"andresponse_item.payload.name == "request_user_input" - Token/context usage:
token_count - User and assistant transcript:
user_message,agent_message,response_item.message - Patch completion:
patch_apply_end - Web search completion:
web_search_end - MCP completion:
mcp_tool_call_end - Context changes:
turn_context,context_compacted,compacted
Needs verification before relying on it:
- Approval waiting state from JSONL.
- Permission request state from JSONL.
- Live command output from JSONL.
- Streaming deltas from JSONL.
For those lower-confidence states, Nectus may need either Codex extended rollout persistence, a different Codex event stream, or a wrapper/API integration instead of relying only on persisted rollout JSONL.