2026-09-10 -- 会話圧縮中の進行表示
This content is not available in your language yet.
/compact(または CLI の自動圧縮)の最中、パネルは何も出さずに止まって見えた。
ステータスバーは「応答中…」のまま、会話欄には何も増えず、圧縮が終わって
system/compact_boundary が届くまで(長いと数十秒〜)固まっているように見える。
原因は CLI 側の出力の形にある。圧縮は「要約を作る 1 回の長い API 呼び出し」で、
その間 stream_event は一切流れない。パネルが圧縮を知る手段は、これまで
圧縮が終わった後に届く compact_boundary だけだった
(設計メモ 2026-09-07-slash-commands-and-compaction.md 第 2 節)。
シグナル: system/status
Section titled “シグナル: system/status”CLI は粗い活動状況を {"type":"system","subtype":"status","status":...} で流す
(Agent SDK の SDKStatusMessage)。実キャプチャ
(Tests/Editor/Fixtures/success_bidi_inbound.jsonl 3 行目)では API 呼び出しの直前に
"requesting" が出ており、SDK の型では "compacting" | null を取る。この
"compacting" が、圧縮の開始から compact_boundary までの間に届く唯一の行である。
これまで status サブタイプは InboundType.System(無視)に落ちていた。今回
SystemStatusMessage(InboundType.SystemStatus、AgentClient.StatusReceived)に
配線した。必須フィールドはなく、status が無い/null なら空文字で落とさない
(ProtocolMappingTests)。"compacting" 以外の値は「圧縮していない」と読むだけで、
他に何もしない。
ハブの状態: AgentHub.IsCompacting
Section titled “ハブの状態: AgentHub.IsCompacting”- ON:
system/statusの"compacting"。加えて、パネル自身が/compactを送った 瞬間(SendUserMessageでSlashCommandCatalog.TryParse+IsCompact)。後者は CLI の 対応に依存しないヒントで、status 行が来ない古い CLI でも、コマンドが解釈される前の 空白時間でも、送った直後から表示が出る。文中の/compactや/compactorは コマンド文法上コマンドではないので反応しない。 - OFF:
compact_boundary(圧縮の終わり)、明示的なクリア(statusが null / 欠落)、 ターンの終了経路すべて(result のOnTurnCompleted、サイレンス・バックストップ/ プロセス死/ティアダウンが通るAbortOpenTurn)、StartFresh/SwitchToSession/ResetForTests。 "requesting"などその他の値は無視する。"requesting"は API 呼び出しの直前に 毎回届き、圧縮の要約呼び出しの直前にも届き得る。これで OFF にすると、まさに待っている 最中に表示が消える(/compact送信側ヒントも同様に消えてしまう)。本当の「終わり」は boundary とターン終了であり、status に頼らない。状態が変わらない限りChangedも 発火しない(再描画コストを増やさない)。- ドメインリロードをまたいで永続化しない。リロード後は表示が消え、次の boundary か result で通常どおりに戻る(コンテキスト計と同じ「正直なフォールバック」)。
サイレンス・バックストップ(10 分)との関係: status 行自体が活動として記録されるが、
その後の圧縮本体は無通信になる。10 分を超える圧縮は想定外なので閾値は変えていない。
- ステータスバー (
StatusBarView):ShowCompactingState(IsCompacting, client.State)が 真(フラグ ON かつ Streaming / ToolRunning)のとき「コンテキスト圧縮中…」+ busy ドット。 Ready / WaitingPermission / Errored では各状態の文言が勝つ。純関数なのでテストで固定。 - 会話欄 (
ChatView): メッセージリストと許可カードの間に、スピナー (MessageBlockFactory.CreateSpinner、ツールカードと同じ)+ 一文の行.uap-compacting-rowをピン留めする。スクロール位置に関係なく見える。MessageListControllerの外に置いたのは意図的で、リストはメッセージ id で差分描画 しており、メッセージでない一時行を混ぜると増分パスすべてに特例が要るため。
文言は UiStrings.StatusCompacting / ChatCompactingIndicator(日英)。
EditMode: ProtocolMappingTests(compacting / 実キャプチャの requesting / null と欠落)、
CompactingIndicatorHubTests(実 AgentClient 経由で ON/OFF の全経路、/compact 送信、
ShowCompactingState のゲート)。このセッションには Unity も dotnet も無く、
スイートは未実行。CI(editmode-tests.yml)が検証。実 CLI での "compacting" 行の
キャプチャは未取得(SDK 型からのピン留め)。届かない CLI でも /compact 送信側の
ヒントで手動圧縮は表示され、自動圧縮は従来どおり boundary で初めて分かる。