機能承認と push

承認

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);
approved

push の結果を見る

プラットフォームは 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 null

waitForPushRequest は、リクエストが 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_MOVEDgit_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)で読む。

次のステップ

  • 拒否
  • receipt: リクエスト・承認・拒否・push の記録を読む

このページ