AgentLoopConfig에 hasSteeringMessages를 추가했습니다(스티어링 큐로 Agent에 의해 연결됨). 도구 실행 중 즉시 인터럽트 폴링에서 사용되는 피크 함수로, 루프가 큐에서 제거하지 않고도 대기 중인 스티어링을 감지할 수 있으며 큐는 주입 경계까지 메시지의 소유권을 유지합니다.stopReason: "stop" 및 stopDetails: { type: "pause_turn" }, Codex 프로바이더에 의해 end_turn: false 설명만 있는 응답에 대해 방출됨)된 후 재샘플링합니다. 어시스턴트 메시지가 이력에 커밋되고 턴을 끝내지 않으면 모델이 다시 호출됩니다. 중간에 도구 호출이 없는 연속적인 일시 정지 연속은 최대 8개로 제한되어 계속 일시 정지하는 백엔드를 제한합니다.hasSteeringMessages를 사용하여 즉시 배치 중 인터럽트 폴링을 수행합니다. getSteeringMessages만으로 AgentLoopConfig를 직접 구성하는 소비자는 더 이상 배치 중 인터럽트를 받지 않습니다. hasSteeringMessages도 제공할 때까지 스티어링이 경계 전달로만 성능이 저하됩니다.ApiKey(정적 문자열 또는 리졸버)를 허용하므로, 중간 압축 중 401은 모델 수준 폴백 전에 중앙 인증-재시도 정책을 통해 자격증명을 강제 새로 고침하고 회전합니다. 원격 OpenAI 압축 요청은 withAuth로 래핑되고 HTTP 실패는 .status를 포함하므로 재시도 분류기가 실제로 원격 압축 401에서 작동합니다.transformProviderContext가 이제 디스패치 모델을 두 번째 인수로 받습니다((context, model) => Context). 요청별 변환이 모델 기능(비전 입력, 프로바이더, API 패밀리)에 따라 게이팅할 수 있습니다. 기존 단일 인수 구현은 변경 없이 계속 작동합니다..status 속성으로 일반 Error를 변경하는 대신 pi-ai의 타입화된 ProviderHttpError를 발생시킵니다. 일반적인 requestRemoteCompaction 오류도 이제 .status(및 응답 헤더)를 포함합니다.end_turn: false를 매핑합니다(Codex 백엔드는 "응답이 끝났지만 턴은 끝나지 않음" — 설명만 있는 진행 상황 업데이트의 신호). stopDetails: { type: "pause_turn" }이 있는 stopReason "stop"으로 매핑되므로 에이전트 루프가 턴을 끝내는 대신 재샘플링할 수 있습니다. openai-codex-responses 및 processResponsesStream(openai-responses/azure-openai-responses)에 연결됨. 필드를 보내지 않는 백엔드의 경우 비활성입니다.openai-codex-responses에 추가했습니다(2026년 6월 기준 codex-rs 추적): 두 전송 모두에서 response.metadata → openai_chatgpt_moderation_metadata를 표시하는 onModerationMetadata 콜백; reasoning.context(auto/current_turn/all_turns)를 방출하는 reasoningContext 옵션; websocket 추가 고속 경로를 깨지 않으면서 요청 본문에 client_metadata를 방출하는 clientMetadata 옵션(정규 x-codex-turn-metadata 엔벨로프); 그리고 codex-rs를 미러링하는 옵트인 responsesLite 모드 — HTTP 요청 및 websocket 업그레이드의 lite 헤더, response.create 클라이언트 메타데이터의 ws_request_header_* 마커, lite 키 소켓 풀링, 이미지 세부 정보 제거, 강제 직렬 도구 호출 및 reasoning.context: all_turns 기본값. OpenAI가 모델 카탈로그에서 use_responses_lite를 활성화할 때까지 휴면 상태입니다.withOAuthAccess를 추가했습니다. OAuth 액세스 소비자를 위한 withAuth의 대응물로, 중앙 a/b/c 인증-재시도 정책(해석 → 동일 계정 강제 새로 고침 → 형제로 회전)을 통해 작업을 실행하면서 시도에 전체 OAuthAccess(베어러 플러스 accountId/projectId/enterpriseUrl 신원 메타데이터)를 제공합니다. 401 및 사용량 제한이 자격증명을 회전하는 대신 호출이 실패하지 않도록 손으로 만든 getOAuthAccess + fetch 플로우 대신 이를 사용하세요.ProviderHttpError를 추가했습니다. status, headers 및 code를 포함하는 타입화된 HTTP 오류로, 프로바이더 던지기 사이트의 임시방편 as Error & { status?... } / Object.assign 해킹을 대체합니다. 프로바이더별 서브클래스 CodexApiError, AuthGatewayError, GoogleApiError, GeminiCliApiError, OllamaApiError 및 BedrockApiError를 포함하고 AnthropicApiError는 이제 이를 확장합니다. Google, Gemini CLI, Ollama 및 Bedrock HTTP 오류는 이제 응답 헤더도 포함하므로 서버에서 제안하는 retry-after 지연이 이러한 경로의 재시도 분류에 표시됩니다. 내부 withHttpStatus 헬퍼가 제거되었습니다.PI_CODEX_STATEFUL=0 또는 statefulResponses: false로 비활성화). SSE 요청은 이제 전체 트랜스크립트를 재생하는 대신 previous_response_id를 델타 전용 입력과 함께 재사용하여 websocket 고속 경로를 공유 전송 인식 빌더를 통해 미러링합니다. 모든 이력 변경 또는 옵션 변경은 전체 재생으로 폴백됩니다. 서버 측 previous_response_not_found(HTTP 또는 인스트림)는 체인을 재설정하고 전체 컨텍스트로 턴을 재시도하며, 3개의 연속적인 오래된 실패는 세션에 대한 체이닝을 비활성화합니다.openai-responses)에 상태 저장 previous_response_id 체이닝을 추가했습니다. 공식 api.openai.com 엔드포인트에 대해 기본값으로 활성화(체이닝이 필요로 하는 store: true 강제), 다른 Responses 엔드포인트의 경우 비활성화. statefulResponses 또는 PI_OPENAI_STATEFUL로 재정의합니다. 체인 감지는 대화 인수의 와이어 형식만 비교합니다. GPT-5 "Juice: 0" 개발자 항목과 같은 턴별 후행 스캐폴딩은 추가 기본선 접두사 확인에서 제외되고 델타에 다시 추가되며, 거부되거나 오래된 이전 응답은 동일한 회로 차단기가 있는 일회성 전체 재생으로 폴백합니다.AuthStorage.getOAuthAccountIdentity() 및 OAuthAccountIdentity 타입을 추가했습니다. 세션이 현재 라우팅되는 OAuth 자격증명의 accountId/email/projectId를 반환하는 읽기 전용 조회로, 표시 및 메타데이터 경로용입니다.applyResponsesReasoningParams의 GPT-5 "Juice: 0" 비-추론 개발자 항목이 이제 인라인 모델 이름 확인 대신 해석된 compat.requiresJuiceZeroHack 플래그에 의해 게이팅됩니다(@oh-my-pi/pi-catalog에 의한 GPT-5 패밀리 모델 이름에서 자동 감지, 모델별로 재정의 가능).omp 프로세스가 동일한 행을 새로 고침하고 저장한 후 로컬 SQLite OAuth 자격증명 캐시가 오래된 Anthropic 액세스 토큰을 반환하는 문제를 수정했습니다. AuthStorage는 이제 OAuth 자격증명을 반환하거나 강제 새로 고침하기 전에 저장소에서 선택된 행을 동기화하므로 동시 세션은 일회성 401을 표시하는 대신 피어 회전 토큰을 선택합니다.OAuth preflight refresh failed)를 방출하므로 동시 세션의 오래된 새로 고침 토큰 재생이 진단 가능합니다.client_metadata만 변경될 때 사용 가능한 상태로 유지하도록 수정했습니다.onModerationMetadata 처리가 콜백 관찰자가 발생시킨 예외가 더 이상 응답 스트림을 종료하지 않도록 수정했습니다.low|medium|high 사고력 노력만 선언하도록 수정했습니다. 업스트림이 minimal, xhigh 및 Fireworks의 minimal → none 와이어 매핑을 거부하므로 fireworks/minimax-m2.7이 자동 사고력 분류기 모델로 모든 턴에서 400이 되었습니다. OpenAI 호환 프로바이더 노력 맵(Groq qwen/qwen3-32b, DeepSeek 패밀리, OpenRouter Anthropic 적응, Fireworks minimal → none)이 이제 buildOpenAICompat 대신 카탈로그 메타데이터의 thinking.effortMap에 구워지고, 요청 빌더가 해당 필드를 직접 읽습니다. 재생성된 models.json이 이제 이러한 패밀리에 대해 disableReasoning을 low로 선택하면서 GLM-5.x 및 기타 Fireworks 모델을 기존 minimal → none 경로에 유지합니다(#2315).requiresJuiceZeroHack Responses-API 호환 플래그를 추가했습니다. buildOpenAIResponsesCompat에 의해 GPT-5 패밀리 모델 이름에서 해석되고 희소 모델 compat 구성을 통해 재정의 가능합니다. 후행 # Juice: 0 !important 비-추론 개발자 항목을 게이팅하는 요청 시간 model.name.startsWith("gpt-5") 스니프를 대체합니다./settings에 마우스 기반 상호작용을 추가했습니다. 탭 및 설정 행 호버 하이라이트, 휠 스크롤 및 항목 및 서브메뉴의 좌클릭 활성화 포함/settings 마우스 이벤트 처리를 추가했습니다. 스크롤 및 클릭이 대체 화면 오버레이에서 작동합니다.ModelRegistry.resolver가 이제 모델을 직접 허용합니다. resolver(model, sessionId)는 provider, baseUrl 및 modelId를 여기서 파생합니다. 모든 모델 범위의 호출 사이트가 상세한 resolver(model.provider, { sessionId, baseUrl, modelId }) 형식에서 마이그레이션됩니다.snapcompact.systemPrompt 및 snapcompact.toolResults 설정을 추가했습니다(기본값 비활성화, /settings → Context → Experimental). 프레임은 요청별로 공급자 컨텍스트 변환에서 구축되고, 턴 간에 캐시되고, 공급자별 이미지 예산으로 제한되고, 토큰 절감 추정치에 의해 게이팅됩니다. 이들은 session.jsonl에 도달하지 않습니다./settings(Model → Prompt)에 성격 선택기를 추가했습니다. default(이전 기본 제공 회신 스타일), friendly, pragmatic 또는 none. 선택된 스펙은 전용 <personality> 시스템 프롬프트 블록(이전 <reply-guidelines> 섹션에서 추출됨)으로 렌더링되고 라이브 세션에 즉시 적용됩니다. 하위 에이전트는 항상 블록을 생략합니다.mnemopi.polyphonicRecall 및 mnemopi.enhancedRecall config.yml 설정을 추가했습니다(기본값 비활성화, /settings → Memory → Mnemopi). mnemopi 4-성음 다성 회상 엔진 및 계층형 쿼리 결과 캐시를 활성화합니다. MNEMOPI_POLYPHONIC_RECALL / MNEMOPI_ENHANCED_RECALL이 설정되면 구성된 값을 여전히 재정의합니다(#2323)./settings 키보드 네비게이션이 변경되어 Tab 및 Shift+Tab이 섹션별 목록의 섹션 제목과 설정 행 간 포커스를 토글하고, ↑/↓는 섹션을 건너뛰고, ←/→는 탭을 전환하며, 상태 텍스트가 활성 컨트롤을 반영합니다.
task 도구 설명이 이제 여러 task 호출을 메시지당 동등한 대안으로 표시하는 대신 병렬 생성을 한 호출의 tasks[]로 배치(한 번만 context 공유)할 것을 의무화합니다. 별도의 호출은 다른 에이전트 타입이나 관련 없는 컨텍스트용으로 예약됩니다.
새 섹션 포커스 동작(↑/↓ 및 Tab/Enter)과 탭 전환 화살표와 일치하도록 /settings 온스크린 네비게이션 힌트를 업데이트했습니다.
/settings가 전체 화면 오버레이로 대체 화면에서 열리도록 변경되어 더 이상 기본 트랜스크립트와 공간을 공유하지 않습니다.
Codex, Gemini 및 Perplexity 웹 검색이 이제 새 withOAuthAccess 드라이버를 통해 OAuth 베어러를 라우팅합니다. 401 또는 사용량 제한이 동일 계정을 강제 새로 고침한 다음 검색이 실패하지 않으면서 형제로 회전하며, 신원 메타데이터(chatgpt-account-id, Google projectId)가 모든 재시도에서 새로 고친 자격증명에서 다시 파생됩니다.
Kagi 웹 검색, xAI TTS 도구 및 모델 검색 목록 가져오기가 이제 일회성 키 스냅샷 대신 인증 저장소 리졸버가 있는 withAuth를 통해 베어러를 해석하며, 401에 대해 동일한 강제 새로 고침 + 회전 재시도를 획득합니다.
압축, 인계 및 분기 요약 호출 사이트가 이제 압축기에 후보별 API 키 리졸버를 전달합니다(가용성은 여전히 키 스냅샷에 의해 게이팅됨). 자격증명 새로 고침이 #986 폴백 모델 루프가 진행되기 전에 발생합니다.
mnemopi 백엔드가 이제 기본 임베딩/추출 설정에 대해 OpenRouter 리졸버를 전달합니다(AuthStorage에 저장된 키 포함). 고정된 리터럴 키 및 사용자 지정 엔드포인트는 변경 없음으로 유지합니다.
/settings 패널을 찾기 용이성을 위해 재구성했습니다. 모든 탭에는 이제 탭별 레이아웃 계약(TAB_GROUPS)으로 지원되는 제목 섹션이 있습니다. 넓은 터미널에서 패널은 활성 섹션의 설정 옆에 섹션 사이드바를 렌더링합니다(좁은 터미널은 인라인 제목이 있는 평면 목록 유지). PgUp/PgDn은 섹션별로 점프합니다. 편집 탭이 파일(편집/읽기/LSP)이 되었고 새 Shell 탭이 bash, eval 및 Python 설정을 호스팅합니다. 배치된 설정이 재배치되었습니다. bash 토글이 Shell 아래 통합되고, 도구 승인 모드 및 정책이 Interaction → Approvals 아래 함께 있으며, 마켓플레이스 자동 업데이트가 시작 업데이트 확인 옆에 있고, todo 자동 정리 지연이 다른 todo 설정 옆에 있습니다.
/settings 크롬을 다시 스타일링했습니다. 탭 스트립이 컨텐츠 아래의 레이블 없는 바닥글로 이동했고, 패널은 네비게이션, 값 변경 및 서브메뉴 전체에서 한 가지 일정한 높이를 유지합니다(각 변경 후 더 이상 뷰포트 점프 없음). 입력이 이제 전역 크로스 탭 검색을 실행합니다. 결과는 탭별 제목 아래에 그룹화되고, 바닥글이 라이브 일치 개수를 표시하며 일치하지 않는 탭은 음소거됩니다. Tab은 일치하는 탭 간을 건너뛰고, Esc는 검색을 종료하며 선택된 결과의 탭에 착지합니다.
/settings 레이블 및 설명을 정규화했습니다. 일관된 Title Case 레이블(예: "Todo Auto-Clear Delay", "GitHub View Cache"), 균일한 단위 배치, 설명의 문장 및 동사 우선 표현("If false…"/"Whether to…" 다시 작성) 및 오래된 브라우저 도구 설명(Ulixee Hero)이 실제 puppeteer/Chromium 구현으로 수정되었습니다.
/settings 섹션 제목이 이제 밑줄이 그어집니다. 활성 섹션의 제목은 굵게 유지되고, 활성 섹션 외부의 제목은 동일한 밑줄로 희미하게 렌더링됩니다. 섹션 경계가 한 눈에 읽힙니다.
/settings: Tab이 이제 섹션 제목과 설정 행 간 키보드 포커스를 토글합니다. 제목에 포커스가 있는 동안 ↑/↓는 전체 섹션을 건너뛰고 Enter/Esc는 행으로 다시 떨어집니다. ←/→는 어디서나 탭을 전환하고, 섹션이 없는 탭(예: Plugins)은 Tab을 탭 전환으로 유지하며, 바닥글 힌트가 포커스 상태를 따릅니다.
이미지 생성(Antigravity, xAI, OpenRouter, Gemini) 및 xAI TTS 요청 실패가 이제 Object.assign으로 패치된 Error 대신 상태 및 응답 헤더를 포함하는 pi-ai의 타입화된 ProviderHttpError를 발생시킵니다.
분량 관계로 이후 내용은 번역에서 제외했습니다. 전체 내용은 위 원문 링크에서 확인하세요.