Skip to content

fix(session): sessions outlive the app that started them #85

Description

@smileygames

目的

アプリを閉じたときに、起動した 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 との関係

#84 は「画面の記憶が消えても操作できること」、本 issue は「アプリが消えたらプロセスも終わること」。#84 の回復経路があっても、アプリ自体を閉じた場合は回復する画面が無いため、こちらは別に要る。

決定

アプリ終了時に走っているセッションを落とす。落とす前に確認を挟む。(2026-08-25、Master の判断)

「アプリを閉じても CLI は走らせ続けたい」という使い方は今回は採らない。孤児が生まれる形を既定にしない方を採る。

確認の形

  • アプリ自身のダイアログを使う。window.confirm は使わない。 セッション終了の確認が既に #end-dialogindex.html 289 行)でこの形を採っており、その理由は src/main.ts 1681 行付近に書かれている——ホストが何も答えない場合、window.confirm はボタンを黙って無効にするか、既定を yes と読んで一回のクリックで実行してしまう。閉じる操作でも同じ穴が開く。
  • 走っているセッションが無い場合は確認を出さない。 落とすものが無いのに問う形は、閉じる操作に一段足すだけである。
  • 確認は「閉じるとセッションが終わる」ことを伝えるものであり、「閉じるが CLI は残す」の選択肢は出さない。上の決定でその使い方を採らないため。

未決(今回の範囲外)

  • 孤児の引き取り。 起動時に前回の孤児を見つけて繋ぎ直す形。pty id が Rust のメモリにしか無いため(fix(session): a running session becomes unmanageable after the webview reloads #84 参照)、持続化の話になる。範囲が大きいため今回は扱わない。今回の修正で正常終了の経路では孤児が生まれなくなるため、引き取りの必要性そのものが下がる。
  • 異常終了の場合。 アプリがクラッシュしたときは後始末が走らないため、孤児は依然として生まれうる。job object に入れる形なら OS が面倒を見るが、確認を挟む形とは別の軸である(job object は問わずに落とす)。今回は正常終了の経路を閉じることを範囲とし、クラッシュ経路は別 issue とする。

制約

  • 確認を出さずに落とさない。ただし落とすものが無い場合は確認自体を出さない(上記)。
  • 確認で「閉じない」を選んだ場合、アプリは閉じず、セッションも落とさない。閉じる操作の取り消しであって、セッションだけ落とす経路にしない。
  • 既存の #end-dialog を流用するか新しいダイアログを立てるかは実装側の判断とする。ただし文言は「セッションの終了」ではなく「アプリの終了」であることが読める形にすること。
  • RoomSeats の解放は既存の終了経路に倣う。アプリが落ちる以上、席の状態が残らないことは自明だが、終了処理そのものは既存の kill 経路を通す。

完了条件

  • 走っているセッションがある状態でアプリを閉じようとすると、確認が出る。
  • 確認を承認するとセッションが落ち、アプリが閉じる。閉じた後に CLI のプロセスが残っていない。
  • 確認を取り消すとアプリは閉じず、セッションも走り続ける。
  • 走っているセッションが無い場合、確認は出ずにそのまま閉じる。

対象ファイル

  • src-tauri/src/lib.rson_window_event / ExitRequested の配線
  • src-tauri/src/pty.rs — 一括終了の経路
  • src/main.ts / index.html — 確認ダイアログ
  • docs/0-requirements.md

関連

Metadata

Metadata

Assignees

No one assigned

    Labels

    bug動いていない、壊れているready本文が実装開始できる形まで収束している状態。ただし更新は継続可能

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions