generateSummary, generateHandoff, generateShortSummary, generateTurnPrefixSummary가 이제 stopReason === "error" throws를 createSummarizationError 헬퍼로 라우팅하며, 이 헬퍼는 AssistantMessage.errorStatus를 thrown Error의 .status로 복사합니다. 이를 통해 다운스트림 컨슈머들(예: @oh-my-pi/pi-coding-agent의 AgentSession.#isCompactionAuthFailure)이 메시지 본문을 정규식으로 분석하지 않고도 실제 프로바이더 401/403을 구분할 수 있습니다./drop-images 슬래시 명령어를 추가했습니다. 이 명령어는 현재 세션의 브랜치에서 모든 ImageContent 블록을 제거합니다 — user/developer/custom/hookMessage/toolResult 콘텐츠 배열과 toolResult.details.images 및 fileMention.files[].image를 포함하여 — 세션 JSONL을 다시 쓰고, 에이전트의 메모리 내 메시지 목록을 재구성하며, Codex Responses 프로바이더 세션을 종료하고, TUI 채팅 컨테이너를 재구성하여 변경 사항이 즉시 표시됩니다. ACP 클라이언트는 동일한 핸들러를 수신합니다(runtime.output을 통해 "Dropped N images …" / "No images found …"를 반환합니다). 콘텐츠를 제거하여 toolResult 또는 user 메시지가 0개의 블록으로 남게 되는 경우 프로바이더가 빈 콘텐츠 배열을 거부하지 않도록 단일 [image removed] 플레이스홀더를 삽입합니다.Compaction failed: 401 {"type":"error","error":{"type":"authentication_error",…}}). Compaction 레이어는 이제 프로바이더 보고 HTTP 상태를 thrown 에러에 첨부하며, AgentSession의 인증 실패 감지기는 기존 auth_unavailable 정규식에 더하여 error.status === 401 || 403으로 분기합니다. 폴백 모델 역할(예: modelRoles.smol)이 구성된 경우 compaction은 투명하게 재시도하며, 그렇지 않으면 사용자는 원시 프로바이더 봉투 대신 실행 가능한 "Compaction requires usable credentials for …" 힌트를 봅니다.pi_shell의 파이프 리더가 모든 청크를 커널 read(2)마다 별도의 ThreadsafeFunction::call을 통해 포워딩했으므로, 수다많은 자식은 JS 메인 스레드가 직렬로 드레인해야 하는 수백만 개의 크로스 스레드 napi 콜백을 생성했습니다 — 자식이 종료된 후에도 큐가 프로세스를 몇 초간 포화 상태로 유지했습니다. 브리지는 이제 JS로 들어가기 전에 mpsc 큐에 이미 있는 모든 청크를 탐욕스럽게 단일 배치 호출로 병합하고(64 KiB로 상한선 설정), 1바이트 쓰기를 하나의 napi 디스패치로 축소하고, 정상 상태 콜백 속도를 JS 이벤트 루프의 처리량으로 복원합니다.전체 변경 로그: v15.5.9...v15.5.10