0.4.11
21 · Техническая документация

21. Формат rollout (JSONL)

Rollout — это полный лог одной сессии в формате JSONL. Каждая строка — один JSON-объект. Файл append-only: события дописываются по мере turn'а. Используется для:

  • /resume <id> — восстановление сессии.
  • Воспроизведения для отладки.
  • Источник для Phase 1 памяти (см. 07-memories.md).
  • Аудита.

Реализация — крейт rollout/. Расширенная версия — rollout-trace/.

1. Файл

Имя

text
rollout-YYYY-MM-DDThh-mm-ss-<uuid>.jsonl

Создаётся в rollout/src/recorder.rs:1372-1393.

Путь

text
~/.astracode/sessions/YYYY/MM/DD/rollout-<timestamp>-<uuid>.jsonl

Архивированные (/archive через UI) переезжают в:

text
~/.astracode/archived_sessions/rollout-<timestamp>-<uuid>.jsonl

См. rollout/src/lib.rs:21-22.

Версионирование

Версия схемы хранится в SessionMeta.timestamp неявно (формат RFC3339 указывает дату); явного поля schema_version пока нет. Обратная совместимость обеспечивается через serde(default) на новых полях.

2. Структура

Первая строка — session_meta

jsonl
{
  "timestamp": "2026-06-01T10-23-45.123Z",
  "item": {
    "type": "session_meta",
    "meta": {
      "id": "9e3b4f12-...-abc",
      "forked_from_id": null,
      "timestamp": "2026-06-01T10:23:45.123Z",
      "cwd": "/home/timur/work/myproject",
      "originator": "astracode-cli/0.4.11",
      "cli_version": "0.4.11",
      "agent_nickname": "cli",
      "agent_role": "assistant",
      "agent_path": null,
      "source": "cli",
      "model_provider": "openai",
      "base_instructions": {...},
      "dynamic_tools": [...]
    },
    "git": {
      "commit_hash": "abc123def",
      "branch": "main",
      "repository_url": "https://github.com/..."
    }
  }
}

Поля SessionMeta см. в protocol/src/protocol.rs (тип SessionMeta).

Последующие строки — RolloutItem

rust
pub enum RolloutItem {
    SessionMeta(SessionMetaLine),   // только первая запись
    ResponseItem(ResponseItem),     // сообщение пользователя/ассистента или tool call
    Compacted(CompactedSummary),    // итог compact'а
    TurnContext(TurnContextLine),   // snapshot контекста turn'а
    EventMsg(EventMsg),             // обёрнутое событие из протокола (turn start/end, tool begin/end, ...)
}

Каждая строка имеет timestamp и поле item.type (или payload.type для event_msg):

jsonl
{"timestamp":"...", "type":"response_item", "payload":{...}}
{"timestamp":"...", "type":"event_msg", "payload":{"type":"user_message","message_id":"msg_123","text":"hello"}}
{"timestamp":"...", "type":"turn_context", "payload":{...}}
{"timestamp":"...", "type":"compacted", "payload":{...}}

3. Типы событий

session_meta

Только в начале файла. Описана выше.

response_item

Один элемент истории — сообщение, reasoning, tool call, tool output.

json
{
  "type": "response_item",
  "payload": {
    "type": "message",          // message | reasoning | function_call | function_call_output | ...
    "id": "msg_abc",
    "role": "user",             // user | assistant | system | developer
    "content": [
      { "type": "input_text", "text": "Fix the failing test." }
    ]
  }
}

Полный набор типов в astracode_protocol::models::ResponseItem.

event_msg

Обёрнутые события протокола (стримятся в TUI и пишутся в rollout).

payload.type Когда
turn_started Старт turn'а
user_message User отправил сообщение
assistant_message_delta Кусок текста ассистента (стрим)
assistant_message Финальное сообщение ассистента
reasoning_start / reasoning_delta / reasoning_end Extended thinking блок
tool_use_start Модель начала вызов tool'а
tool_use_end Tool завершён с output
exec_command_start / exec_command_output / exec_command_end Подробности shell exec
apply_patch_begin / apply_patch_updated / apply_patch_end Применение патчей
mcp_tool_call_begin / _end MCP-вызовы
approval_request / approval_response Процесс подтверждения
model_switch / model_rerouted Смена модели или fallback
goal_updated / goal_status_changed Изменение цели
compacted Произошёл compact
turn_complete Turn закончен (с финальным last_agent_message)
turn_aborted Turn прерван (с reason)

Полный список — astracode_protocol::protocol::EventMsg.

turn_context

Snapshot конфигурации turn'а: модель, reasoning_effort, permission_profile, environments, доступные tools. Пишется при старте каждого turn'а.

json
{
  "type": "turn_context",
  "payload": {
    "model": "gpt-5",
    "reasoning_effort": "medium",
    "cwd": "/home/timur/work/myproject",
    "approval_policy": "on-failure",
    "permission_profile": "default",
    "environments": [...]
  }
}

