モニターのルート
ngrokのモニター入口の背後で配信する経路です(モバイルモニターを含む)。入口・Hostの検査・session・トンネルの関係はモバイルモニターにあります。接続設定のAPIはローカルの経路で、Web APIにあります。
モニターの入口の経路
| ルート | 内容 |
|---|---|
GET/HEAD / | /monitor/ へ308で転送する。ngrokの警告ページで「Visit Site」を押すと、このアドレスに戻るため。 |
GET/HEAD /monitor/ | モニターのHTML。トークン・session・ボードのデータは含まない。/monitorは/monitor/へリダイレクトする。 |
GET /monitor/api/session | Cookieの有効なsessionを知らせ、csrfToken・expiresAt・expiresInSecondsを返す。有効なsessionがなければ401 session_requiredで、sessionは開始しない。クロスサイトのSec-Fetch-Siteは403。 |
POST /monitor/api/unlock | 合言葉をsessionと交換する。本文はJSONの{"code":"1234"}で256バイトまで。公開OriginとSec-Fetch-Site: same-originが必要で、CSRFトークンは要らない。正しければCookieagboard_ngrok_sessionを設定し、csrfToken・expiresAt・expiresInSecondsを返す。間違いは手がかりを示さない403 unlock_failed。連続5回間違えたあとは、正しい合言葉も含むすべての試行が、接続を開始し直すまで429 unlock_lockedになる。Originやフェッチサイトの不備は403 forbidden、JSONと宣言されていない本文は415、256バイトを超える本文は413、解釈できない本文は400(これらは推測として数えない)。 |
POST /monitor/api/disconnect | sessionを終了し、そのCookieを消す(CSRFトークンと公開Originが必要)。{"disconnected": true}を返し、サインアウト先はない。そのあとも合言葉は使える。 |
GET/HEAD /monitor/assets/monitor/{name} | モニターのmanifestにある、内容から名前を付けたスクリプトとスタイルシートだけ。immutableでキャッシュさせ、受け付ける場合はgzipで送る。ほかの名前はno-storeの404。 |
GET/HEAD /logo-white.png | ヘッダーのロゴ。入口の検査は必要だが、sessionは要らない。 |
GET/HEAD /monitor/api/projects/{projectId}/summary | プロジェクトのSummary。タスク、進捗付きのエピック、problemsを持ち、本文は含みません。そのversionがETagになり、一致するIf-None-Matchには304を返します。存在しないプロジェクトは404 project_not_foundです。Web APIを参照してください。 |
GET/HEAD /monitor/api/projects/{projectId}/tasks/{id}/detail | タスクの本文・受入条件・履歴を、NDJSONのストリームで返します。?sections=documentか?sections=historyで一部だけ読めます。 |
GET/HEAD /monitor/api/projects/{projectId}/epics/{epicId}/detail | エピックの本文を、NDJSONのストリームで返します。 |
GET /monitor/api/events?project=<projectId> | ready(モニターのビルドIDを含む)・changed・resync・heartbeat・preferences(保存した言語とテーマ。変更のあとに送る)の専用SSE。projectは必須で、欠落または形式の誤りは422 invalid_value、存在しないプロジェクトは404 project_not_foundです。そのプロジェクトの変更だけを送ります。 |
GET /monitor/api/preferences | 保存した言語とカラーテーマ。PCのGET /api/preferencesと同じJSON。 |
PUT /monitor/api/preferences | 言語とテーマだけを保存する。locale・theme・両方のいずれか。回答と同じく、公開Origin・Sec-Fetch-Site: same-origin・CSRFトークンが必要。未知の項目と不正な値は422 invalid_preferences。 |
POST /monitor/api/projects/{projectId}/tasks/{id}/answer | 現在の依頼への回答だけ。 |
GET /monitor/api/projects/{projectId}/tasks/{id}/attachments/{attachmentId} | 所有する画像だけ。 |
GET/HEAD /monitor/api/projects/{projectId}/epics/{epicId}/attachments/{attachmentId} | 所有するエピックの画像だけ。 |
/monitor/api/は読み取りのrouterと、回答と言語・テーマの保存だけの書き込みrouterに分け、PCのAPIには合流させません。PCのrouterへのfallback、prefixを外すリダイレクト、メソッドの上書き、モニターの経路からPCの資産への別名はありません。- HEADは許可したJSONと画像のGETと同じ範囲で、SSEには設けません。未知の経路はHTMLへのfallbackなしの404、許可した経路で許可しないメソッドは405です。モニターの経路では、health・notify・archive、ほかの書き込み、ファイルの一覧を配信しません。
- PCのボードとそのAPIは、モニターの入口では配信しません。
- モニターにはプロジェクトの一覧がありません。
/monitor/api/projectsと、プロジェクト全体を返す/monitor/api/projects/{projectId}/boardは提供しません。モニターのアドレスは一つのプロジェクトを指し、どの読み取りも、パスまたは?project=からプロジェクトIDを受け取ります。IDは読む対象を選ぶもので、アクセス権ではありません。 - すべての要求は、まずHostの検査を通ります(失敗は理由を示さない403)。
sessionとunlockを除く/monitor/api/の経路は、そのうえで有効なsessionが必要で(なければ401session_required)、変更にはさらに公開Origin・同一オリジンのメタデータ・CSRFトークンが必要です。このエントリで受け付ける書き込みは、回答・言語とテーマの保存・切断の三つだけです。一覧にないパスは404です。

