5. Phase 3: 세션 라이프사이클 및 연결 (Session & I/O)
세션 생명주기: INIT → RUNNING → DETACHED(소켓 단절 시) → TERMINATED
5.1. 세션 초기화 및 재연결 (Session Initialization)
신규 에이전트 실행 또는 DETACHED 상태 프로세스에 WSS 바인딩을 위한 티켓을 발급한다.
Endpoint: POST /v1/session/init (Local Client 제공)
Request:
{
"session_id": "String (필수, UUID v4)",
"agent_name": "String (reattach: false 시 필수)",
"workspace_path": "String (reattach: false 시 필수)",
"ticket": "String (필수, WSS 연결 인증용 난수 티켓)",
"reattach": "Boolean (선택, 기본값 false. true 시 기존 구동 중 프로세스 바인딩)",
"last_sync_timestamp": "String (선택, ISO 8601)",
"last_message_id": "String (선택, UUID)"
}
제약 조건: reattach: true이나 해당 session_id가 존재하지 않거나 종료된 경우 404 Not Found 반환 (MUST).
Config 바인딩 제약 조건: 마스터 서버는 reattach: false로 세션을 초기화할 때, §4.1.8에 따라 양쪽 Config Scope(limits, capabilities)의 최신 스냅샷을 해당 세션에 바인딩해야 한다 (MUST). 양쪽 스코프의 초기 동기화(§4.1.2)가 완료되지 않은 클라이언트에 대해서는 세션 초기화를 시도해서는 안 된다 (MUST NOT).
5.2. 세션 명시적 종료 (Session Termination)
Endpoint: DELETE /v1/session/{session_id} (Local Client 제공)
제약 조건: 클라이언트는 자식 프로세스에 SIGTERM을 전송하고, 5초 내 종료되지 않으면 SIGKILL로 강제 종료 후 메모리 버퍼 및 소켓을 파기해야 한다 (MUST).
5.3. WebSocket 연결 수립 (WebSocket Upgrade)
Connection URI: wss://{client_address}/v1/ws/stream?ticket={ticket}&session_id={session_id}
인가 절차 (MUST):
- 클라이언트는 HTTP Upgrade 요청 수신 시 HTTP 헤더의
Sec-WebSocket-Protocol을 확인해야 한다. RAWP-DPS 1.0 적용 시rawp-dps-1.0을 우선 수락하고, 미지원 시rawp-1.0으로 폴백한다. 양측 모두 미지원 시426또는400을 반환해야 한다. - Query Parameter의
ticket과session_id를 검증하고, 만료되거나 불일치 시401 Unauthorized를 반환 후 연결을 거절한다. - 사용된 티켓은 1회 사용 시 즉시 무효화(Burn)해야 한다.
변경 사항: RAWP-DPS 1.0 적용에 따라
Sec-WebSocket-Protocol협상 절차가 확장되었다.rawp-dps-1.0이 우선이며, 레거시 호환을 위해rawp-1.0도 수락 가능하다. 자세한 프로토콜 협상 규칙은 RAWP-DPS 1.0 §1.3을 참조한다.