プラグイン権限
権限は、ユーザーがプラグインに何を許可するかを決めるメカニズムです。チャット履歴の読み取りからネットワークリクエストまでを対象とします。
権限モデル
権限はケイパビリティに名前を付ける文字列です。マニフェストでの宣言はリクエストであり、自動アクセスではありません: プラグインがアクティブになる前に、ユーザーは要求されたすべての権限を確認する必要があり、ホストは使用のたびに付与を強制します。
組み込みセットは安定したバージョン管理されたコントラクトです:
| 権限 | 付与されるもの |
|---|---|
chat.read | チャットメッセージとそのメタデータを読む |
chat.write | チャットメッセージを作成または変更する |
characters.read | キャラクターとキャラクターカードを読む |
characters.write | キャラクターを作成または変更する |
lorebook.read | ロアブックエントリを読む |
lorebook.write | ロアブックエントリを作成または変更する |
prompt.inspect | 組み立てられたプロンプトを検査する |
prompt.modify | プロンプトを変更するか、生成出力を後処理する |
providers.register | プロバイダーアダプターとトークナイザーを登録する |
ui.toolbar | ツールバーアクションを追加する |
ui.sidebar | サイドバーパネルを追加する |
ui.messageActions | メッセージアクションを追加する |
ui.shell | シェルスロットにコンテンツを追加する |
clipboard.read | クリップボードを読む |
clipboard.write | クリップボードに書き込む |
notifications | 通知を表示する |
server.routes | バックエンドルートをマウントする |
legacy.trusted | 信頼されたコンテキストで文書化された SillyTavern レガシーコードを実行する |
スコープ付き権限
一部の権限は kind:scope として書かれるスコープを持ちます:
network:<hostname>— 特定のホストからの取得権限。例:network:api.example.com。付与されていないホストへのリクエストは拒否されます。network:*— 任意のホストからの取得を許可するワイルドカード。ホストはこれを完全なネットワークアクセスとして扱い、同意 UI は強化された警告付きで表示します。具体的なホストを列挙することを推奨し、ワイルドカードを要求するプラグインの公開は推奨されません。files:plugin— プラグイン自身のデータディレクトリ内での読み書き。files:user-selected— ユーザーが明示的に選択したファイルへのアクセス。
hasPermission は付与されたセットを必須権限に対してチェックし、parsePermission は kind:scope 文字列を部分に分割します。validatePermissions 関数は空、重複、未知の権限などの不正な文字列を拒否します。
付与の強制方法
権限の宣言だけでは不十分で、ホストは強制ポイントで付与を適用します:
- UI 登録はマウント前に
ui.*権限をチェックします。 - ルートは
server.routesをチェックします。 - 権限チェック付きの
fetchはnetwork:<host>をチェックします。 - 仮想ファイルシステムは
files:*をチェックします。 - プロバイダーとコンテキスト API は
providers.registerとprompt.modifyをチェックします。
ケイパビリティカーネル(@neotavern/plugin-sdk の kernel 名前空間)は、Web ホストとサーバーの両方で付与をチェックする共有レイヤーです。ブラウザとバックエンドは常に同じ実効権限を見ることになります。付与は単調増加のリビジョンで保存され、ブートストラップハンドシェイク中にサンドボックスへ配信され、実行時に取り消せます。実行中の操作は CAPABILITY_REVOKED エラーで完了し、開いているハンドルはホストが閉じます。
インストール時の同意とアップデート時の再同意
インストールは要求された権限の完全な一覧を表示します。プラグインはすべての権限を確認するまで needs-consent 状態のままで、パッケージが npm 依存関係を同梱する場合、UI は依存関係の一覧を表示します。
プラグインのアップデートは権限チェックにとって新しいインストールです: ホストは diffPermissions で前のマニフェストと新しいマニフェストの差を計算します。アップデートが権限を追加する場合:
- プラグインのランタイムは即座に無効化されます;
- ユーザーに新しい権限への同意が求められます;
- 同意が得られるまでプラグインは無効のままです。
権限の削除に同意は不要です。一般則: 付与された権限のセットは、明示的なユーザーの決定なしには決して拡大しません。権限定数とヘルパーの完全な一覧は、生成されたプラグイン SDK リファレンス を参照してください。