目的
アプリを閉じたときに、起動した CLI のプロセスを残さない。
前提
src-tauri/src/ に終了時の後始末が無い。on_window_event / WindowEvent::Destroyed / ExitRequested のいずれも実装されておらず、PtyState に対する Drop も無い(実測: grep で該当なし)。
portable-pty の子プロセスは job object に入っていないため、Windows では親の終了で道連れにならない。したがってアプリを閉じても CLI は走り続ける。
何が起きるか
- 部屋のサーバはアプリと一緒に死ぬので、孤児になった CLI は接続先を失う。走り続けるが誰とも繋がらない。
- 次にアプリを起動すると
RoomSeats は空なので席は空いており、同じアカウントをもう一度起動できる。同じ CLI が二つ走る状態になりうる。
- 孤児は Task Manager から止めるしかない。
#84 は「画面の記憶が消えても操作できること」、本 issue は「アプリが消えたらプロセスも終わること」。#84 の回復経路があっても、アプリ自体を閉じた場合は回復する画面が無いため、こちらは別に要る。
決定
アプリ終了時に走っているセッションを落とす。落とす前に確認を挟む。(2026-08-25、Master の判断)
「アプリを閉じても CLI は走らせ続けたい」という使い方は今回は採らない。孤児が生まれる形を既定にしない方を採る。
確認の形
- アプリ自身のダイアログを使う。
window.confirm は使わない。 セッション終了の確認が既に #end-dialog(index.html 289 行)でこの形を採っており、その理由は src/main.ts 1681 行付近に書かれている——ホストが何も答えない場合、window.confirm はボタンを黙って無効にするか、既定を yes と読んで一回のクリックで実行してしまう。閉じる操作でも同じ穴が開く。
- 走っているセッションが無い場合は確認を出さない。 落とすものが無いのに問う形は、閉じる操作に一段足すだけである。
- 確認は「閉じるとセッションが終わる」ことを伝えるものであり、「閉じるが CLI は残す」の選択肢は出さない。上の決定でその使い方を採らないため。
未決(今回の範囲外)
制約
- 確認を出さずに落とさない。ただし落とすものが無い場合は確認自体を出さない(上記)。
- 確認で「閉じない」を選んだ場合、アプリは閉じず、セッションも落とさない。閉じる操作の取り消しであって、セッションだけ落とす経路にしない。
- 既存の
#end-dialog を流用するか新しいダイアログを立てるかは実装側の判断とする。ただし文言は「セッションの終了」ではなく「アプリの終了」であることが読める形にすること。
RoomSeats の解放は既存の終了経路に倣う。アプリが落ちる以上、席の状態が残らないことは自明だが、終了処理そのものは既存の kill 経路を通す。
完了条件
- 走っているセッションがある状態でアプリを閉じようとすると、確認が出る。
- 確認を承認するとセッションが落ち、アプリが閉じる。閉じた後に CLI のプロセスが残っていない。
- 確認を取り消すとアプリは閉じず、セッションも走り続ける。
- 走っているセッションが無い場合、確認は出ずにそのまま閉じる。
対象ファイル
src-tauri/src/lib.rs — on_window_event / ExitRequested の配線
src-tauri/src/pty.rs — 一括終了の経路
src/main.ts / index.html — 確認ダイアログ
docs/0-requirements.md
関連
目的
アプリを閉じたときに、起動した CLI のプロセスを残さない。
前提
src-tauri/src/に終了時の後始末が無い。on_window_event/WindowEvent::Destroyed/ExitRequestedのいずれも実装されておらず、PtyStateに対するDropも無い(実測:grepで該当なし)。portable-ptyの子プロセスは job object に入っていないため、Windows では親の終了で道連れにならない。したがってアプリを閉じても CLI は走り続ける。何が起きるか
RoomSeatsは空なので席は空いており、同じアカウントをもう一度起動できる。同じ CLI が二つ走る状態になりうる。#84 との関係
#84 は「画面の記憶が消えても操作できること」、本 issue は「アプリが消えたらプロセスも終わること」。#84 の回復経路があっても、アプリ自体を閉じた場合は回復する画面が無いため、こちらは別に要る。
決定
アプリ終了時に走っているセッションを落とす。落とす前に確認を挟む。(2026-08-25、Master の判断)
「アプリを閉じても CLI は走らせ続けたい」という使い方は今回は採らない。孤児が生まれる形を既定にしない方を採る。
確認の形
window.confirmは使わない。 セッション終了の確認が既に#end-dialog(index.html289 行)でこの形を採っており、その理由はsrc/main.ts1681 行付近に書かれている——ホストが何も答えない場合、window.confirmはボタンを黙って無効にするか、既定を yes と読んで一回のクリックで実行してしまう。閉じる操作でも同じ穴が開く。未決(今回の範囲外)
制約
#end-dialogを流用するか新しいダイアログを立てるかは実装側の判断とする。ただし文言は「セッションの終了」ではなく「アプリの終了」であることが読める形にすること。RoomSeatsの解放は既存の終了経路に倣う。アプリが落ちる以上、席の状態が残らないことは自明だが、終了処理そのものは既存の kill 経路を通す。完了条件
対象ファイル
src-tauri/src/lib.rs—on_window_event/ExitRequestedの配線src-tauri/src/pty.rs— 一括終了の経路src/main.ts/index.html— 確認ダイアログdocs/0-requirements.md関連