compacted

Итог /compact — резюме, заменившее старую историю.

json
{
  "type": "compacted",
  "payload": {
    "summary": "...",
    "replaced_turn_count": 18,
    "original_tokens": 142000,
    "summary_tokens": 4200
  }
}

4. Запись на диск

Реализация: rollout/src/recorder.rs:1463-1515.

  • Асинхронно: команды отправляются в MPSC канал (256 слотов).
  • Буферизация: AddItems накапливаются в pending_items, пишутся одним write_all() + flush() либо при explicit flush()/persist(), либо после каждого batch'а.
  • Восстановление: при ошибке записи writer закрывает файл, переоткрывает и повторяет.

API: - record_items(items) — не ждёт результата. - flush() — ждёт окончания записи всех pending. - persist() — то же + sync to disk.

5. Чтение

Полная загрузка

rust
let items = RolloutRecorder::load_rollout_items(path).await?;

rollout/src/recorder.rs:854-921 — построчно парсит JSON и собирает Vec<RolloutItem>.

Для resume

rust
let history = RolloutRecorder::get_rollout_history(path).await?;
// → InitialHistory::Resumed(ResumedHistory { conversation_id, items })

rollout/src/recorder.rs:923-938.

Listing

  • Файловый scan: рекурсивно по ~/.astracode/sessions/.
  • Через state DB: list_threads_db() использует индекс из threads таблицы (быстрее для большого числа сессий). См. 23-state-db.md.

6. Расширенный трейсинг (rollout-trace)

Крейт rollout-trace/ — параллельная система, пишущая trace bundle (директория с дополнительным JSONL + сырыми payload-файлами):

  • Используется для multi-agent (агенты v2), code-mode cells, remote compaction.
  • Детальный реплей с reduced state.
  • Тут — отдельные события (RolloutStarted, InferenceStarted, ToolCallStarted, CodeCellStarted, CompactionRequestStarted, AgentResultObserved и т.п.).

См. rollout-trace/src/raw_event.rs:68-226 для полного списка:

text
RolloutStarted, RolloutEnded,
ThreadStarted, ThreadEnded,
AstraCodeTurnStarted, AstraCodeTurnEnded,
InferenceStarted, InferenceCompleted, InferenceFailed, InferenceCancelled,
ToolCallStarted, ToolCallRuntimeStarted/Ended, ToolCallEnded,
CodeCellStarted, CodeCellInitialResponse, CodeCellEnded,
CompactionRequestStarted/Completed/Failed,
CompactionInstalled,
AgentResultObserved,
ProtocolEventObserved (обёрнутые UI события),
Other (произвольный payload для расширений)

Включается через rollout_trace_enabled в конфиге (или для всех сессий — в core defaults).

7. Полезные команды

bash
# Найти rollout текущей сессии (debug-режим TUI)
/rollout

# Снаружи — список сессий за день
ls ~/.astracode/sessions/2026/06/01/

# Просмотреть JSONL
jq -c . ~/.astracode/sessions/2026/06/01/rollout-*.jsonl | head -20

# Поиск всех user-сообщений
jq -c 'select(.type=="event_msg" and .payload.type=="user_message") | .payload.text' \
   ~/.astracode/sessions/2026/06/01/rollout-*.jsonl

# Время длительности turn'ов
jq -c 'select(.type=="event_msg" and (.payload.type=="turn_started" or .payload.type=="turn_complete")) | [.timestamp, .payload.type]' \
   ~/.astracode/sessions/2026/06/01/rollout-*.jsonl

8. Размер и ротация

Rollouts могут быстро расти (особенно при extended thinking и подробных tool output'ах). Типично: - Короткая сессия (1-2 turn'а): 5-50 KB. - Средняя (10-30 turn'ов): 100-500 KB. - Длинная (с большим контекстом, многими tool calls): 5-50 MB.

Ротация — нет. Файлы хранятся, пока пользователь не удалит вручную:

bash
find ~/.astracode/sessions -mtime +90 -delete

Архивирование (через /archive) перемещает в archived_sessions/, но не удаляет.

9. Безопасность

  • Содержимое rollout не шифруется.
  • Сюда попадают полные user prompts, code контент, command output (включая случайные секреты, если они проходили через terminal).
  • Сюда НЕ попадают: API-ключи (они никогда не отдаются модели), пароли из secrets/local.age.
  • При передаче rollout кому-то — просматривайте на наличие чувствительной информации.

10. Совместимость

Версия AstraCode Rollout формат Чтение старых
0.4.x Текущий Да
0.3.x (codex upstream) Близкий, но без goal, dynamic_tools полей Да (через serde(default))
Старые codex pre-0.3 Возможны несовместимости Best effort

11. Файлы

  • rollout/src/lib.rs — публичный API.
  • rollout/src/recorder.rs — реализация writer'а.
  • protocol/src/protocol.rsRolloutItem, EventMsg.
  • rollout-trace/src/raw_event.rs — расширенные trace events.