システム機能:多言語/テーマ/更新/起動時自動起動/HTTP API Server
テーマを dark に切り替えたのに、インターフェースはまだ明るい;ウィンドウを閉じたのに、プロセスはまだバックグラウンドで動いている;外部ツールに現在のアカウントを切り替えさせたいが、リバースプロキシを LAN に暴露したくない。
このレッスンでは、Antigravity Tools の「システム機能」に焦点を当てます:言語、テーマ、更新、トレイ/起動時自動起動、そして外部プログラムから呼び出すための HTTP API Server。
システム機能とは?
システム機能とは、Antigravity Tools がデスクトップアプリケーションとしての「製品化機能」です:インターフェース多言語とテーマ切り替え、更新チェックとアップグレード、ウィンドウを閉じた後のトレイ常駐と起動時自動起動、そして 127.0.0.1 のみにバインドされた HTTP API Server を外部プログラムに提供。
学んだ後できること
- 言語/テーマを切り替え、どれが「すぐに有効」かを明確にする
- 「ウィンドウを閉じる」と「プログラムを終了する」の違いを明確にし、トレイメニューで何ができるかを理解する
- 自動更新チェックのトリガー条件、間隔、永続化ファイルを理解する
- HTTP API Server を有効にし、
curlでヘルスチェックとアカウント切り替えを実行する
🎒 始める前の準備
- データディレクトリの場所を知っていること(初回起動で必須:データディレクトリ、ログ、トレイと自動起動 参照)
gui_config.jsonが設定永続化の唯一の真実ソースであることを知っていること(設定完全解説:AppConfig/ProxyConfig、永続化場所とホットアップデートの意味 参照)
コアコンセプト
これらの機能を 2 つのカテゴリに分けると、より覚えやすくなります:
- 「設定駆動」の機能:言語、テーマは
gui_config.jsonに書き込まれる(フロントエンドがsave_configを呼び出す)。 - 「独立永続化」の機能:更新設定と HTTP API 設定はそれぞれ別個の JSON ファイルを持つ;トレイとクローズ動作は Tauri 側で制御される。
さあやってみよう
ステップ 1:言語を切り替える(即時有効 + 自動永続化)
理由 言語切り替えは「再起動が必要」と誤解しやすいです。ここでの実装は:UI がすぐに切り替わる、同時に language を設定に書き戻す。
操作:Settings -> General を開き、言語ドロップダウンで言語を選択してください。
ほぼ同時に 2 つのことが起こります:
- UI がすぐに新しい言語になる(フロントエンドが直接
i18n.changeLanguage(newLang)を呼び出す)。 - 設定が永続化される(フロントエンドが
updateLanguage(newLang)を呼び出し、内部的にsave_configがトリガーされる)。
言語パックはどこから?
フロントエンドは i18next で多言語リソースを初期化し、fallbackLng: "en" を設定します。つまり:ある key の翻訳がない時、英語にフォールバックします。
ステップ 2:テーマを切り替える(light/dark/system)
理由 テーマは CSS だけでなく、Tauri ウィンドウの背景色、DaisyUI の data-theme、Tailwind の dark クラスにも影響します。
操作:Settings -> General でテーマを light / dark / system に切り替えてください。
確認すべきもの:
- テーマがすぐに有効になる(
ThemeManagerが設定を読み取り、document.documentElementに適用する)。 - テーマが
systemの時、システムのダーク/ライト変化がリアルタイムでアプリケーションに同期される(prefers-color-schemeをリッスン)。
Linux の 1 つの例外
ThemeManager は getCurrentWindow().setBackgroundColor(...) を呼び出してウィンドウ背景色を設定しようとしますが、Linux プラットフォームではこのステップをスキップします(ソースコードにコメントあり:透明ウィンドウ + softbuffer はクラッシュを引き起こす可能性があります)。
ステップ 3:起動時自動起動(そしてなぜ --minimized を持つか)
理由 起動時自動起動は「設定フィールド」ではなく、システムレベルの登録項目(Tauri autostart プラグイン)です。
操作:Settings -> General で、「Auto-start at login」を有効/無効に設定してください。
確認すべきもの:
- 切り替え時にバックエンド
toggle_auto_launch(enable)を直接呼び出す。 - ページ初期化時に
is_auto_launch_enabled()を呼び出し、実際の状態を表示する(ローカルキャッシュに依存しない)。
補足:アプリケーションが autostart プラグインを初期化するとき、--minimized パラメータが渡されるため、「起動時自動起動」は通常最小化/バックグラウンドで起動します(具体的な動作はフロントエンドがそのパラメータをどう処理するかによります)。
ステップ 4:「ウィンドウを閉じる」と「プログラムを終了する」を明確にする
理由 多くのデスクトップアプリは「閉じると終了」ですが、Antigravity Tools のデフォルト動作は「閉じるとトレイに隠れる」です。
知っておくべきこと:
- ウィンドウの閉じるボタンをクリックした後、Tauri はクローズイベントをインターセプトして
hide()し、プロセスを終了しません。 - トレイメニューには
Show/Quitがある:完全に終了したい場合、Quitを使用するべきです。 - トレイ表示テキストは
config.languageに従う(トレイ作成時に設定言語を読み取り翻訳テキストを取得;設定更新後、config://updatedイベントをリッスンしてトレイメニューを更新する)。
ステップ 5:更新チェック(自動トリガ + 手動チェック)
理由 更新は 2 つのものを同時に使用します:
- カスタムの「バージョンチェック」ロジック:GitHub Releases から最新バージョンを取得し、更新があるか判断する。
- Tauri Updater:ダウンロードとインストールを担当し、
relaunch()する。
このように使用できます:
- 自動チェック:アプリ起動後に
should_check_updatesを呼び出し、チェックが必要な場合はUpdateNotificationをポップアップし、すぐにlast_check_timeを更新する。 - 手動チェック:
Settingsページで「Check for Updates」をクリックする(check_for_updatesを呼び出し、UI で結果を表示)。
更新間隔はどこから?
バックエンドは更新設定をデータディレクトリの update_settings.json に永続化し、デフォルトで auto_check=true、check_interval_hours=24。
ステップ 6:HTTP API Server を有効にする(ローカルのみバインド)
理由 外部プログラム(VS Code プラグインなど)に「アカウント切り替え/クォータ更新/ログ読み取り」をさせたい場合、HTTP API Server はリバースプロキシポートより適しています:127.0.0.1 に固定バインドし、ローカルのみに公開されます。
操作:Settings -> Advanced の「HTTP API」領域で:
- 有効スイッチをオンにする。
- ポートを設定し、保存をクリックする。
確認すべきもの:UI に「再起動が必要」と表示されます(バックエンドは起動時のみ http_api_settings.json を読み取り、サービスを起動するため)。
ステップ 7:curl で HTTP API を検証する(ヘルス/アカウント/切り替え/ログ)
理由 反復可能な検証クローズドループが必要:health を通し、アカウントを一覧表示し、切り替え/更新をトリガーして、それらが非同期タスクであることを理解する必要があります。
デフォルトポートは 19527 です。ポートを変更した場合、以下の 19527 を実際の値に置き換えてください。
# ヘルスチェック
curl -sS "http://127.0.0.1:19527/health" && echo
# アカウント一覧(クォータ摘要を含む)
curl -sS "http://127.0.0.1:19527/accounts" | head -n 5
# 現在のアカウントを取得
curl -sS "http://127.0.0.1:19527/accounts/current" | head -n 5
# アカウント切り替えをトリガー(注意:202 を返し、バックグラウンドで非同期実行)
curl -sS -i \
-H 'Content-Type: application/json' \
-d '{"account_id":"<account_id>"}' \
"http://127.0.0.1:19527/accounts/switch"
# すべてのクォータ更新をトリガー(同様に 202、非同期実行)
curl -sS -i -X POST "http://127.0.0.1:19527/accounts/refresh"
# プロキシログ読み取り(limit/offset/filter/errors_only)
curl -sS "http://127.0.0.1:19527/logs?limit=50&offset=0&filter=&errors_only=false" | head -n 5 # ヘルスチェック
Invoke-RestMethod "http://127.0.0.1:19527/health"
# アカウント一覧
Invoke-RestMethod "http://127.0.0.1:19527/accounts" | ConvertTo-Json -Depth 5
# 現在のアカウントを取得
Invoke-RestMethod "http://127.0.0.1:19527/accounts/current" | ConvertTo-Json -Depth 5
# アカウント切り替えをトリガー(202 を返す)
$body = @{ account_id = "<account_id>" } | ConvertTo-Json
Invoke-WebRequest -Method Post -ContentType "application/json" -Body $body "http://127.0.0.1:19527/accounts/switch" | Select-Object -ExpandProperty StatusCode
# すべてのクォータ更新をトリガー(202 を返す)
Invoke-WebRequest -Method Post "http://127.0.0.1:19527/accounts/refresh" | Select-Object -ExpandProperty StatusCode
# プロキシログ読み取り
Invoke-RestMethod "http://127.0.0.1:19527/logs?limit=50&offset=0&filter=&errors_only=false" | ConvertTo-Json -Depth 5確認すべきもの:
/healthが{"status":"ok","version":"..."}スタイルの JSON を返す。/accounts/switchが 202(Accepted)を返し、「task started」を提示する。実際の切り替えはバックグラウンドで実行される。
チェックポイント ✅
- 言語/テーマが「すぐに有効」な理由、HTTP API ポートは再起動が必要な理由を説明できる
- ウィンドウを閉じても終了しない理由、どこから本当に終了するかを説明できる
curlで/healthと/accountsを通し、/accounts/switchが非同期であることを理解できる
よくある落とし穴
- HTTP API Server は
127.0.0.1に固定バインドされ、proxy.allow_lan_accessとは別のものです。 - 更新チェックの「チェックするかどうか」ロジックはアプリ起動時に決定される;一度トリガーされると、最初に
last_check_timeを更新し、その後チェックが失敗しても短時間で繰り返しポップアップしない。 - 「ウィンドウを閉じても終了しない」は設計通り:プロセスリソースを解放したい場合、トレイの
Quitを使用してください。
このレッスンのまとめ
- 言語:UI 即時切り替え + 設定書き戻し(
i18n.changeLanguage+save_config) - テーマ:
ThemeManagerがdata-theme、darkクラス、ウィンドウ背景色に統一的に適用(Linux は例外) - 更新:起動時に
update_settings.jsonに基づいてポップアップするかを決定し、インストールは Tauri Updater が担当 - HTTP API:デフォルトで有効、ローカルのみアクセス可能、設定永続化
http_api_settings.json、ポート変更は再起動が必要
次のレッスンの予告
次のレッスンでは サーバーデプロイ:Docker noVNC vs Headless Xvfb(advanced-deployment) に入り、デスクトップ版を NAS/サーバーに移動して実行します。
付録:ソースコード参考
クリックしてソースコードの場所を展開
更新日時:2026-01-23
| テーマ | ファイルパス | 行番号 |
|---|---|---|
| i18n 初期化とフォールバック | src/i18n.ts | 1-67 |
| Settings:言語/テーマ/起動時自動起動/更新設定/HTTP API 設定 | src/pages/Settings.tsx | 16-730 |
| App:言語同期 + 起動時更新チェックトリガ | src/App.tsx | 52-124 |
| ThemeManager:テーマ適用、system theme リッスン、localStorage 書き込み | src/components/common/ThemeManager.tsx | 1-82 |
| UpdateNotification:更新チェック、自動ダウンロードインストールと relaunch | src/components/UpdateNotification.tsx | 1-217 |
| 更新チェック:GitHub Releases + check interval | src-tauri/src/modules/update_checker.rs | 1-187 |
トレイ:言語でメニュー生成 + config://updated リッスン更新 | src-tauri/src/modules/tray.rs | 1-255 |
設定保存:config://updated 発行 + 実行中のリバースプロキシホットアップデート | src-tauri/src/commands/mod.rs | 296-334 |
| 起動時自動起動コマンド:toggle/is_enabled(Windows disable 互換) | src-tauri/src/commands/autostart.rs | 1-39 |
| Tauri:autostart/updater 初期化 + ウィンドウクローズを hide に変換 + HTTP API 起動 | src-tauri/src/lib.rs | 50-160 |
| HTTP API:設定永続化 + ルート(health/accounts/switch/refresh/logs)+ 127.0.0.1 のみバインド | src-tauri/src/modules/http_api.rs | 1-95 |
| HTTP API:Server バインドとルート登録 | src-tauri/src/modules/http_api.rs | 51-94 |
| HTTP API 設定コマンド:get/save | src-tauri/src/commands/mod.rs | 773-789 |