常駐トレイメニュー一覧(3 プロセス)
recording-service-split により、アプリは Manager / Recorder / Viewer の 3 プロセスに分割されている。 常駐メニュー役割再設計(PR #191)で各プロセスの役割を最適化した後の、実装ベースの一覧。
spec:
recording-service-split/ 設計:docs/superpowers/specs/2026-07-04-resident-menu-role-redesign-design.md(リポジトリ内・公開サイト対象外) 関連: Recorder Mode 運用ガイド
役割の原則
- Recorder = 実行主体(Writer / サービス)かつ状態の真実源。完全ヘッドレスで、開くウィンドウは再ログインのみ。トレイは最小。
- Manager / Viewer = 操作フロント。実処理は WS コマンドで Recorder に委譲する。
- Recorder は必須。Manager / Viewer を単独起動しても、生存 Recorder が無ければ強制起動して委譲モードに入る(
ensureRecorderRunning。exe が無い dev では自プロセスを--recorder-modeで spawn = 案B)。 - 表示系ウィンドウ(戦績窓・BAN/PICK 窓)は Viewer が所有。Recorder は持たない。
まず全体像
| プロセス | exe / 起動判定 | 常駐 UI | 右クリックメニュー |
|---|---|---|---|
| Manager(フル GUI) | WingStats Manager.exe(既定) | システムトレイ | 操作フロント(TrayService)+ Control 画面内 UI |
| Recorder(記録専用サービス) | WingStats Recorder.exe / --recorder-mode | システムトレイ | 最小(RecorderTrayMenu) |
| Viewer(軽量確認クライアント) | WingStats Viewer.exe / --viewer-mode | システムトレイ+戦績窓・BP窓 | 操作フロント(ViewerTrayMenu) |
💡 役割再設計後は 3 プロセスすべてがシステムトレイを持つ(Viewer も新規にトレイを取得)。 操作系(取得・ブラウザ自動化・常駐・ゲーム検知・再ログイン)は Manager / Viewer から実行し、 実処理は WS コマンドで Recorder に委譲される。
モード判定の優先順位
起動時に electron/main.ts が exe 名 or 起動フラグからモードを決める(detectRecorderMode / detectViewerMode)。
--recorder-modeフラグ、または exe 名にrecorderを含む → Recorder- (Recorder でない場合)
--viewer-modeフラグ、または exe 名にviewerを含む → Viewer - それ以外 → Manager(既定)
Recorder 判定が常に優先される(writer 役=DB 書き込み役を曖昧にしないため)。
WS 操作コマンド(Manager / Viewer → Recorder)
Manager / Viewer の操作は RecorderControlClient が WS で Recorder に委譲する(live でなければ Recorder を起動してから送る)。コマンド一覧(recorderLiveCommands.ts):
| コマンド | 動作 |
|---|---|
fetch-season / full-sync / backfill-all-seasons | 取得系を即実行 |
ba:restart / ba:reload | ブラウザ自動化の再起動 / 設定再読込 |
ba:enable / ba:disable / `ba:headless:on | off/ba:autofull:on |
resident:enable / resident:disable | 常駐(Windows 自動起動)の登録 / 削除 |
gameDetect:enable / gameDetect:disable | ゲーム検知自動起動の on/off |
login | 再ログイン窓を開く(窓は Recorder に出る) |
watch:start / watch:stop / status | 監視制御 / 状態取得(既存 C2) |
Manager: システムトレイメニュー
WingStats Manager.exe(既定起動)のトレイ。実装は electron/services/TrayService.ts(操作項目は electron/main.ts の buildManagerOperationItems)。
- トレイアイコン左クリック → ウィンドウを前面に表示(最小化されていれば復元)
- × ボタンでトレイに最小化(
UserSettings.trayMinimizeOnCloseが true のとき常駐継続) - 委譲モードでは
ViewerStatusPollerで Recorder の状態を購読し、状態変化でメニューを refresh
右クリックメニュー
| 項目 | 動作 |
|---|---|
| ウィンドウを表示 | メインウィンドウ(Control)を前面に出す |
| ─────(区切り) | |
| 録画サービス: 監視 N 件 / ブラウザ ON|OFF | 見出し(Recorder の live 状態。未接続時は「接続待ち」) |
| 直近◯戦 ◯勝◯敗 / 勝率 ◯% | 見出し(データ有時のみ) |
| 今すぐ fetchSeasonOnly を実行 | WS fetch-season |
| 今すぐ全件同期 (executeFullWorkflow) | WS full-sync |
| 今すぐ全シーズン全件取得 | WS backfill-all-seasons |
| ブラウザ自動化を再起動 | WS ba:restart |
| 🔑 今すぐログイン(再ログイン) | WS login(窓は Recorder に出る) |
| ─────(区切り) | |
| ブラウザ自動化(チェック) | WS ba:enable / ba:disable |
| ヘッドレス (画面を出さない)(チェック) | WS ba:headless:on/off(ブラウザ自動化 ON 時のみ) |
| 起動時 fetchSeasonOnly を実行(チェック) | WS ba:autofull:on/off(ブラウザ自動化 ON 時のみ) |
| 常駐(Windows 起動時に自動起動)(チェック) | WS resident:enable / resident:disable |
| ゲーム検知で自動起動(チェック) | WS gameDetect:enable / gameDetect:disable |
| ─────(区切り) | |
| 取得テスト | Control とは独立した「API 取得テスト」専用ウィンドウを開く(onOpenApiTester 提供時のみ) |
| 終了 | Overlay も閉じて app.quit() |
チェックボックスの現在値はローカル UserSettings から読み、操作は WS で Recorder に委譲する(書き手は Recorder に一本化)。
Control 画面内 UI
同じ操作は Control(設定タブ)の 「録画サービス制御」セクション(RecorderControlSection)からも実行できる。IPC recorder-control:send / recorder-control:get-settings 経由で Manager の RecorderControlClient に橋渡しされる。
Recorder: システムトレイメニュー
WingStats Recorder.exe / --recorder-mode のトレイ。実装は electron/services/recorder/RecorderTrayMenu.ts。
完全ヘッドレスなサービスとして最小構成。操作系・表示系ウィンドウは持たず、開くのは再ログイン窓のみ。
- ツールチップ:
WingStats Recorder — 監視 N 件 / ブラウザ自動化: 実行中|停止 (今日 M 試合)+(あれば)直近勝率行
右クリックメニュー
| 項目 | 種別 | 動作 |
|---|---|---|
状態: 監視 N 件 / ブラウザ ON|OFF | 見出し | 読み取り専用 |
直近◯戦 ◯勝◯敗 / 勝率 ◯% | 見出し | データ有時のみ |
| ───── | ||
| 🔑 今すぐログイン(再ログイン) | 通常 | Recorder が開く唯一のウィンドウ(storageState を持つのは Recorder のみ) |
| ───── | ||
| 今すぐ終了して常駐も解除 | 通常 | 終了し、かつ自動起動(常駐)も解除 |
| 終了 | 通常 | Recorder を終了(常駐設定は保持) |
取得・ブラウザ自動化・常駐・ゲーム検知・戦績窓・BP窓は Recorder のトレイから撤去された。 これらは Manager / Viewer から WS コマンドで操作する。
Viewer: システムトレイメニュー
WingStats Viewer.exe / --viewer-mode。役割再設計で新規にシステムトレイを取得した。実装は electron/services/viewer/ViewerTrayMenu.ts(配線は electron/main/viewerModeBootstrap.ts)。
- 起動すると読み取り専用の戦績ウィンドウ(
RecorderStatsWindowvariantviewer)を最前面に常駐させる - 表示系ウィンドウ(戦績窓・BAN/PICK 窓)を Viewer が所有。BP 窓は
bp-data/phase-changedを購読して BP 中に自動表示 matches.dbは読み取り専用。状態は Recorder の status snapshot(ViewerStatusPoller)から読む(Viewer は UserSettings を書かない)- instance lock を取らず多重起動を許容
右クリックメニュー
| 項目 | 種別 | 動作 |
|---|---|---|
状態: <接続状態> / 監視 N 件 / ブラウザ ON|OFF | 見出し | live / 接続待ち / Recorder 未起動 |
直近◯戦 … | 見出し | データ有時のみ |
| ───── | ||
| 📊 戦績ウィンドウを表示 | 通常 | Viewer 所有の戦績窓 |
| 戦績ウィンドウを最前面に固定(チェック) | viewerStatsAlwaysOnTop | |
| 🎯 BAN/PICK ウィンドウを表示 | 通常 | Viewer 所有の BP 窓 |
| BP 中に BAN/PICK を自動表示(チェック) | viewerBpAutoShow | |
| ───── | ||
| 今すぐ fetchSeasonOnly / 全件同期 / 全シーズン全件取得 / ブラウザ自動化を再起動 | 通常 | WS 委譲(不在なら起動→委譲) |
| 🔑 今すぐログイン(再ログイン) | 通常 | WS login |
| ───── | ||
| ブラウザ自動化 / ヘッドレス / 起動時 fetchSeasonOnly(チェック) | WS ba:*(設定値は UserSettings 読取) | |
| 常駐(Windows 起動時に自動起動)(チェック) | WS resident:*(状態は snapshot 由来) | |
| ゲーム検知で自動起動(チェック) | WS gameDetect:*(状態は snapshot 由来) | |
| ───── | ||
| Recorder を起動 | 通常 | Recorder 不在時の起動導線 |
| 終了 | 通常 | Viewer を終了 |
窓内の Pin ボタンからの最前面固定は従来どおり
recorder-stats:set-always-on-topIPC で行える。
参照ソース
| 対象 | 主要ファイル |
|---|---|
| Manager トレイ | electron/services/TrayService.ts / electron/main.ts(buildManagerOperationItems) |
| Manager Control UI | src/components/tabs/settings/components/RecorderControlSection.tsx |
| Recorder トレイ | electron/services/recorder/RecorderTrayMenu.ts / electron/main/recorderModeBootstrap.ts |
| Viewer トレイ / 窓 | electron/services/viewer/ViewerTrayMenu.ts / electron/main/viewerModeBootstrap.ts |
| WS コマンド | electron/services/recorder/recorderLiveCommands.ts / RecorderControlClient.ts |
| 強制起動 | electron/services/recorder/ensureRecorderRunning.ts / launchRecorderExe.ts |
| モード判定 | electron/services/recorder/detectRecorderMode.ts / electron/services/viewer/detectViewerMode.ts |