背景
MulmoTerminal をユーザー操作で止める経路は、現状「起動したターミナルで Ctrl+C」だけです。起動時のバナー(bin/mulmoterminal.js の printReadyBanner が出す Press Ctrl+C to stop.)と getting-started ガイド(日英)には書いてありますが、それが読めるのは起動した瞬間のそのターミナルだけです。
npx mulmoterminal@latest はブラウザを自動で開くので、起動後のユーザーの視界はブラウザ側にあります。ターミナルを見失う(タブが多い、ウィンドウを閉じた等)と、一般のユーザーが止めるための導線が無くなります。
- ブラウザ側に終了の導線がありません。タブを閉じてもサーバは動き続けます。ユーザー操作で止まる経路は SIGINT / SIGTERM だけで(
server/index.ts の signal handler)、クライアント切断やアイドルでの自動終了はありません。タブを閉じるときに出るのは src/composables/useUnloadGuard.ts によるブラウザ固定文面の確認だけで、「サーバはまだ動いている」は伝わりません
- プロセス一覧で探しても
node としか出ません。bin/mulmoterminal.js が #!/usr/bin/env node のスクリプトなので、npx でもグローバルインストールでも同じです。Activity Monitor で mulmoterminal を検索しても何も出ません。ps の COMMAND 列にはフルパスが出るので ps や lsof -i:34567 から辿ることはできますが、それを知っている人向けの経路です
- Settings の Stop ボタン(
SurvivingSessionsSection)は再起動を生き延びたセッションを止めるもので、アプリの終了ではありません
報告例: npx mulmoterminal@latest で使っていたユーザー(ターミナルのタブを常時多数開いて作業するスタイル)が、新版への更新のために古いサーバを止めようとしたところ、起動したターミナルのタブが他の多数のタブに紛れて見つからず、プロセスを探して kill することになりました(Windows / PowerShell。不慣れな環境でコマンドを調べて対処。本人は npx がプロセスをバックグラウンドに回したと感じていた)。更新に限らず「今日はもう使わない」「ポートを空けたい」「挙動がおかしいので入れ直したい」でも同じ壁に当たります。
観察環境: コードは main faeae7de(4.10.1)。プロセス名の観察は macOS で npx mulmoterminal@latest(4.10.1)を起動した状態で ps と Activity Monitor を確認しました。ps の STAT は S+(起動したターミナルのフォアグラウンドプロセスグループ)で、バックグラウンドには行っていません。Windows 側は報告のみで、こちらでは未検証です。
考えられるアプローチ
独立した 2 つで、(1) が本体、(2) は保険です。
- ブラウザから止められるようにする — UI に終了の導線を置き、サーバに終了を頼む POST ルートを 1 本足すのはどうでしょうか。やることは Ctrl+C と同じで、SIGINT handler と同じ経路(whisper sidecar を止めて
process.exit(0))を通します。セッションの扱いも Ctrl+C と同じ(tmux があれば中のセッションは生き残って次回起動時の Surviving sessions に出る、無ければエージェントのセッションも終わる)で、それ以上の後片付けを新たに設計する必要は無いと思います。ランチャは子の終了で自分も終わる(bin/mulmoterminal.js の runServer の close ハンドラ)ので、npx のラッパーまで含めて畳めます。
- 押した瞬間に全セルの表示が消える操作なので、事前確認(yes/no)は必須だと思います。確認文には上のセッションの扱い(tmux の有無で変わる)を書くのが良さそうです
- 悪意ある Web ページからの cross-site POST で手元のサーバが落ちる、は防ぐ必要がありますが、state-changing なルートは
server/routes/same-origin-guard.ts の中央ゲート(server/routes/app-routes.ts で全ルートの前に app.use)が既定で覆うので、POST にする限り追加の防御は要らないはずです。ルートの置き場所は他のローカル操作ルートと同じ server/routes/ 配下で、mount は app-routes.ts から
- UI の置き場所は Settings 内が自然だと思います(どの節に置くかは実装判断。バージョン表示の
AppVersionLine はモーダルのヘッダにあるので、その近くか、セッション系の節か)。ヘッダのツールバーに置くと誤クリックの被害が大きい
- プロセスに名前を付ける(保険) — サーバ起動時に
process.title = "mulmoterminal" を設定するのはどうでしょうか。ps の COMM / COMMAND が mulmoterminal になることは手元で確認済みです。Activity Monitor の名前欄に反映されるかは未確認。(1) があっても見失う人は出るので、pkill mulmoterminal で止められる状態にしておく価値はあります
関連
背景
MulmoTerminal をユーザー操作で止める経路は、現状「起動したターミナルで Ctrl+C」だけです。起動時のバナー(
bin/mulmoterminal.jsのprintReadyBannerが出すPress Ctrl+C to stop.)と getting-started ガイド(日英)には書いてありますが、それが読めるのは起動した瞬間のそのターミナルだけです。npx mulmoterminal@latestはブラウザを自動で開くので、起動後のユーザーの視界はブラウザ側にあります。ターミナルを見失う(タブが多い、ウィンドウを閉じた等)と、一般のユーザーが止めるための導線が無くなります。server/index.tsの signal handler)、クライアント切断やアイドルでの自動終了はありません。タブを閉じるときに出るのはsrc/composables/useUnloadGuard.tsによるブラウザ固定文面の確認だけで、「サーバはまだ動いている」は伝わりませんnodeとしか出ません。bin/mulmoterminal.jsが#!/usr/bin/env nodeのスクリプトなので、npx でもグローバルインストールでも同じです。Activity Monitor でmulmoterminalを検索しても何も出ません。psの COMMAND 列にはフルパスが出るのでpsやlsof -i:34567から辿ることはできますが、それを知っている人向けの経路ですSurvivingSessionsSection)は再起動を生き延びたセッションを止めるもので、アプリの終了ではありません報告例:
npx mulmoterminal@latestで使っていたユーザー(ターミナルのタブを常時多数開いて作業するスタイル)が、新版への更新のために古いサーバを止めようとしたところ、起動したターミナルのタブが他の多数のタブに紛れて見つからず、プロセスを探して kill することになりました(Windows / PowerShell。不慣れな環境でコマンドを調べて対処。本人は npx がプロセスをバックグラウンドに回したと感じていた)。更新に限らず「今日はもう使わない」「ポートを空けたい」「挙動がおかしいので入れ直したい」でも同じ壁に当たります。観察環境: コードは main
faeae7de(4.10.1)。プロセス名の観察は macOS でnpx mulmoterminal@latest(4.10.1)を起動した状態でpsと Activity Monitor を確認しました。psの STAT はS+(起動したターミナルのフォアグラウンドプロセスグループ)で、バックグラウンドには行っていません。Windows 側は報告のみで、こちらでは未検証です。考えられるアプローチ
独立した 2 つで、(1) が本体、(2) は保険です。
process.exit(0))を通します。セッションの扱いも Ctrl+C と同じ(tmux があれば中のセッションは生き残って次回起動時の Surviving sessions に出る、無ければエージェントのセッションも終わる)で、それ以上の後片付けを新たに設計する必要は無いと思います。ランチャは子の終了で自分も終わる(bin/mulmoterminal.jsのrunServerのcloseハンドラ)ので、npx のラッパーまで含めて畳めます。server/routes/same-origin-guard.tsの中央ゲート(server/routes/app-routes.tsで全ルートの前にapp.use)が既定で覆うので、POST にする限り追加の防御は要らないはずです。ルートの置き場所は他のローカル操作ルートと同じserver/routes/配下で、mount はapp-routes.tsからAppVersionLineはモーダルのヘッダにあるので、その近くか、セッション系の節か)。ヘッダのツールバーに置くと誤クリックの被害が大きいprocess.title = "mulmoterminal"を設定するのはどうでしょうか。psの COMM / COMMAND がmulmoterminalになることは手元で確認済みです。Activity Monitor の名前欄に反映されるかは未確認。(1) があっても見失う人は出るので、pkill mulmoterminalで止められる状態にしておく価値はあります関連
npx mulmoterminal@latestのユーザーに新版を知らせる再チェック。両方揃うと「badge → 確認 → 新版で再起動」を一本道にできます((1) の終了を「終了+再起動」に広げるだけ)。本 issue はそれに依存しません