콘텐츠로 이동

ACP stdio 동시 디스패치

ACP stdio 연결은 session/prompt와 mcp/* 요청을 동시에 처리합니다. 프롬프트가 오래 실행되어도 취소, 모드 변경, MCP 통신을 처리할 수 있습니다(이슈 #2380).

요청 순서

초기화, 인증, 세션 생성과 불러오기, 모드 변경, 취소는 수신 순서대로 실행됩니다. 다음 요청을 받기 전에 연결의 기준 컨텍스트를 갱신합니다. 백그라운드 요청은 컨텍스트의 스냅샷을 사용하며, 세션 저장소와 세션 핸들, 애플리케이션 상태, 전송 계층을 공유합니다.

백그라운드 요청의 응답 순서는 요청 순서와 다를 수 있으므로, 클라이언트는 JSON-RPC id로 응답을 연결해야 합니다. 한 프롬프트의 session/update 알림은 해당 프롬프트 안에서 순서를 유지합니다. session/cancel 알림에는 응답하지 않습니다.

MCP 요청도 동시에 실행되므로, 해당 브리지로 메시지를 보내기 전에 mcp/connect의 성공 응답을 기다리세요.

동시 처리 제한

  • 세션마다 프롬프트 하나만 실행할 수 있습니다. 첫 프롬프트가 끝나기 전에 같은 세션에 보낸 두 번째 프롬프트에는 JSON-RPC 오류 -32000을 반환합니다. 대화 이력에 여러 턴이 겹쳐 기록되는 것을 방지합니다.
  • stdio 연결 하나에서 프롬프트와 MCP 요청을 합쳐 최대 32개까지 동시에 실행합니다. 초과 요청에는 즉시 -32000을 반환합니다.
  • 제어 요청은 수신 루프에서 순서대로 처리하므로, 백그라운드 요청 제한에 도달해도 사용할 수 있습니다. 긴 프롬프트 뒤에 요청을 대기시키지 않습니다.

취소와 종료

프롬프트는 백그라운드 태스크를 시작하기 전에 세션의 취소 토큰을 예약합니다. 따라서 바로 뒤에 취소가 도착하면, 태스크가 아직 실행되지 않았더라도 해당 프롬프트를 취소합니다. 취소 시 다음 턴을 위한 새 토큰을 설치하며, 실행 중인 프롬프트는 완료될 때까지 기존 토큰을 유지합니다.

표준 입력의 EOF나 전송 오류가 발생하면, 실행 중인 프롬프트를 취소하여 정상 사용량 기록 절차가 실행되도록 합니다. 백그라운드 태스크는 최대 5초 동안 종료할 수 있으며, 이후 남은 태스크를 중단하고 종료를 확인합니다. 세션 예약은 완료, 패닉, 중단 시 해제됩니다. 실행 중인 프롬프트가 있는 세션은 유휴 정리에서 제외됩니다.