Skip to content

常駐トレイメニュー一覧(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)。

  1. --recorder-mode フラグ、または exe 名に recorder を含む → Recorder
  2. (Recorder でない場合)--viewer-mode フラグ、または exe 名に viewer を含む → Viewer
  3. それ以外 → 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:onoff/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.tsbuildManagerOperationItems)。

  • トレイアイコン左クリック → ウィンドウを前面に表示(最小化されていれば復元)
  • × ボタンでトレイに最小化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)。

  • 起動すると読み取り専用の戦績ウィンドウ(RecorderStatsWindow variant viewer)を最前面に常駐させる
  • 表示系ウィンドウ(戦績窓・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-top IPC で行える。


参照ソース

対象主要ファイル
Manager トレイelectron/services/TrayService.ts / electron/main.tsbuildManagerOperationItems
Manager Control UIsrc/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