yoi/tickets/protocol-design.md
2026-04-13 02:08:25 +09:00

85 lines
2.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Protocol の設計
## 背景
現状の Protocol (`Method` / `Event`) は最低限のストリーミングイベントのみ。
機能が増えるにつれ、以下が不足している:
- Compact 発生時のクライアント通知
- Permission の ask/reply フロー
- セッション切り替えcompact 後の新 session_id 通知)
- クライアント→Pod の制御拡張(設定変更等)
## 現状の Protocol
### Method (Client → Pod)
```rust
Method::Run { input }
Method::Resume
Method::Cancel
Method::GetHistory // request-responsesocket 層で直接応答)
```
### Event (Pod → Client)
```
TurnStart, TurnEnd, TextDelta, TextDone,
ToolCallStart, ToolCallArgsDelta, ToolCallDone, ToolResult,
Usage, RunEnd, Error, History
```
## 設計課題
### 1. Broadcast vs Request-Response の区別
現状:
- Event は全て broadcast channel 経由
- `GetHistory` だけ socket 層で直接応答(暗黙の request-response
課題:
- request-response が増えると socket_server の分岐が膨らむ
- クライアント側で「この Event は自分のリクエストへの応答」と判別できない
選択肢:
- **A. 現状維持**: request-response は socket 層で個別に処理。シンプルだがスケールしない
- **B. request_id パターン**: Method に optional `id` を持たせ、応答 Event に同じ `id` を含める
- **C. 型で分ける**: `Response` enum を Event とは別に定義
### 2. Compact イベント
TUI が compact の進行を表示するために必要:
```rust
Event::CompactStart // compact 開始
Event::CompactDone { new_session_id: String } // 成功
Event::CompactFailed { error: String } // 失敗
```
compact は Pod 内部で自律的に発火するので、broadcast で全クライアントに通知が自然。
CompactDone 後、クライアントは GetHistory で新しい history を取得できる。
### 3. セッション情報の通知
compact で session_id が変わる。クライアントに通知する方法:
- **CompactDone に含める**: `Event::CompactDone { new_session_id }`
- **汎用 SessionChanged イベント**: compact 以外でも session_id が変わるケースfork 等)に対応
### 4. Permission の ask/reply将来
permission-extension-point チケットで扱う。ここでは Protocol の拡張パターンだけ意識:
```
Pod → Client: Event::PermissionRequest { id, tool, args }
Client → Pod: Method::PermissionReply { id, allow }
```
これは request-response の逆方向Pod が要求元)。同じソケット上で双方向に使える。
## 検討事項
- Event の肥大化をどう管理するか(カテゴリ分け?ネスト?)
- Protocol のバージョニング(クライアント互換性)
- イベントの順序保証broadcast channel の特性)