承認
push リクエストが固定した commit を確認して承認する。プラットフォームが数秒以内に push する
承認には sessions:approve が必要である。個人キーとエージェントキーのどちらもこの scope を受け取れるが、セッションを開始したキーはそのセッションの push リクエストを承認できない。別のキーか人が承認する。セッションを実行する worker の認証情報では /v1 を呼び出せないため(401)、エージェントは自分で承認できない。リクエストの sessionId と push(HTTP API は SID、PUSH_ID、PUSH_COMMIT)を使う。SDK で承認用のキーを別に使うには、werft.withOptions({ apiKey }) で 2 つ目のクライアントを作る。
承認する
承認の本文の git_commit は、リクエストが固定した commit と同じでなければならない。承認する人が、何を承認するのかを確認したことを示す印である。
const approved = await werft.sessions.pushRequests.approve(sessionId, push.id, {
git_commit: push.git_commit,
});
console.log(approved.state);approvedpush の結果を見る
プラットフォームは 3 秒ごとに、承認されたリクエストを 1 件ずつ取り上げて push する。リクエストが pushing を経て pushed または failed になるまで待つ。
import { waitForPushRequest } from "@werft-ai/sdk";
const done = await waitForPushRequest(werft, sessionId, push.id);
console.log(done.state);
if (done.push_receipt_id) {
const receipt = await werft.receipts.get(done.push_receipt_id);
const result = receipt.result as { refusal?: string | null } | null;
console.log(receipt.operation, receipt.status, result?.refusal);
}pushed
push succeeded nullwaitForPushRequest は、リクエストが pushed・failed・rejected になるまで待つ。
ローカルスタックの sample-app はスタック内の Git サーバーに GitHub App として登録されているため、pushed になる。receipt の result に remote_ref(refs/heads/agent/<session-id>)と previous_commit が残る。書き込める GitHub App の認証情報がないリポジトリは no_push_credential で終わる。
プラットフォームは、承認した commit をそのブランチの新しい先端として送る(git push <commit>:<ブランチ>)。そのブランチにまだない祖先 commit、つまりセッションが先に作ってまだ push していない commit も一緒に上がる。承認するときは、固定された commit だけでなく、リモートブランチ(ない場合はデフォルトブランチ)からその commit までの変更全体を確認する。force push はしない。デフォルトブランチには送らない。
refusal | 意味 |
|---|---|
no_push_credential | リポジトリに push の認証情報がない |
catalog_changed | リクエストの後に、運用者がリポジトリの設定を変更した。新しくリクエストする |
non_fast_forward | リモートブランチがこの commit の祖先ではない |
default_branch, target_refused | デフォルトブランチ、または agent/<session-id> ではないブランチである |
push_failed | トークン発行の失敗、リモートの拒否、ネットワークエラー |
承認が拒否されるとき
| レスポンス | 意味 |
|---|---|
409 CHECKPOINT_MOVED | git_commit が固定された commit と異なる、またはリクエストの後にセッションが checkpoint を残し直した。このリクエストは拒否して、新しくリクエストする |
409 PUSH_REQUEST_RESOLVED | すでに承認または拒否したリクエストである |
403 FORBIDDEN | キーに sessions:approve がない、またはセッションを見ているだけで承認する人(作った人、エージェントの管理者、owner・admin)ではない |
403 FORBIDDEN(details.refusal: self_approval) | セッションを開始したキーで承認した。失敗した resolve_push receipt が残る。別のキーか人が承認する |
拒否された試行にも receipt が残る。エラー本文の error.details.receipt_id(SDK は APIError の details.receipt_id)で読む。