The terminal UI
引数なしで snowpea を実行するとターミナル UI が開きます。これは薄いクライアントです。どのツールを実行してよいか、コマンドが何を意味するか、いつ圧縮するか — そうした判断はすべてデーモンのものです。このページは、その判断が現れる画面についての説明です。
起動画面
セッションが最初に描くのは、ターミナル幅に合わせたワードマークと、いまどこにいるかを伝える3行です。
██████████ ██ ██ ██████████ ██ ██ ██████████ ██████████ ██████████
██ ████ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██
██████████ ██ ██ ██ ██ ██ ██ ██ ██████████ ██████████ ██████████
██ ██ ████ ██ ██ ██ ██ ██ ██ ██ ██ ██
██ ██ ██ ██ ██ ████ ████ ██ ██ ██ ██
██████████ ██ ██ ██████████ ██ ██ ██ ██████████ ██ ██
🌱 snowpea v0.1.2
Open-source multi-vendor coding agent and personal AI assistant
v0.1.2 · anthropic/claude-sonnet-4-5 · /home/you/project · ACCEPT
Last session: 26m ago · "add the worktree parallel session story to the IDE plan"
Press R or type /resume to continue it最後のセッションの案内は、このディレクトリのセッションをデーモンがまだ保持しているときにだけ出ます — 別のターミナルで開いたもの、ヘッドレス実行、クラッシュが残していったもの。入力が空の状態で R を押すと、それをこのウィンドウに再生します。/resume のほうは、保存されているすべてのセッションを対象にした選択画面を開きます。該当するセッションがデーモンにないときは案内自体を出しません。受け取れない申し出は、申し出がないより悪いからです。
バナーは一度だけ出力されます。ほかの出力と同じように上へ流れていき、二度と描き直されません。
保存されたセッション
起動画面の申し出は、いちばん新しいものだけです。このマシンがこれまでに動かしたものはすべてディスクに残っており、/sessions がその全体を対象にした選択画面を開きます。
╭──────────────────────────────────────────────────────────────────────╮
│ ❯ 01J9F2… · 2026-03-14 09:41 · fix the flaky worktree test │
│ 01J9DR… · 2026-03-13 18:02 · add the scheduler reminder story │
│ 01J9C7… · 2026-03-13 11:26 · (no prompt) │
│ Cancel │
│ ↑↓ move · Enter resume · Esc cancel │
╰──────────────────────────────────────────────────────────────────────╯一覧にはデーモンが開いたまま持っているものだけでなく、閉じたセッションも含まれます。各行にはそのセッションが最後に見たプロンプトが載るので、ID を覚えていなくても行を見分けられます。並びは新しい順で、このディレクトリに絞られ、いまいるセッション自身は候補に出ません。
| 打つもの | 何をするか |
|---|---|
/sessions | 選択画面を開きます |
/resume | 同じ選択画面 |
/resume <sessionId> | 選択画面を出さず、そのセッションを直接開き直します |
入力が空のときの R | 選択画面を飛ばして、このディレクトリの最新のセッションを取ります |
/session delete <id> | 保存されたセッションを1つ削除します |
/session clear | このディレクトリの保存されたセッションを削除します |
/session clear --all | このマシンの保存されたセッションをすべて削除します |
再開すると、そのセッションの履歴がこのウィンドウに再生され、そこから続きます。作業ディレクトリ、モード、プロバイダー、モデル、チームも一緒に戻ってきます。デーモンがそれを開いたまま持っていたかどうかは関係ありません。
削除は、メッセージ、イベント、セッションの行をまとめて持っていき、そのセッションが所有していた添付と音声のファイルも一緒に持っていきます。中身に貼られたもののために削除したスレッドが、貼られたものを残していってはいけないからです。生きているセッションは決して削除されません。先に閉じてください。それまでは clear はそれを飛ばします。一方で再開にはターンが止まっていることが必要です。/resume と /sessions は何かが走っているあいだは拒否します。生きているターンの下で記録を入れ替えれば、それは真っ二つに裂けるからです。
画面の構成
UI は git log のようにインラインで描きます。全画面アプリではありません。終わった出力はターミナルに渡されるので、スクロールバックも、マウスも、Ctrl+Shift+F もいつも通りです。生きているのは画面の下だけです。
› explain the retry logic ← scrollback: yours, never redrawn
⏺ Read 3 files (128 lines)
◆ The retry lives in `client.ts`…
✢ Pondering… (12s · ↓ 3.7k tokens) ← the live region starts here
> the next thing you type
⏵⏵ auto mode on · 1 shell · ← 2 agents
snowpea v0.1.2 | ~/project | Model: anthropic/claude-sonnet-4-5 | Mode: ACCEPT | ctx 34% (68k/200k)
[!!] context 85% — /compact to free space
● main
✳ executor Implement story IDE-004 running · 27s · ↓ 159.1k tokens
◯ 4 idle agents下のパネルは上から順に、モードのサマリー行、ステータス行、あればコンテキスト警告、そしてエージェント行です。モードが先に来るのは意図的です。次のターンに何を許すかを決めるのがその行なので、いま打ち込んでいるものにいちばん近いところに座ります。入力行はそれらの上にあり、作業インジケータはさらにその上です。入力行より下は、変わっていなければ描き直しません。
動いているあいだ
ターンが動いているあいだ、入力行の上に1行出ます。その行は実際に何が起きているかを言います。
| 表示 | 意味 |
|---|---|
✢ Pondering… (12s · ↓ 3.7k tokens) | モデルが考えている。動詞は数秒ごとに変わります |
✳ Running shell: npm test… (4s · …) | ツールが実行中。名前と引数つき |
✶ 3 agents working… (1m 2s · …) | ターンが委譲しました |
✳ /ralph… (3m 10s · …) | コマンドワークフローがターンを握っています |
⏸ Waiting for approval | あなたの返事待ちです |
時計とトークン数はセッション全体ではなく、このターンのものです。セッションの合計はステータス行にあります。Esc で中断します。
続けて走ったツール呼び出しは、終わるとカードの山ではなくスクロールバックの1行にたたまれます。
⏺ Ran 2 shell commands (34 lines)
⏺ Read 3 files (128 lines)失敗した呼び出しだけは出力ごと自分のカードを保ちます。読む必要があるのはそれだからです。Ctrl+O は、まだ生きている領域にある最新のツール呼び出しか diff を展開します。
モード
Shift+Tab が accept → auto → plan → accept の順にモードを回します。現在のモードはステータス行とサマリー行にあり、それぞれが何を許すかは Modes にあります。Ctrl+P は巡回せずに plan モードだけを切り替えます。
次のモードではなく特定のモードがほしいときのために、選択画面もあります。履歴のいちばん新しい項目からさらに ↓ を押すとサマリー行に移り、そこで Enter を押すと開きます。
⏵⏵ auto mode on · 1 shell · ← 2 agents · Enter to choose mode
❯ accept mode
auto mode
plan modeいまいるモードから始まり、Enter で選択中のものを取り、Esc はモードをそのままにします。どちらにせよ、モードのサマリー行はステータス行の下ではなく上に描かれます。
モデルを選ぶ
/model <ref> はセッションをそのモデル id か、名前の付いたプロファイルに切り替えます。/model だけを打つと、読んで打ち直す必要のある一覧を出す代わりに、選ぶための画面が開きます。
╭──────────────────────────────────────────────────────────────╮
│ Model │
│ ❯ fast anthropic/claude-haiku-4-5 · used by reviewer │
│ deep anthropic/claude-sonnet-4-5 · default │
│ claude-opus-4-1 anthropic │
│ ↑↓ move · Enter pick · Esc cancel │
╰──────────────────────────────────────────────────────────────╯並ぶのはまず設定のモデルプロファイル — models.profiles と、どれが既定でどのエージェントがどれを使うかを言う models.default・agents.models — 次にベンダーのエンドポイントが報告したモデル、最後に、ほかのどこにも出てこなければ今使っているモデルです。Enter はカーソルのある行で /model <ref> を実行します。ステータス行の Model: は使っているモデルを示し、デーモンが言うときはそれがどこから来たかも添えます。
承認
デーモンが尋ねるときはメニューで尋ねます。↑/↓ で移動、Enter で選択中の行を確定、Esc は拒否です。
╭──────────────────────────────────────────────────────╮
│ Approval required │
│ shell risk=high timeout=300s │
│ command: rm -rf build │
│ │
│ ❯ Yes (y) │
│ Yes, and don't ask again this session (a) │
│ Yes for this project (p) │
│ adds an allowlist rule the daemon keeps │
│ No (n) │
│ ↑↓ move · Enter confirm · Esc cancel │
╰──────────────────────────────────────────────────────╯デーモンに警告すべきことがあるとき — 作業ディレクトリの外に手を伸ばすコマンド、引数だけでは見えないリスク — リクエストは note を伴い、TUI でもヘッドレスの CLI でも、引数の上に赤で描かれます。
shell risk=high timeout=300s
⚠ this deletes a directory outside the working tree
command: rm -rf ../buildカーソルは Yes から始まるので、Enter はそのまま「はい」です。y、a、p、n も直接使えます。プロンプトが出ているあいだキーボードはプロンプトのものです。打った文字は後ろの入力行に漏れませんし、Shift+Tab もモードを変えません。
誰も見ていないターンが上げた承認 — スケジュールされたジョブ、Telegram のメッセージ — は待ち行列に入ります。Ctrl+R でその待ち行列にキーボードを渡し、/approvals が一覧を出します。
差分
ファイルの変更は、それが起きた場所、つまり会話の中に描かれます。
✎ Edited README.md (+4 −2)
--- a/README.md
+++ b/README.md
@@ -1,5 +1,7 @@
# snowpea
-an agent
+an open-source multi-vendor coding agent
… 3 more lines (Ctrl+O)新しいファイルは ✚ Created notes.md (7 lines) と出ます。長いパッチは12行で切られ、まだ生きている領域にあるものは Ctrl+O で開けます。
コンテキスト
ステータス行は、モデルのコンテキストウィンドウがどれだけ埋まっているかを持ち歩きます。
ctx 34% (68k/200k)70% までは淡く、そこから黄色、85% から赤、そして 80% を超えるとサマリー行の上に、どうすればよいかが1行出ます。
[!!] context 85% — /compact to free space/compact [instructions] はここまでの会話を要約し、その要約から続けます。後ろに付ける指示は、何を残すかを伝えます。デーモンも、ターンが context.autoCompactPercent を超えそうなときは自分で圧縮します。どちらの場合も、どこで起きたかは記録に残ります。
───────────── compacted (68.0k → 12.1k tokens) ─────────────パーセントなしで ctx 12.3k used と出るときは、そのモデルのウィンドウ幅をデーモンが知らないという意味です。snowpea session context と providers.<vendor>.context_window の設定は Commands にあります。
入力
↑ は前に送ったプロンプトをさかのぼり、↓ は書きかけに戻ります。履歴はセッション単位ではなくマシン単位です。$SNOWPEA_HOME/tui-history.jsonl に最新500件まで残り、同じプロンプトが続けて二度記録されることはありません。
最新の項目からもう一度押した ↓ は別のことをします。カーソルが入力行を抜け、下の行へ移ります。まずサマリー行で、そこで Enter を押すとモードの選択画面が開きます。
⏵⏵ auto mode on · 1 shell · ← 2 agents · Enter to choose modeその次はエージェント行が1行ずつです。Esc か ↑ で入力行に戻ります。
走っているあいだに送る
ターンが終わるのを待つ必要はありません。走っているあいだに送ったプロンプトは拒否されず、受け付けられて待ち行列に入ります。待ち行列は先入れ先出しで、1つの履歴に対して一度に1ターンずつ消化されるので、2つのプロバイダーのループが同じ会話の上を走ることはありません。添付は Enter を押した時点で確定されるので、いま並べたチップは、そのターンが始まるときにもあなたが意図したファイルのままです。待ち行列はメモリ上にだけあり、デーモンの再起動を越えては残りません。
Esc は走っているターンと一緒に待ち行列も捨てます。中断するとは、頼んだことをやめるという意味であり、それは待っている続きのプロンプトも含まなければなりません。そうでなければ、停止のあとに待ち行列が結局走ってしまいます。捨てられたプロンプトはそれぞれ、理由 dropped の turn.dequeued としてクライアントに報告され、続けて自分自身の turn.done が届くので、そのターン ID を待っているものが宙づりになることはありません。
待ち行列が減っていくあいだ、UI はそれを見せます。作業インジケータの行に ⏳ N queued が付き、待っているプロンプトは実行される順に番号を振られて、入力行の下に淡く並びます。
✽ Noodling… (4s · ↓ 0 tokens) · ⏳ 2 queued
1. run the tests after this
2. then read the diff
> ask anything, or /command自分の番が始まった瞬間、そのプロンプトは一覧から消えます。Esc は待ち行列をまるごと空にし、プロンプトごとに1行ではなく 2 queued prompts dropped と一度だけ知らせます。
プロンプトを1つエージェントに渡す
$名前 で始まる入力は、メインのセッションではなくそのエージェントに行きます。送る前に入力行がそう言います。
[delegate to executor]
> $executor review the queue work名前はデーモンのエージェント一覧から来ます。誰もその名前で答えないときも (no such agent) を付けてそのまま表示します。Enter を押したあとより、押す前に気づくほうがよいからです。
エージェントの中を見る
エージェント行で Enter を押すと、画面の記録がそのエージェント自身の会話に入れ替わります — 渡された指示、実行したツール、返した答えまで。
╭────────────────────────────────────────────────────────────────────╮
│ ◯ executor · Implement story IDE-004 running · 28s · ↓ 159.1k │
│ › Implement story IDE-004 (Worktree parallel sessions) │
│ ✓ read_file path=docs/stories/IDE-004.md (1 lines) │
│ ◆ Added the worktree manager and its tests; 3 files changed. │
│ ↑↓ PgUp/PgDn scroll · Esc back to the main transcript │
╰────────────────────────────────────────────────────────────────────╯委譲されたエージェントはそれぞれ自分のセッションで動きます。この画面がそのセッションそのもので、過ぎた分を再生してから、続きを追いかけます。Esc、または ● main で Enter を押すと戻ります。Ctrl+A はたたみ込みの規則を外してパネルを全部開くので、待機中のエージェントや ↓ N more の裏に隠れていた行まで見えます。
アップデート
新しいバージョンがあるとステータス行が知らせ、入力が空の状態で U を押すか /update と打つと確認メニューが開きます。アップグレードが走り、デーモンが再起動し、UI が新しいバージョンで戻ってきます。
snowpea v0.1.2 → v0.1.3 (U to update)添付
ファイルのパスを入力行に貼るか、ドラッグして落とすと、文字ではなくチップになります。
[📎 screenshot.png 1.2MB] (backspace removes the last · Ctrl+X clears)
> what is wrong with this layout?ターミナルが実際に渡してくる形をそのまま理解します — パス1つ、複数、空白をエスケープしたパス、していないパス、file:// URL、ファイルマネージャが付けた引用符。Ctrl+V はシステムのクリップボードから画像を直接取り、$SNOWPEA_HOME/tmp/ の下に保存します。使うのは wl-paste、xclip、AppleScript、PowerShell のうちこのマシンにあるものです。/attach <path> は手で付ける方法です。
入力が空のときの Backspace は最新のチップを外し、Ctrl+X は全部消します。プロンプトを送るとファイルも一緒に行き、記録には何が行ったかが残ります。
› what is wrong with this layout?
📎 screenshot.pngファイルはパスとして送るので、コピーは作られません。そのファイルをモデルがどう扱うか — 20MB の上限、縮小、画像を見られないモデルで何が起きるか — は Attachments and voice にあります。
音声
音声はバックエンドがあって初めて動き、バックエンドを持っているのはデーモンです。snowpea setup audio で設定し、何が必要かは Attachments and voice にあります。
| キー・コマンド | 何をするか |
|---|---|
/voice | 音声入力を有効にします |
Ctrl+Space または /rec | 録音開始。もう一度で停止 |
/tts on, /tts off | 返答が終わるたびに読み上げます |
Esc | 読み上げ中の返答を止めます |
録音中は、作業インジケータの場所が時間を数えます。
● REC 00:07停止すると文字起こしして、送らずに入力行へ入れます。音声認識は十分な頻度で間違えるので、一度読む必要があるからです。録音はデーモンにマイクがあればデーモンで、なければこのマシンで行います。
ステータス行の 🔊 は、返答を読み上げているという意味です。ない機能を頼むと、何も起きない代わりにデーモン自身の言葉で理由が返ります。
voice input needs speech-to-text: no transcription backend: install the whisper CLI, set an OpenAI API key, or …全画面とインライン
既定は全画面です。入力欄、モード行・ステータス行、エージェントパネルは画面下に固定され、その上の記録はマウスホイール、PgUp/PgDn、Ctrl+U/Ctrl+D でスクロールします。変わった行だけを描き直し、終了するとターミナルは元のとおりに戻ります。ホイールで記録をスクロールしている間、マウスで文字を選ぶには Shift を押したままドラッグします。/mouse off で元に戻せます。
--inline(または SNOWPEA_TUI_INLINE=1)は、記録をターミナルのスクロールバックに残す以前のレイアウトを使います。
snowpea --inlineキー
| キー | 何をするか |
|---|---|
Enter | 送信、または選択中の項目を確定 |
Shift+Tab | モードを回す |
Ctrl+P | plan モードの切り替え |
↑ / ↓ | 前のプロンプト。最新からさらに ↓ でパネルへ |
Esc | ターンの中断、読み上げの停止、エージェント画面から戻る |
Ctrl+O | 最新のツール呼び出しか diff を展開 |
Ctrl+A | エージェントパネルを全部開く |
Ctrl+R | 保留中の承認待ち行列へ |
Ctrl+V | クリップボードの画像を添付 |
Ctrl+X | 添付をすべて消す |
Ctrl+Space | 録音の開始・停止 |
U | 提示されたアップデートを受ける |
R | 起動画面が提示したセッションを続ける |
F1 | ヘルプ |
Ctrl+C | 終了 |
/help はプラグインが足したものも含めてデーモンが持つコマンドをすべて出し、この表も一緒に出します。
Markdown の表
返答の中の Markdown の表は、罫線を揃えて描かれます。列幅は韓国語、CJK、絵文字のターミナル上の幅を考慮し、長いパスや文はセルの中で折り返します。収まりきらないほど列が多いときは、値が列のラベルの下に積み上げられます。インライン表示と全画面表示は同じレンダラーを使い、コードフェンスの中の表のソースはそのまま文字として残ります。
標準のエージェントとカスタムエージェント
/agent list は、カスタムの定義と並んで同梱の役割(architect、critic、executor、explorer、test-engineer、verifier)も出します。標準の役割はユーザーが作ったファイルを必要とせず、source は builtin です。同名のカスタム定義は標準のものを上書きし、プロジェクトの定義はグローバルの定義より優先されます。同じ名前は delegate_task の agent 引数からも使えます。
起動時のアップデート通知
起動のたびに、バックグラウンドでアップデートを確認します。/update は古い否定的なキャッシュを常に迂回してもう一度確認し、新しいものがなければ、インストールの失敗を見せるのではなく、すでに最新だと報告します。バナーが出たら、入力が空の状態で U を押すか /update と打つと確認が開きます。y を選べばインストールして再起動し、n か Esc で見送ります。通常の入力中の小文字の u はアップデートのショートカットではありません。
Git の main/master からのインストールはインストール済みのコミットを比較するので、新しいコミットの検出にバージョンの引き上げは要りません。確認の失敗、変化のないビルド、ダウングレードはインストールを引き起こしません。PyPI/リリースからのインストールは、従来どおりバージョンによる確認を保ちます。
古い自動アップデートのせいで起動が Cannot read properties of undefined (reading 'rawCall') で失敗するようになった場合は、現在の main を再インストールしてください。
uv tool install --force --reinstall 'snowpea-agent[images] @ git+https://github.com/Wafour-Developer/snowpea-agent@main'再インストール後、作業が何も走っていない状態で snowpea daemon stop を実行し、それから snowpea を起動すると、新しいデーモンのコードが読み込まれます。
ヘルプはターミナルの高さの中に収まります。↑/↓ または PgUp/PgDn でスクロールし、Esc、F1、q、Enter のいずれかで閉じます。ヘルプの中の Esc は、走っているターンを中断しません。
下部にある入力行、接続・モデルの状態、モードのサマリー、エージェント一覧は、ターミナルのコンテンツ幅いっぱいに伸びる罫線で区切られ、いま生きている領域が見分けやすくなっています。
チームと短い委譲
最初の snowpea setup は、標準の役割から default チームを作ります。/team create delivery architect executor verifier は既存のエージェントからプロジェクトのチームを作り、その場で有効にし、知らない名前は拒否します。管理には /team list、/team use <name>、/team delete <name> を使います。チームが有効なあいだ、フッターにはその名前とメンバーだけが表示され、自動的な委譲はその名簿の中に限られます。
長いコマンドを打たずに直接委譲するには、$executor fix the tests のように打ちます。知らない名前やチーム外の名前は、黙って汎用のエージェントになるのではなく失敗します。名前を省いた内部の委譲は、executor があればそれを、なければチームの最初のメンバーを決定的に使います。