メインコンテンツまでスキップ

セーフモード

セーフモードはビジュアルレイヤーの復旧メカニズムです: サードパーティのテーマとプラグインを無効化し、インターフェースが常に動作状態に戻るようにします。

セーフモードが行うこと

セーフモードは URL の ?safe=1 で有効化されます。パッケージコードが読み込まれる前に処理されます:

  • サードパーティのテーマ CSS とトークンオーバーライドはドキュメントに追加されません。
  • レガシーエントリポイントを含む、サードパーティのプラグインエントリポイントは決して実行されません。
  • 組み込みテーマと組み込みプラグインランタイムはアクティブなままです。

インターフェースは、常に存在する組み込みのライトとダークのトークンにフォールバックします。セーフモードを抜けると、以前保存されたアクティブなテーマとプラグインの状態が復元されます — 抜けても選択は変わりません。

壊れたテーマが復旧をブロックできない理由

いくつかの保証がユーザーを壊れたテーマから守ります:

  • 適用前のプレビュー — テーマは有効化前にプレビューされ、パッケージのインストールが自動で有効化することはありません。
  • セーフモードはパッケージより先?safe=1 はテーマレジストリが参照される前に処理されるため、CSS がレンダラーをクラッシュさせるテーマでも読み込まれることはありません。
  • リセットボタン — リセットアクションは組み込みテーマに戻し、ランタイム CSS リンクを削除し、インラインの --st-* オーバーライドをクリアします。アクティブなテーマの削除も保存されたテーマ選択をリセットします。
  • テーマは設定を隠せない — ナビゲーションレールは常に設定項目に到達可能な状態を保ちます。省略されたシステム項目は標準順序で復元されるためです。セーフモードでは組み込みのレール順序が使われ、メニュートグルは利用可能なままです。
  • コード実行なし — テーマには JavaScript がまったく含まれません。CSS、トークン、宣言型レイアウトだけなので、セーフモードが効く前に実行されるテーマコードはありません。

テーマパッケージの制限

テーマパッケージはチャット、API キー、ファイルシステムへのアクセスを決して受け取りません。スタイルシートは禁止構造(@import、リモート URL、javascript: URL、expression()!important など)について受け入れ前に検証され、トークンは安全な CSS 値でなければなりません。Theme SDK には実行可能なエントリポイントはありません。

プラグインのセーフモード

同じスイッチがサードパーティのプラグインを無効化します。プラグインサンドボックス、プロセス分離、ホスト強制のクリーンアップはランタイムレイヤーで、セーフモードは信頼できないコードがそもそも読み込まれないようにする二重の保険スイッチです。プラグイン側の詳細はプラグインのサンドボックス化 を参照してください。

セーフモードのプログラム的チェック

@neotavern/theme-sdk パッケージは getSafeModeFromSearch(search) をエクスポートします。これは URL の検索文字列を解析し、?safe=1 が存在するかどうかを返します。ホストはパッケージ CSS とトークンオーバーライドを読み込む前の単一のゲートとしてこれを使用し、同じ関数は代替ホストでも利用できます。

セーフモードで利用可能なままのシェル領域はシェルコントラクト を参照してください。