요청
세션이 만든 commit을 저장소의 agent/<session-id> 브랜치로 내보내 달라고 요청한다
세션은 저장소에 직접 push하지 않는다. 세션의 작업은 checkpoint에 commit으로 남고, 그 commit을 저장소로 내보내려면 push 요청을 만든다. sessions:approve를 가진 사람이 승인해야 플랫폼(API)이 push한다. 요청에는 sessions:write가 필요하다.
| 상태 | 뜻 |
|---|---|
requested | 결정을 기다린다 |
approved → pushing | 승인됐고 플랫폼이 push하고 있다 |
pushed | 저장소에 브랜치가 생겼거나 갱신됐다 |
rejected | 거부됐다 |
failed | push하지 못했다. 이유는 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)이 이미 있다. 세션마다 하나다 |