Skip to content

feat(update-check): re-check while the server runs — a server started with npx @latest is never told a newer version shipped #1821

Description

@ystknsh

背景

更新チェック(#654, #677)は、ランチャ起動時(bin/mulmoterminal.jscheckForUpdate)とサーバ起動時(server/index.tsrefreshUpdateStatus)の各 1 回だけ走ります。稼働中に再チェックする処理はありません(src/composables/useUpdateStatus.ts のポーリングは起動時の結果が返るのを待つためのもので、ready が立つか最大 5 回で止まります。server/config/update-status.ts のコメントにも "Recomputed on each start" とあります)。

README が案内する起動方法 npx mulmoterminal@latest では、起動した時点で registry の latest が動きます。チェックはその瞬間にしか走らないので、比較は常に「動いている版 == latest」で、bin/update-check.jsnpmUpdateNotice は null を返します。稼働中に新版が出れば「動いている版 < latest」になりますが、その時点で見に行く処理が無い。この 2 つを合わせると、この起動方法のユーザーには、ヘッダの Update badge も起動時のコンソール通知も出る機会がありません。

サーバは何日でも動き続ける設計(tmux で persistence まで持つ)なので、稼働中に新版が出ても再起動の機会は自然には来ません。実例として、あるユーザーの要望が入った版をリリースした際、作者が個別に「新版に入ったので確認してほしい」と伝えたことで初めて更新が行われました。こちらから伝えなければ更新しようと思わなかった可能性がある、とのことです。ユーザーが増えればこの人力通知は成り立ちません。

現状 badge が機能するのは、動いている版が起動後に固定される npm i -g と、git ls-remote で origin と比べる git checkout です。バージョン指定なしの npx mulmoterminal でキャッシュの古い版が動いた場合は出うると思いますが、これは npm 側の挙動で本リポジトリでは検証していません(推測)。

加えて、npx 経由の起動は install 種別が "npm" と判定されます(hasNodeModulesSegment_npx/<hash>/node_modules/… に反応する)。そのため仮に通知が出ても案内コマンドは npm i -g mulmoterminal になります。npx で起動した人の更新手順は「止めて起動し直す」なので、この案内は的外れです。なお _npx セグメントから分かるのは npx のキャッシュから実行されていることまでで、@latest を付けて起動したかどうかはサーバ側からは分かりません。

観察環境: main faeae7de(4.10.1)。bin/update-check.jsnpmUpdateNotice("4.10.1", "4.10.1") が null、classifyInstall("<home>/.npm/_npx/<hash>/node_modules/mulmoterminal", false)"npm" を返すことを実行して確認しました。手元で npx mulmoterminal@latest(4.10.1)を起動した状態の GET /api/update-status{"install":"npm","version":"4.10.1","latest":null,"notice":null} でした。

考えられるアプローチ

2 つは独立しています。

  1. 稼働中に定期的に再チェックするrefreshUpdateStatus を起動時 1 回ではなく一定間隔で呼び直すのはどうでしょうか。server/index.ts には setInterval(...).unref() で回している処理が既にあり(scheduledSessions.sweeprefreshDecisionDigests)、同じ形に乗せられます。間隔は registry への負荷と即時性のトレードオフで、新版に数時間で気づければ十分だと思います。失敗時は現状と同じく best-effort(黙って前回の値を保つ)。NO_UPDATE_NOTIFIER / MULMOTERMINAL_NO_UPDATE_CHECK のオプトアウトはそのまま効かせます。UI 側(useUpdateStatus)は ready で止まる現在のポーリングをやめて間隔を空けて読み直す形にする必要があります(タブが見えているときだけにするか等は実装判断)。README の GET /api/update-status の行にある "Computed once at startup" も直します
  2. npx 経由の起動を見分けて、案内を「再起動」にする — パスに _npx セグメントがあるときは install 種別を分け、通知文を npm i -g ではなく「MulmoTerminal を止めて起動し直す」にするのはどうでしょうか。起動コマンドそのものは保持していないので、文言は固定(例: npx mulmoterminal@latest)か一般的な表現にする判断が要ります。install 種別を増やすと common/updateStatus.tsInstallKindparseUpdateStatus、UI の parseUpdateNotice、それぞれの spec、README の API 表まで一式が対象になります。(1) と独立です

関連

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions