Menu bar-приложение для поиска по сессиям Claude Code
Как разработчики строят macOS menu bar-приложения для мониторинга и поиска по сессиям Claude Code и Codex — архитектура, фичи и практические советы.
Проблема: хаос из десятков сессий Claude Code
Представьте: у вас открыто 10+ вкладок в терминале, в каждой работает отдельная сессия Claude Code или Codex. Вы пишете код сразу в нескольких проектах, переключаетесь между Ghostty и Zed, и не знаете, какая сессия уже завершила задачу, а какая застряла в ожидании разрешения.
Именно в такой ситуации оказался разработчик, запускавший 10+ сессий Claude Code в разных терминалах — постоянно переключаясь между ними, чтобы проверить, какая ждёт разрешения, а какая завершила работу. Это быстро надоедает.
Существующие инструменты мониторинга требовали запускать сессии прямо из их интерфейса, что полностью меняло привычный воркфлоу. Хотелось сохранить свои терминалы и просто получать информацию о происходящем.
Так рождается класс инструментов — macOS menu bar-приложения для мониторинга, поиска и управления сессиями AI-ассистентов. В этой статье разберём архитектуру таких решений, реальные реализации и технические подходы, которые делают их эффективными.
Что умеют современные menu bar-приложения для Claude Code
Экосистема инструментов мониторинга Claude Code за последние месяцы резко выросла. Рассмотрим ключевые проекты и их возможности.
c9watch — мониторинг на уровне ОС
c9watch — нативное macOS menu bar-приложение, которое автоматически обнаруживает каждую запущенную на вашей машине сессию Claude Code.
Никаких плагинов, никакой настройки — приложение сканирует процессы на уровне ОС, поэтому работает с любым терминалом или IDE, которые вы уже используете.
Сессии группируются по статусу — Working, Needs Permission, Idle, Done — запросы на разрешение всплывают наверх. Можно также группировать по проекту (с информацией о git-ветке), раскрывать любую сессию для чтения полного разговора, останавливать или переименовывать сессии и прыгать прямо в родительский терминал.
Claudoscope — полноценная аналитика и поиск
Claudoscope — нативное macOS menu bar-приложение для изучения, анализа и управления сессиями Claude Code. Работает полностью в реальном времени, без телеметрии, 100% локально.
Приложение предоставляет полнотекстовый поиск по сообщениям, thinking-блокам, входам и результатам инструментов, с автоматическим раскрытием совпадающих свёрнутых блоков.
Отдельно стоит отметить функцию безопасности: приложение автоматически обнаруживает утечки API-ключей, токенов и других credentials в ваших сессиях.
ClaudeBar и CodexBar — мониторинг квот
ClaudeBar — macOS menu bar-приложение для мониторинга квот использования AI-ассистентов, поддерживающее Claude, Codex, Gemini, GitHub Copilot, Antigravity, Z.ai, Kimi, Kiro и Amp.
CodexBar хранит сессионные и недельные лимиты (а также кредиты) в menu bar, чтобы вы всегда знали, когда безопасно деплоить.
Сравнительная таблица инструментов
| Инструмент | Поиск по сессиям | Мониторинг квот | Аналитика стоимости | Open Source | Цена |
|---|---|---|---|---|---|
| c9watch | ✅ | ❌ | ✅ | ✅ MIT | Бесплатно |
| Claudoscope | ✅ | ❌ | ✅ | ✅ MIT | Бесплатно |
| ClaudeBar | ❌ | ✅ | ❌ | ✅ | Бесплатно |
| CodexBar | ❌ | ✅ | ❌ | ✅ | Бесплатно |
| SessionWatcher | ❌ | ✅ | ✅ | ❌ | от $2.99 |
| claude-statistics | ✅ | ✅ | ✅ | ✅ | Бесплатно |
Архитектура: как это работает изнутри
Понять, как устроены эти приложения — значит научиться строить подобные инструменты самостоятельно. Разберём ключевые технические решения.
Где хранятся данные сессий
Все AI-ассистенты сохраняют данные локально в JSONL-файлах:
~/.claude/projects/ ← Claude Code сессии
~/.codex/projects/ ← Codex CLI сессии
~/.gemini/tmp/ ← Gemini CLI сессии
~/.claude/history.jsonl ← индекс сессий Claude Code
Claude Statistics автоматически обнаруживает и парсит сессии из ~/.claude/projects/ (Claude Code), ~/.codex/projects/ (Codex CLI) и ~/.gemini/tmp/ (Gemini CLI).
Каждый провайдер имеет собственный пайплайн парсинга и локальный кэш — переключение провайдеров не останавливает фоновую индексацию остальных.
Поиск по содержимому: умная индексация
c9watch читает ~/.claude/history.jsonl для индекса сессий, затем сканирует отдельные JSONL-файлы по всем директориям проектов для глубокого поиска. Логика извлечения текста тщательно различает пользовательские промпты и результаты инструментов — индексируется только то, что реально набрал пользователь, что предотвращает шумные совпадения по метаданным.
Результаты поиска ведут обратно в просмотрщик разговоров с подсветкой найденных совпадений и прокруткой до нужного места.
Расчёт стоимости и токены
Метаданные сообщений ассистента в JSONL-файлах содержат информацию об использовании модели и количестве токенов. Калькулятор стоимости использует таблицы цен по каждой модели и кэширует результаты по времени изменения файла — неизменённые сессии никогда не пересканируются.
Это важный момент для понимания нюансов:
Одна из сложностей: идентификаторы моделей Anthropic включают суффиксы дат, например claude-sonnet-4-5-20250929. При поиске цен эти суффиксы нужно нормализовать, убирая их перед сопоставлением с таблицей тарифов.
Технологии реализации: Tauri vs. SwiftUI
Tauri обеспечивает нативный бинарник с минимальными накладными расходами — Rust обрабатывает тяжёлые задачи (сканирование процессов, парсинг JSONL) на нативной скорости, а Svelte компилирует фреймворк, убирая лишние издержки на фронтенде.
Альтернативный подход — чистый Swift/SwiftUI: нативное macOS menu bar-приложение, построенное целиком на Swift и SwiftUI, предлагает чистый интуитивный интерфейс для отслеживания 5-часового сессионного окна, недельных лимитов использования и специфичного потребления Opus.
Как работает menu bar-попоувер на macOS
Реализация UI имеет свои тонкости. Вот как правильно сделать, чтобы панель отображалась корректно:
Menu bar-попоувер использует macOS NSPanel со специфическими коллекционными поведениями — full_screen_auxiliary(), can_join_all_spaces(), stationary() — чтобы панель появлялась поверх полноэкранных приложений.
Claudoscope мониторит ~/.claude/projects/ с помощью macOS FSEvents для практически мгновенного обнаружения изменений в JSONL-файлах сессий. Обновления парсятся инкрементально и отображаются в интерфейсе в реальном времени. Никакого поллинга, никакого серверного процесса, никаких сетевых запросов.
При запуске выполняется однократное сканирование для построения начального индекса проектов и сессий. Затем перепарсируются только изменённые файлы, а распарсенные сессии хранятся в LRU-кэше (ёмкость 20) для мгновенного повторного доступа.
graph TD
A[Запуск приложения] --> B[Сканирование ~/.claude/projects/]
B --> C[Построение индекса сессий]
C --> D[FSEvents: наблюдение за JSONL]
D --> E{Изменение файла?}
E -->|Да| F[Инкрементальный парсинг]
E -->|Нет| D
F --> G[Обновление LRU-кэша]
G --> H[Обновление UI в реальном времени]
H --> D
style A fill:#6366f1,color:#fff
style H fill:#10b981,color:#fff
Как построить собственное приложение: пошаговый подход
Если хотите создать свой инструмент — вот минимальная архитектура.
Шаг 1: Настройка проекта
Для Tauri-подхода:
# Установка Tauri CLI
cargo install tauri-cli
# Создание проекта
npm create tauri-app@latest my-claude-monitor
cd my-claude-monitor
# Запуск в режиме разработки
npm run tauri dev
Для нативного Swift (через Tuist, как в ClaudeBar):
# Установка Tuist
brew install tuist
# Клонирование и сборка
git clone https://github.com/tddworks/ClaudeBar.git
cd ClaudeBar
tuist install
tuist generate
open ClaudeBar.xcworkspace
Шаг 2: Парсинг JSONL-файлов сессий
use std::fs;
use std::path::Path;
use serde_json::Value;
fn parse_session_file(path: &Path) -> Vec<String> {
let content = fs::read_to_string(path).unwrap_or_default();
let mut user_messages = Vec::new();
for line in content.lines() {
if let Ok(entry) = serde_json::from_str::<Value>(line) {
// Индексируем только пользовательские промпты,
// не результаты инструментов
if entry["type"] == "human" {
if let Some(text) = entry["content"].as_str() {
user_messages.push(text.to_string());
}
}
}
}
user_messages
}
Шаг 3: Наблюдение за файлами
import Foundation
class SessionWatcher {
private var fileDescriptor: Int32 = -1
private var source: DispatchSourceFileSystemObject?
func watch(path: String, onChange: @escaping () -> Void) {
let url = URL(fileURLWithPath: path)
fileDescriptor = open(url.path, O_EVTONLY)
source = DispatchSource.makeFileSystemObjectSource(
fileDescriptor: fileDescriptor,
eventMask: [.write, .rename, .delete],
queue: .main
)
source?.setEventHandler { onChange() }
source?.resume()
}
}
mtime файла: если файл не изменился с момента последнего сканирования, пропускайте его. Это радикально снижает нагрузку на CPU при большом количестве сессий.Безопасность и приватность: критически важные аспекты
При работе с сессиями AI-ассистентов в данных могут оказаться чувствительные данные.
Claudoscope включает обнаружение секретов — сканирование сессий на предмет утечки credentials с энтропийной фильтрацией.
Claudoscope обнаруживает утечки credentials внутри файлов сессий Claude Code и предупреждает в реальном времени. Сканируется 10 паттернов через полную историю сессий: токены платформ (GitHub PAT/OAuth, OpenAI, Anthropic, Stripe, Slack, npm, Google, SendGrid, Shopify, DigitalOcean, Linear, PyPI, HuggingFace, Azure, Vault, Docker).
Что касается общего подхода к приватности:
Никакого сбора данных. Никакой аналитики. Ваши данные об использовании остаются на вашей машине — всегда.
Экосистема: кто что использует
Современные menu bar-приложения предлагают мониторинг нескольких провайдеров, включение/отключение отдельных провайдеров, отслеживание квот в реальном времени (сессионных, недельных, по моделям), множество тем оформления и визуальные индикаторы состояния с цветовым кодированием.
Наиболее продвинутые решения предлагают permission cards прямо в интерфейсе — Claude Code PermissionRequest hooks превращаются во встроенные карточки Allow/Deny, решения записываются обратно через протокол хуков, без переключения в терминал.
Лучший инструмент мониторинга — тот, что не нарушает ваш воркфлоу: живёт в menu bar, не требует изменений в том, как вы запускаете сессии, и показывает нужную информацию по одному взгляду.
Интересный факт: AI строит инструменты для AI
c9watch был построен с помощью самого Claude Code. Большая часть Rust-бэкенда и Svelte-фронтенда создавалась с помощью AI: разработчик описывал что нужно, проверял результат, тестировал и итерировал. Архитектурные решения (Tauri вместо Electron, сканирование на уровне ОС, стратегия парсинга JSONL) принимались человеком, а Claude Code выполнял тяжёлую работу реализации.
Это хороший пример рекурсивного использования AI — когда инструмент разработки создаётся с помощью того же инструмента, который он призван обслуживать.
Заключение
Menu bar-приложения для мониторинга сессий Claude Code и Codex решают реальную проблему современного AI-разработчика: управление множеством параллельных агентных сессий без потери контекста и нарушения воркфлоу.
Ключевые takeaways:
- Данные уже есть — все сессии хранятся локально в JSONL, нужно лишь научиться их читать
- Правильная архитектура: FSEvents вместо поллинга, LRU-кэш, инкрементальный парсинг
- Безопасность важна: сканируйте свои же сессии на утечки credentials
- Open source побеждает: лучшие инструменты — бесплатные и с открытым кодом
- Tauri или нативный Swift — правильный выбор для минимального footprint
Если вы работаете с Claude Code профессионально и ведёте несколько параллельных сессий — установите один из описанных инструментов. Это займёт 5 минут и сэкономит часы переключений между вкладками терминала.