Skip to content

ライブストリーミング

まだ書き込み中のセッションを開くと、Chronicle がそれをリアルタイムで追尾します。AI が生成するそばから新しいメッセージが表示され、ライブインジケーターと自動再接続を備えています。

セッションのログファイルが直近 5 分以内に書き込まれた場合、Chronicle はそれを ライブ とみなしてストリームを接続します。AI ツールがログにやり取りを追記すると、それらは 1〜2 秒以内に Playback へ表示され、リロードは不要です。これは、Chronicle がツール自体と連携せずにディスクから増分的にログを読み取るために実現できます。そのため、実行中の Claude Code や Cursor のセッションを、動作させたまま追いかけることができます。他のすべてと同様、これもローカルで完結します。読み取りのみで、オリジナルには手を触れません。

セッションがライブになるタイミング

トリガーはシンプルでファイルベースです。ログファイルの更新時刻が直近 5 分 以内であれば、そのセッションは ライブ候補 です(server/live.jsisLiveCandidate())。そのようなセッションを開くと、クライアントは自動的に Server-Sent Events ストリームである GET /api/sessions/:id/live へ接続します。押すべきボタンはありません。新しさがそれを実現します。

表示される内容

  • 新しいメッセージがフェードインします。到着すると、すでに読み込まれている履歴とは視覚的に区別されて表示されます。
  • 最下部にいるときは自動スクロールします。末尾を追っている場合、ペインは最新メッセージに固定され続けます。
  • 「N new messages」ボタン が、何かを読むために上へスクロールしたときに表示されます。Chronicle は読んでいる箇所から強制的に引き離すことはしません。代わりにフローティングの ↓ N new messages ボタンが表示され、それをクリックする(または最下部まで戻る)と、最新へジャンプしてカウントがクリアされます。

ライブインジケーター

ステータスピルが接続状態を反映し、セッションを開いている間はアプリ全体で表示されます。

  • ● LIVE — 接続済みで追尾中。
  • Reconnecting — ストリームが切断され、Chronicle が再試行中。
  • Stopped — ストリームが終了した(ファイルが十分な時間静かになったか、再試行を使い切った)。

接続が切断されると、クライアントは 指数バックオフ(数回の試行で、それぞれ待ち時間が長くなる)で再試行し、新しいメッセージが到着した瞬間にリセットされます。最後の試行の後は Stopped に落ち着きます。セッションを閉じると、ウォッチャーは両端で停止します。クライアントは切断し、サーバーは最後の閲覧者が離れた時点でファイルウォッチャーを解体するため、バックグラウンドでポーリングを続けるものは何も残りません。

セッションがライブの間は、そのソースログの削除が無効化されます。まさに書き込み中のファイルを削除することはできません。

追尾の仕組み(2 つの戦略)

ツールごとにログの保存方法が異なるため、Chronicle は 2 つのウォッチャーを使い分けます。どちらも読み取り専用です。

  • JSONL 追尾(Claude Code、Codex)— Watcher はファイル末尾のバイトオフセットを記憶しておき、低コストな約 700 ms の stat ポーリングでファイルが大きくなったときに 新しい バイトだけを読み取り、追記された各行をメッセージへ解析します。切り詰められたファイルやローテーションされたファイルは先頭から読み直すことで処理し、解析できない行はストリームを壊さずにスキップします。
  • SQLite ポーリング(Cursor、OpenCode)— これらのツールは SQLite データベースへ書き込むため、SqlitePollWatcher読み取り専用の定期的な再解析 を行います。データベースファイルの更新時刻を監視し(WAL 対応 — -wal サイドカーも確認します。書き込みがそちらに着地してメイン側ファイルに触れないことがあるためです)、変化があると再解析して、前回認識した分より後のメッセージのみを送出します。パーサーは読み取り前にデータベースを一時コピーへスナップショットするため、ツールのライブデータベースを直接開いたり書き込んだりすることは決してありません。

どちらのウォッチャーも、約 2 分間の沈黙の後はポーリング間隔を緩め てアイドル状態のセッションで低コストを保ち、新しいコンテンツが現れた瞬間に再び速度を上げます。

Note: ライブメッセージはビューへ直接ストリーミングされ、格納済みのものと衝突しないように大きなシーケンス番号(1,000,000 から始まる)が付与されます。これらはセッションが再インポートされるまではクライアント内にのみ存在します。ストリーミングされたばかりのやり取りをデータベースへ永続化するには、Sync Update(⇧⌘U)を実行してください。

関連項目

Released under the MIT License.