기능승인과 push

요청

세션이 만든 commit을 저장소의 agent/<session-id> 브랜치로 내보내 달라고 요청한다

세션은 저장소에 직접 push하지 않는다. 세션의 작업은 checkpoint에 commit으로 남고, 그 commit을 저장소로 내보내려면 push 요청을 만든다. sessions:approve를 가진 사람이 승인해야 플랫폼(API)이 push한다. 요청에는 sessions:write가 필요하다.

상태뜻
requested결정을 기다린다
approved → pushing승인됐고 플랫폼이 push하고 있다
pushed저장소에 브랜치가 생겼거나 갱신됐다
rejected거부됐다
failedpush하지 못했다. 이유는 receipt에 있다

파일을 바꾸는 세션 준비

SDK 예제는 SDK 설치에서 만든 werft 클라이언트를, HTTP API 예제는 서버 주소 API와 key KEY 셸 변수를 쓴다. 이 대본은 저장소의 README.md에 한 줄을 더하고, 권한 요청을 허락하면 turn이 끝난다. 세션을 만든 key로 허락하는 이 예제는 개발용 서버의 운영자 key에서만 된다. 웹 콘솔에서 발급한 key라면 허락에는 다른 key로 만든 클라이언트를 쓴다(승인용 key 따로 쓰기).

import { waitForTurn } from "@werft-ai/sdk";

const note = await werft.sessions.create({
  profile_id: "claude-coding-local",
  repository_id: "sample-app",
  message:
    'GATE-SPEC {"id":"note","steps":[{"tool":"Bash","input":{"command":"echo tested | tee -a README.md","description":"append to README.md"}}],"final":"updated README.md"}',
});
const sessionId = note.session_id;
await waitForTurn(werft, sessionId, note.turn_id, {
  onRequest: { permission: () => ({ action: "allow" }) },
});

요청하기

SDK는 세션 id만 넘기고, HTTP API는 기본으로 요청 본문에 빈 JSON 객체({})를 보낸다. 무엇을 보낼지는 요청하는 사람이 고르지 않는다. 플랫폼이 그때 세션의 최신 checkpoint와 그 commit, 브랜치 agent/<session-id>를 고정한다. 저장소는 repository_id를 빼면 세션을 만들 때 지정한 저장소다. 저장소 없이 시작한 에이전트 세션이 attach로 붙인 저장소를 보내려면 HTTP API 본문에 repository_id를 넣는다(SDK의 pushRequests.create는 아직 이 인자를 받지 않는다). 한 요청은 저장소 하나를 보내므로 저장소가 여럿이면 저장소마다 한 번씩 요청하고, 승인 규칙은 모든 저장소에 같다.

const push = await werft.sessions.pushRequests.create(sessionId);
console.log({
  state: push.state,
  repository_id: push.repository_id,
  checkpoint_revision: push.checkpoint_revision,
  target_branch: push.target_branch,
});
{
  state: 'requested',
  repository_id: 'sample-app',
  checkpoint_revision: 0,
  target_branch: 'agent/…'
}

응답은 201이다. 세션의 요청 목록은 pushRequests.list(GET /v1/sessions/{id}/push-requests)로, 요청 하나는 pushRequests.get(GET …/push-requests/{push_request_id})으로 본다.

응답뜻
409 PUSH_SOURCE_MISSING세션에 저장소나 checkpoint가 아직 없다
409 PUSH_REQUEST_OPEN열린 요청(requested·approved·pushing)이 이미 있다. 세션마다 하나다

다음 단계

  • 승인: 고정된 commit을 확인하고 승인한다
  • 거부

이 페이지