기능승인과 push

승인

push 요청이 고정한 commit을 확인하고 승인한다. 플랫폼이 몇 초 안에 push한다

승인에는 sessions:approve가 필요하다. 개인 key와 에이전트 key 모두 이 scope를 받을 수 있지만, 세션을 시작한 key는 그 세션의 push 요청을 승인하지 못한다. 다른 key나 사람이 승인한다. 세션을 돌리는 worker의 자격으로는 /v1을 부를 수 없으므로(401) 에이전트가 스스로 승인하지 못한다. 요청의 sessionId와 push(HTTP API는 SID, PUSH_ID, PUSH_COMMIT)를 쓴다. SDK에서 승인자 key를 따로 쓰려면 werft.withOptions({ apiKey })로 두 번째 클라이언트를 만든다.

승인하기

승인 본문의 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초마다 승인된 요청을 하나씩 집어 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 FORBIDDENkey에 sessions:approve가 없거나, 세션을 보기만 하고 승인할 사람(만든 사람, 에이전트 관리자, owner·admin)이 아니다
403 FORBIDDEN (details.refusal: self_approval)세션을 시작한 key로 승인했다. 실패 resolve_push receipt가 남는다. 다른 key나 사람이 승인한다

거절된 시도에도 receipt가 남는다. 오류 본문의 error.details.receipt_id(SDK는 APIError의 details.receipt_id)로 읽는다.

다음 단계

이 페이지