セーフモード
セーフモードはビジュアルレイヤーの復旧メカニズムです: サードパーティのテーマとプラグインを無効化し、インターフェースが常に動作状態に戻るようにします。
セーフモードが行うこと
セーフモードは 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 とトークンオーバーライドを読み込む前の単一のゲートとしてこれを使用し、同じ関数は代替ホストでも利用できます。
セーフモードで利用可能なままのシェル領域はシェルコントラクト を参照してください。