通知
Libre WebUI はユーザーごとの永続的な通知受信トレイを保持します。メンション、ダイレクトメッセージ、共有、オートメーションの失敗、カレンダーのリマインダーなど、チームでの出来事を、該当ページを閉じている人にも届けます。
ステータスのポップアップ
変更の保存や Git 操作の完了といった短いステータスメッセージは、ページ上部付近に表示されます。ポップアップは、ポインターでもキーボードでも 閉じる ボタンで消せます。ポインターを重ねている間はメッセージが表示されたままになるので、落ち着いて読めます。ポップアップを閉じてもメッセージが消えるだけで、元の操作は現在の状態のまま変わりません。
受信トレイ
通知は、まずデータベース行として保存されます。タイトルと本文は保存時に暗号化され、ユーザー 1 人あたり 500 件を上限として古いものから削除されます。任意のソースキーによる重複排除もできるため、同じ通知を繰り返し発行してもベルを埋め尽くさず、1 件にまとめられます。RESTful インターフェースでは、一覧表示、未読数の取得、既読化(1 件またはすべて)、削除ができます。
ライブ配信では、ユーザーごとの永続イベントストリーム notify:<userId> を GET /api/notifications/events(SSE)経由で利用します。ストリームの ID は認証済みセッションから取得し、クライアント入力からは決して取得しません。SQL 受信トレイが正本であり、イベントを受信できなかった場合は、ストリームを再生するのではなく一覧を読み取って回復します。
通知が生成される場面
| 種類 | 生成条件 |
|---|---|
channel-dm | 誰かがあなたにダイレクトメッセージを送信したとき |
channel-mention | チャンネルで誰かがあなたを @mentions したとき、またはあなたのメッセージへ返信したとき |
channel-invite | あなたがチャンネルに追加されたとき |
share | 誰かがあなたとリソースを共有したとき |
automation-failed | あなたのオートメーションの 1 つが失敗したとき(通知を無効にしている場合を除く) |
calendar-reminder | リマインダー間隔を指定したイベントが通知時刻に達したとき |
work-run-finished | 雇用した Work エージェントの 1 つが実行を完了したとき |
work-run-attention | 雇用したエージェントが入力待ちで停止したとき、またはエラーになったとき |
work-takeover | Work エージェントから画面の引き継ぎを求められたとき |
work-approval | Work の実行が、副作用を伴うアクションの承認を待っているとき |
system | インスタンス全体のお知らせ |
通知は、影響を受けるユーザーだけに必ず発行されます。チャンネルのメンバーでないユーザー名をメンションしても、通知は生成されません。
通知は自動化を発火させることもできます。event トリガーを持つ自動化は、選択した種類の通知がオーナーに届くたびに実行され、自動化ごとに 1 分間のクールダウンで制限されます。
送信 Webhook
管理者は、チームイベントを受信する Webhook の送信先を登録できます。
- 外向き通信の保護。 送信先にはツールサーバーと同じ宛先ポリシーが適用されます。URL は完全一致で、リダイレクトは許可されません。管理者が
TOOLS_PRIVATE_NETWORK_ALLOWLISTでホストを明示的に許可しない限り、プライベートアドレスやリンクローカルアドレスも禁止されます。配信のたびにホスト名を再解決し、再確認します。 - 署名。 シークレットが設定されている場合、すべての配信に
X-Libre-Signature: sha256=<hmac>が付きます。これは実際の本文全体から計算されます。 - 秘匿化。 エンベロープに含まれるのは、イベント種別、通知種別、タイトル、識別子、タイムスタンプです。通知本文、メッセージ内容、プロンプト、ドキュメントがインスタンスの外へ出ることはありません。
- 永続性。 配信は、回数に上限のある再試行付きの永続ジョブとして実行されます。受信側の 5xx 応答は再試行し、4xx 応答は受信側による最終判断として扱い終了します。
- スコープ。 各送信先は、特定の通知種別(または
*)を購読します。
ブラウザプッシュ
設定 → 通知で、このブラウザを Web Push に登録できます。タブを閉じていても、メンション、共有、リマインダー、完了した作業がデバイスへ届きます。実装には標準仕様だけを使い、自己完結しています。
- VAPID(RFC 8292)。 サーバーは ES256 鍵ペアで各配信に署名します。鍵ペアは一度だけ生成して暗号化保存するか、
VAPID_PUBLIC_KEY/VAPID_PRIVATE_KEYで固定します(VAPID_SUBJECTは連絡先クレームを設定します)。ブラウザベンダーのプッシュエンドポイントを除き、第三者のプッシュライブラリやサービスアカウントは使用しません。 - 暗号化ペイロード(RFC 8291)。 各メッセージはインスタンスを出る前に、デバイス固有の鍵を使った aes128gcm で暗号化されます。プッシュサービスは読み取れない暗号文だけを中継します。
- デバイス単位、セッションへの紐付け。 サブスクリプションは、それを作成したブラウザと、そのブラウザの認証セッションに属します。セッションからサインアウトすると(「他のセッションからサインアウト」した場合も)、プッシュ登録も削除されます。エンドポイントは鍵付き検索トークンとともに暗号化して保存され、公開 HTTPS 宛先でなければなりません。Webhook と同じ外向き通信の安全対策が適用されます。
- 永続性。 プッシュ配信は、回数に上限のある再試行付きの永続ジョブとして実行されます。プッシュサービスからサブスクリプションが消失したとの応答(404/410)があれば、その登録を削除します。
- ペイロードには、通知タイトル、任意の本文、種類、リンク先が含まれます。秘匿化の方針は受信トレイと同じです。
プッシュには、本番アプリ(サービスワーカーが登録されるのは本番だけ)と安全なオリジンが必要です。オフラインシェルとインストール機能も同じサービスワーカーが提供します。アプリマニフェストにより Libre WebUI をインストール可能にし、オフライン時のナビゲーションはキャッシュ済みシェルへフォールバックし、ハッシュ付きビルドアセットは不変としてキャッシュします。API トラフィックは一切キャッシュしません。
メール
メールは 3 つ目の配信チャネルであり、管理者による設定が必要な唯一の手段です。設定 → ユーザー管理 → アクセスとポリシー → メール通知では、送信用の SMTP サーバーを 1 つ設定します。ホスト、ポート、接続のセキュリティ(STARTTLS、暗黙的 TLS、または信頼できるネットワーク向けの none)、任意の認証情報、送信者アドレス、リンクに使う公開 URL です。環境変数の SMTP_* は、コンテナデプロイ向けに同じ項目の初期値を与えます。UI で保存した値のほうが優先されます。パスワードは暗号化して保存され、ブラウザーへ返されることはありません。テスト送信は、管理者自身のアドレス(または任意に入力したアドレス)へメッセージを届け、ユーザーが実際に利用する前に一連の流れが機能することを確認できます。
管理者は ライト または ダーク のメールテンプレートも選択でき、保存前にプレビューできます。既定はライトです。保存したプリセットは、Markdown の結果を含め、このインスタンスのすべての通知とテストメールに適用され、各ユーザーのインターフェーステーマとは独立しています。プレビューは SMTP に接続せず、メールを送信せず、ジョブをキューに入れずにサンプル内容を表示します。プリセットの参照や変更、プレビューの要求ができるのは管理者だけです。組み込みのプリセットは本文、リンク、コードブロック、ボタンを読みやすく保ちます。カスタム HTML テンプレートは受け付けません。メールクライアントは、独自の表示設定に応じて色を調整する場合があります。
スイッチをオンにすると、各ユーザーは設定 → 通知 → メール通知で、自分の受信箱に何を届けるかを選べます。
- チャンネルでのメンション: チャンネルで自分がメンションされたメッセージを、プレビューとチャンネルへのリンクとともに届けます。
- 自動化の実行結果: 各自動化の実行結果を、成功・失敗を問わず届けます。チャットの実行ではアシスタントの返信そのもの(最大数千文字)を、Work の実行ではタスクのステータス行を、失敗時はエラー内容を届けます。リンクを開くと、結果のチャットまたはタスクが開きます。
どちらのスイッチも、ユーザー自身がオンにするまでは無効です。また、アカウントにメールアドレスが登録されている場合にのみ機能します。メールアドレスは、サインアップ時にアカウント保有者が設定するか、管理者がユーザー管理画面から追加します。メッセージは Web Push と同じ永続ジョブランタイムを通じて送信され、一時的な配信エラーに対しては再試行回数に上限が設けられています。SMTP クライアントは小さな組み込み実装(EHLO、STARTTLS、AUTH PLAIN または LOGIN)で、モードが明示的に none でない限り、暗号化されていない接続で認証情報を送信することはありません。すべてのメッセージには、プレーンテキスト部分と、Web サイトと同じ見た目の HTML 版があります。Libre WebUI のワードマーク、内容を収めた 1 枚のカード、対象へのコーラル色のボタン、設定 → 通知へ戻るフッターです。自動化の実行結果は Markdown(見出し、リスト、強調、コード、http(s) 宛先のみへのリンク)としてレンダリングされ、それ以外はすべてエスケープされます。外部画像として読み込まれるのは librewebui.org から配信されるロゴだけです。トラッキングは行いません。
境界
- 種類別のユーザー設定はまだ実装されていません。オートメーションは自身の通知設定に従い、チャンネルを退出するとそのチャンネルからの通知は停止します。