Перейти к содержимому

Trajectory View: журнал траекторий

Model-visible means logged

Trajectory View в dsh — одна из самых прорывных и недооценённых инженерных функций платформы. В то время как обычные чат-ассистенты относятся к истории сообщений просто как к текстовому транскрипту для интерфейса, в dsh траектория является главным источником истины и фундаментом всей работы агента.

В основе этого механизма лежит строгий архитектурный принцип: «Model-visible means logged» (Всё, что видит модель, должно быть зафиксировано в журнале). Если какая-либо информация передаётся в контекстном окне модели, рантайм dsh обязан гарантировать, что он сможет на 100% восстановить её происхождение из локального лога.

Как это устроено под капотом

  • Durable Event Stream (Потоковый лог событий): любое действие — системные промпты, скрытые рассуждения модели (Chain of Thought), вызовы инструментов, результаты выполнения Bash-команд, ветвления и ручные одобрения пользователя — записывается хронологически в единый неизменяемый поток событий.
  • Хранение данных: по умолчанию сессии сохраняются локально на вашей машине в виде высокопроизводительной базы данных SQLite (оптимизированной для быстрого ветвления) или в виде .jsonl-файлов, сжатых алгоритмом Zstandard (session.jsonl.zstd), внутри директории $DSH_HOME/sessions/.
  • Жёсткий рантайм-контроль: при каждом обращении к LLM специальный системный инвариант (код валидации в invariant.ts) побайтово сверяет исходящий запрос к модели с функцией проекции лога deriveMessages(). Если обнаруживается расхождение (модель пытается «увидеть» то, чего нет в логе событий), система немедленно блокирует выполнение, предотвращая появление неконтролируемого контекста (галлюцинаций системы оркестрации).

Четыре суперсилы Trajectory View

Благодаря тому, что история работы агента — это не просто текст, а структурированная база данных состояний, разработчик получает в своё распоряжение четыре мощных инструмента отладки ИИ-агентов:

Resume (Возобновление)

Если во время выполнения сложной задачи (например, рефакторинга большого репозитория на 40-м шаге) у вас пропал интернет, отключилось электричество, упал процесс или вы исчерпали лимиты API, вам не нужно начинать всё сначала. dsh мгновенно восстанавливает рабочее окружение, состояние Bash-терминала и контекст модели из лога событий и продолжает работу ровно с той секунды, на которой произошёл обрыв.

Fork (Ветвление — «Машина времени»)

Самый полезный инструмент для отладки. ИИ-агенты склонны заходить в логический тупик: например, на 35-м шаге модель выбрала неверную библиотеку и начала бесконечно исправлять собственные ошибки компиляции. В обычной ситуации вам пришлось бы перезапустить чат и потерять весь прогресс. В Trajectory View вы можете:

  1. Открыть таймлайн и кликнуть на стабильный шаг 34 (до того, как всё пошло не так).
  2. Нажать кнопку Fork. dsh создаст точную копию базы данных состояния на этот момент, создав альтернативную ветку сессии.
  3. Скорректировать инструкции, при необходимости сменить модель (например, переключить выполнение с быстрой V4-Flash на мощную V4-Pro) и запустить выполнение по новому пути, сохранив исходную ветку для сравнения.

Search (Полнотекстовый поиск)

Используя встроенный модуль полнотекстового поиска SQLite FTS, dsh позволяет мгновенно находить конкретные системные ответы, выводы компилятора или файлы, которые модель читала 100 шагов назад, прямо внутри траектории сессии.

Replay (Воспроизведение)

Вы можете экспортировать лог траектории в формате .jsonl и использовать его как тестовый фикстур (снимок). Тестовый фреймворк dsh умеет запускать агента в режиме симуляции поверх этого лога, воссоздавая абсолютно все действия, что позволяет проводить детерминированные регрессионные тесты поведения агента при обновлении версий плагинов.

Что пользователь видит на экране

В графическом интерфейсе dsh (Web UI на порту 3080) траектория представлена в виде наглядного вертикального таймлайна, где каждое событие чётко типизировано и имеет цветовую кодировку по источнику:

  • System (Системные события): стартовые инструкции агента, правила проекта (например, содержимое файлов CLAUDE.md и AGENTS.md) и подробные JSON-схемы всех зарегистрированных плагинами инструментов.
  • Context (Контекстные инъекции): информация, которая динамически подмешивается в контекст на определённых шагах (например, текущее время, статус рабочей директории или запросы на подтверждение операций от пользователя).
  • User (Пользовательский ввод): ваши промпты, уточнения и команды корректировки, отправленные агенту в процессе диалога.
  • Assistant (Рассуждения модели):
    • Скрытый поток CoT: цепочки рассуждений (Chain of Thought), генерируемые моделями семейства DeepSeek (или Claude/OpenAI).
    • Финальный ответ: итоговый сгенерированный текст, который выводится пользователю.
  • Tool Calls & Results (Вызовы инструментов): полный отчёт о том, какую команду в терминале Bash запустил агент, какие аргументы передал, сколько секунд заняло выполнение и какой точный текст (stdout/stderr) вернула система.
Вкладка Trajectory в Web UI dsh: полоса событий по типам Input · Model · Tools, под ней список шагов сессии, справа — инспектор вызова инструмента
Вкладка Trajectory: слева таймлайн событий сессии, справа инспектор шага с payload, результатом, схемой инструмента и таймингами.

Обратная сторона медали: налог на токены и решение

Поскольку dsh маниакально фиксирует абсолютно всё, траектории длинных сессий быстро разрастаются. В сложных проектах один шаг может весить десятки тысяч токенов, что приводит к двум проблемам:

  1. Быстрое переполнение контекстного окна LLM.
  2. Высокие счета за API.

Как dsh решает эту проблему? Для этого в dsh предусмотрена автоматическая плагинная система сжатия лога — ctx.compaction (например, плагин @deepseek-ai/dsh-compaction-basic). Когда заполнение контекстного окна достигает порогового значения (например, 80%), dsh временно приостанавливает выполнение, запускает фоновую модель для суммаризации ранних этапов траектории, сжимает старую историю в лаконичные выводы (Summary) и заменяет ими тысячи строк лога, освобождая контекст для продолжения работы. Это позволяет сессиям оставаться жизнеспособными и логически связными даже при непрерывной автономной работе в течение нескольких часов.