agent:<agentId>:<mainKey> (デフォルトのメインキーは main) に集約されますが、グループチャットや各チャネルの固有チャットはそれぞれ独立したキーを持ちます。
session.dmScope 設定を使用して、ダイレクトメッセージ のグループ化方法を制御できます:
main(デフォルト): すべての DM がメインセッションを共有し、デバイスを跨いでも会話が継続されます。per-peer: 送信者 ID ごとに、チャネルを跨いでセッションを分離します。per-channel-peer: チャネル + 送信者の組み合わせごとに分離します(複数人で 1 つのボットを共有する場合に推奨)。per-account-channel-peer: アカウント + チャネル + 送信者の組み合わせごとに分離します。
session.identityLinks を使用して、異なるチャネルのユーザー ID を 1 つの「正規のアイデンティティ」に紐付けることができます。これにより、同じユーザーであればチャネルが変わっても同じ DM セッションを継続できるようになります。
セキュア DM モード (複数人での利用時に推奨)
セキュリティ警告: エージェントが 複数のユーザー から DM を受け取る可能性がある場合は、セキュア DM モードの有効化を強く検討してください。無効な場合、すべてのユーザーが同じ会話コンテキストを共有することになり、プライベートな情報が他のユーザーに漏洩するリスクがあります。デフォルト設定で発生しうる問題の例:
- アリスがエージェントにプライベートな相談(例: 通院の予約)を送信します。
- その後、ボブが同じエージェントに「さっきは何の話をしていた?」と尋ねます。
- すべての DM が同じセッションを共有しているため、エージェントはアリスとの会話内容を元にボブに回答してしまいます。
dmScope を設定して、ユーザーごとにセッションを分離します。
- 複数の送信者に対してペアリングを承認している。
- 複数のエントリを持つ DM 許可リストを使用している。
dmPolicy: "open"(誰でも許可) を設定している。- 複数の電話番号やアカウントがエージェントにメッセージを送信できる。
- 1 人だけで利用する場合は、継続性を重視したデフォルトの
dmScope: "main"のままで問題ありません。 - ローカル CLI でのオンボーディング時、未設定であればデフォルトで
session.dmScope: "per-channel-peer"が書き込まれます。 - 同じチャネルで複数のアカウントを運用している場合は、
per-account-channel-peerが最適です。 openclaw security auditコマンドで現在の DM 設定の安全性を確認できます。
ゲートウェイが「真実のソース」
すべてのセッション状態は ゲートウェイが所有 します。UI クライアント(macOS アプリ、WebChat、TUI など)は、ローカルファイルを直接読み取るのではなく、ゲートウェイに問い合わせてセッション一覧やトークン数を取得します。- リモートモード の場合、セッションデータはローカルの Mac ではなく、接続先のリモートホスト上に存在します。
- UI に表示されるトークン数はゲートウェイのデータに基づきます。クライアント側で JSONL 履歴を解析して計算し直すことはありません。
データの保存場所
- ゲートウェイホスト上:
- 管理ファイル:
~/.openclaw/agents/<agentId>/sessions/sessions.json(エージェントごと)。 - 会話履歴(JSONL):
~/.openclaw/agents/<agentId>/sessions/<SessionId>.jsonl。
- 管理ファイル:
- 管理ファイルは
sessionKey -> { sessionId, updatedAt, ... }のマップ構造です。このファイル内のエントリを削除しても安全です(必要に応じて再作成されます)。 - 履歴ファイルには、UI での識別のために
displayName,channel,subjectなどのメタデータが含まれる場合があります。 - OpenClaw は、古い Pi や Tau のセッションフォルダを読み込むことはありません。
メンテナンス (クリーンアップ)
OpenClaw は、sessions.json や履歴ファイルが際限なく増え続けるのを防ぐため、自動的なメンテナンス機能を備えています。
デフォルト設定
- 保持期間: 30 日間 (
pruneAfter: "30d") - 最大件数: 500 件 (
maxEntries: 500) - ローテーション: 10MB を超えたら
sessions.jsonを新しくする (rotateBytes: "10mb") - ディスク容量制限: デフォルトでは無効 (
maxDiskBytes)
仕組み
セッションの書き込み時にメンテナンスが実行されます。openclaw sessions cleanup コマンドで手動実行も可能です。
mode: "warn"(デフォルト): 削除対象となるエントリを報告するだけで、実際の削除は行いません。mode: "enforce": 以下の順序で実際にクリーンアップを行います:- 保持期間を過ぎた古いエントリを削除。
- 上限件数を超える古いエントリを削除。
- 参照されなくなった履歴ファイルをアーカイブ。
- 構成されたディスク容量予算 (
maxDiskBytes) を守るよう、古いものから順に削除。
転送手段(トランスポート)とセッションキーの紐付け
- ダイレクトチャット:
session.dmScopeに従います。main:agent:<agentId>:<mainKey>。複数の電話番号やチャネルが 1 つのメインセッションに紐付き、単一の会話として機能します。per-peer:agent:<agentId>:dm:<peerId>。per-channel-peer:agent:<agentId>:<channel>:dm:<peerId>。
- グループチャット: チャネルごとに独立した状態を持ちます。
- 形式:
agent:<agentId>:<channel>:group:<id>(ルームの場合は...:channel:<id>)。 - Telegram のトピック(フォーラム)機能では、グループ ID に
:topic:<threadId>が付加され、トピックごとに分離されます。
- 形式:
- その他のソース:
- Cron ジョブ:
cron:<job.id> - Webhook:
hook:<uuid> - ノード実行:
node-<nodeId>
- Cron ジョブ:
ライフサイクルとリセット
- リセットポリシー: セッションは有効期限が切れるまで再利用されます。期限切れの判定は、次にメッセージが届いた際に行われます。
- 日次リセット: デフォルトは ゲートウェイホストの現地時間で午前 4:00 です。前回の更新がこの時間を跨いでいる場合、新しいセッション ID が発行されます。
- アイドルリセット:
idleMinutesを設定することで、一定時間操作がない場合にリセットできます。日次リセットと併用した場合、どちらか早い方のタイミングでリセットされます。 - リセットトリガー:
/newまたは/resetメッセージを送ると、即座に新しいセッションが開始されます。/new <モデル名>のように指定して、新しいセッションで使用するモデルを変更することも可能です。 - 手動リセット:
sessions.jsonから特定のエントリを削除するか、JSONL ファイルを削除することで、強制的にリセットできます。
送信ポリシー (Send Policy)
特定のセッションタイプ(例: Discord のグループチャットのみ等)に対して、一括で送信を制限できます。/send on→ このセッションでの送信を許可。/send off→ このセッションでの送信を拒否。/send inherit→ 上書きを解除し、構成ファイルの設定に従う。
検査とデバッグ
openclaw status: ストアのパスと最近のセッションを表示します。openclaw sessions --json: すべてのエントリをダンプします。- チャットで
/statusを送る: エージェントの到達可能性、コンテキストの消費量、現在の設定などを確認できます。 - チャットで
/context listを送る: システムプロンプトに含まれる内容や、消費量の多い要因を確認できます。 - チャットで
/stopを送る: 現在の実行を中止し、キューに溜まったメッセージをクリアします。 - チャットで
/compactを送る: 古い履歴を要約して、コンテキストウィンドウの空きを増やします。詳細は 圧縮(コンパクション) を参照してください。