session.append は、会話への行の追加処理そのものです。Claude Code 本体は会話に行を追加するとき、必ずこのイベントを1回発生させ、チェーンの最後で行を保存します。メインの会話でもサブエージェントの会話でも同じです(e.agentId で区別します)。進捗の行や、--resume などによる読み込みは追加ではないため、このイベントは発生しません。
| フィールド | 説明 |
|---|---|
door | 行の追加経路: prompt command response tool-result tool-message delivery attachment hook-context note compaction notice |
origin | 行の発生元(送信者、{ kind: 'model' }、{ kind: 'tool', tool }、Claude Code 本体、設定フック、プラグイン) |
uuid | transcript 上の id |
message | 行の本体。content 以外のフィールド(type name role isMeta)は変更できず、変更するとフックの失敗として扱われる |
- 書き換えられるのは、テキストブロック(編集、追加、削除、並べ替え)と、tool_result の
contentとis_errorである。画像とドキュメントのブロックは、削除と移動だけができる。 - thinking ブロック、tool_use ブロック、tool_result の id は、チェーンの最後で元の状態に戻される。
- Claude Code 本体が追加する行は拒否できない(
nextを呼ばずに値を返したフックはスキップされ、行は保存される)。拒否できるのは、プラグインが$.session.appendで追加しようとした行だけである。 - 画面、SDK のストリーム、Remote Control には書き換え前の行が一瞬表示されることがある。モデルと transcript ファイルには書き換え後の行だけが渡る。
on('session.append', { door: 'tool-result' }, ($, e, next) =>
next({ ...e, message: redact(e.message) }))
.catch(($, e, next) => next({ ...e, message: placeholderFor(e.message) }))
絞り込みの条件に一致する行がありません。