Skip to content

feat(ui): a way to stop the server from the browser #1820

Description

@ystknsh

背景

MulmoTerminal をユーザー操作で止める経路は、現状「起動したターミナルで Ctrl+C」だけです。起動時のバナー(bin/mulmoterminal.jsprintReadyBanner が出す 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 列にはフルパスが出るので pslsof -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) は保険です。

  1. ブラウザから止められるようにする — UI に終了の導線を置き、サーバに終了を頼む POST ルートを 1 本足すのはどうでしょうか。やることは Ctrl+C と同じで、SIGINT handler と同じ経路(whisper sidecar を止めて process.exit(0))を通します。セッションの扱いも Ctrl+C と同じ(tmux があれば中のセッションは生き残って次回起動時の Surviving sessions に出る、無ければエージェントのセッションも終わる)で、それ以上の後片付けを新たに設計する必要は無いと思います。ランチャは子の終了で自分も終わる(bin/mulmoterminal.jsrunServerclose ハンドラ)ので、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 はモーダルのヘッダにあるので、その近くか、セッション系の節か)。ヘッダのツールバーに置くと誤クリックの被害が大きい
  2. プロセスに名前を付ける(保険) — サーバ起動時に process.title = "mulmoterminal" を設定するのはどうでしょうか。ps の COMM / COMMAND が mulmoterminal になることは手元で確認済みです。Activity Monitor の名前欄に反映されるかは未確認。(1) があっても見失う人は出るので、pkill mulmoterminal で止められる状態にしておく価値はあります

関連

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or requesthelp wantedExtra attention is needed

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions