テナント
テナントは A2Flow の最上位の区切りです。ほとんどのレコードはちょうど 1 つのテナントに属し、ごく一部だけが意図的にその上に立ちます。そしてリクエストがテナントをまたぐことはありません。テナントのレコード自体を作ったり編集したりするのは管理作業なので、テナントを参照してください。このページで扱うのは、その境界がほかのすべてにとって何を意味するか、です。
何がテナントに属するか
| 範囲 | そこにあるもの |
|---|---|
| テナントに属する | エージェントスキル、ワークフローとその設計セッション、タスクテンプレート、ワークフロー実行とそのワークフローセッション、承認、シークレット、MCP サーバー、ツールモック、タグ、ユーザーグループ、そしてほとんどのユーザー |
| プラットフォームに属する | テナントのレコード自体、システム設定、スーパー管理者のアカウント、初期投入されるシステムユーザー |
ユーザーが属するテナントは高々 1 つです。ユーザーグループはちょうど 1 つに属します。だからグループが super_admin を付与することはできません。この役割はそもそもプラットフォーム全体のものだからです(実効ロールを参照)。初回起動時には Default テナントが投入され、初期の admin ユーザーがそこに入ります。初期の root ユーザーはプラットフォーム全体を対象とし、テナントを持ちません。
テナント境界
テナントに属する読み書きは、すべて呼び出し元のテナントの中で解決されます。ほかのテナントにしか存在しないレコードは HTTP 404 で返ります。403 ではありません。境界は存在を知らせるのではなく、隠すためにあるからです。これは URL に打ち込んだワークフロー ID でも、API に渡した ID でも同じで、テナントをまたいだ参照がレコードの実在を裏づけることは決してありません。
例外的に、レコードを返しもせず存在しないふりもしない読み取りが 1 つだけあります。名前の一括解決です。POST /api/v1/users/resolve-names は呼び出し元のテナント外のユーザーを応答から落とすので、UI は ID をそのまま表示します。ただし、どのテナントの中にもレコードを持ちうる 2 種類のアカウントにはラベルを付けます。名前をまとめて解決するを参照してください。
テナントとして振る舞う
プラットフォーム全体を対象とするスーパー管理者は自分のテナントを持ちませんが、見るべきものはたいていどこかのテナントに属しています。そこでアプリのヘッダーにテナント切り替えがあり、スーパー管理者にだけ表示されて、どのテナントとして振る舞うかを選べます。選択は再読み込みをまたいで記憶され、管理画面もチャットも含めてどこにでも適用されます。テナントを選んでいない状態では、テナント単位のリクエストは HTTP 403 で拒否されます。
テナントを切り替えてもロールは変わりません。どのテナントを選んでいても、スーパー管理者はロールのゲートを素通りします。
この切り替えが出るのは、自分のテナントを持たない呼び出し元だけです。テナントに属するユーザーは常に自分のテナントに閉じます。切り替えが送る X-Tenant-Id ヘッダーは、そうしたユーザーに対しては完全に無視されるので、手で付けても何も得られません。クライアント側から境界を抜け出す方法はありません。
全テナント
切り替えには全テナントという選択肢もあります。読み取り専用の管理一覧・詳細ページで、全テナントのデータを一度に閲覧できます。有効にすると、これらのページには一番左の列としてテナント列(と対応するフィールド)が増え、別テナントの行を区別できます。
ほかのユーザーを代理操作している間は、全テナントの選択は一時的に外れます。そのユーザー自身のテナントを選んだのと同じ表示になり、テナント列は出ません。代理操作をやめるとまた有効になります。
| 選択 | 読み取り | 書き込み | チャット履歴 | エージェント |
|---|---|---|---|---|
| 自テナント(暗黙。テナントに属するユーザー) | 自テナント | 自テナント | 自テナント | ✅ |
| 1 つのテナント(スーパー管理者) | そのテナント | そのテナント | そのテナント | ✅ |
| 全テナント(スーパー管理者) | 全テナント | ❌ 403 | 全テナント | ❌ 403 |
| 未選択(スーパー管理者) | ❌ 403 | ❌ 403 | ❌ 403 | ❌ 403 |
「チャット履歴」は GET /workflows/{id}/messages と GET /workflow-executions/{id}/messages です。スーパー管理者が他テナントのワークフローや実行を確認するときは、その会話も読めます。これらのチャットを動かすエージェントのエンドポイント(POST .../agent)は書き込みなので、常に具体的なテナントを 1 つ選んでいる必要があります。全テナントを選んでいるとき、ワークフロー ID はテナントに関係なく解決されるので、そこでは設計セッション自身のロールチェックがテナント境界の代わりを務めます。設計セッションを参照してください。