AgentOptions 및 Agent에 선택적 promptCacheKey 지원이 추가되었습니다. 새로운 promptCacheKey 속성을 통해 공급자가 호출자가 제공한 프롬프트 캐시 키를 받을 수 있습니다.AgentOptions 및 AgentLoopConfig의 getApiKey에 선택적 ApiKeyResolveContext 파라미터가 추가되었습니다. 키 리졸버가 재시도 컨텍스트를 받을 수 있도록 합니다.getApiKey 콜백을 통해 자격증명을 다시 리졸브할 수 있도록 활성화되었습니다.Agent.abort(reason?)이 이제 reason을 기본 AbortController로 전달하고, 합성된 중단된 어시스턴트 메시지는 항상 "Request was aborted"로 기본값이 지정되는 대신 reason을 errorMessage(문자열 또는 비AbortError Error 메시지)에 포함합니다. 인자 없는 abort()는 변경되지 않습니다.getApiKey가 존재할 때 폴백 API 키 리졸루션이 초기 구성된 정적 apiKey를 사용하도록 보장되었습니다.instrumentedCompleteSimple: 핸드오프, 압축/브랜치 요약)이 EventLoopKeepalive로 래핑되었습니다. 이들은 에이전트 #runLoop 외부에서 실행되므로, keepalive 없이는 Bun의 이벤트 루프가 완성 프로미스에 대기 중일 때 타이머 제공을 중단했습니다. 호스트 스피너(/handoff 로더 등)를 고정시켜 관련 없는 터미널 크기 조정이 루프를 렌더링하도록 자극할 때까지 프리징되었습니다.onAuthError 옵션이 제거되었고, 인증 재시도 처리가 리졸버 기반 apiKey 동작으로 전환되었습니다. 사용자 정의 인증 재시도 후크를 사용하는 호출자는 마이그레이션이 필요합니다.ApiKeyResolver 및 ApiKey 인증 헬퍼가 추가되었습니다. isApiKeyResolver, isAuthRetryableError, resolveApiKeyOnce, withAuth가 포함되며 패키지 루트에서 내보내집니다.SimpleStreamOptions에서 함수 값을 갖는 apiKey에 대한 지원이 추가되었으므로 단일 스트림 요청이 재시도 중에 자격증명을 새로고침하거나 로테이션할 수 있습니다.AuthStorage.getApiKey에 forceRefresh 자격증명 옵션과 인증 실패 후 세션 레벨 자격증명 로테이션을 위한 rotateSessionCredential 지원이 추가되었습니다.AuthStorage.resolver(provider, options) 메서드가 추가되었습니다. 이는 스토리지 인스턴스에서 직접 a/b/c 인증 재시도 정책을 구현하는 ApiKeyResolver를 구축합니다.401 및 사용량 제한 오류를 재생 불안전 콘텐츠가 내보내지기 전에 처리하도록 수정되었습니다. errorStatus를 통해서만 표면화된 실패도 포함됩니다.todo.ops를 객체로 내보내는 Anthropic 호환 모델이 반복된 검증 오류 루프에서 벗어나지 못하는 것을 방지합니다. (#2026)start 이벤트를 버퍼링하고 억제하도록 수정되었습니다. 깨끗한 재시도 이벤트만 전달됩니다.appendRawHttpRequestDumpFor400)가 테스트 중에 실제 ~/.omp/logs/http-400-requests 디렉토리를 오염시키는 것이 수정되었습니다. 공급자 스위트는 모의 fetch 응답으로 400 오류 경로를 사용하는데, 덤퍼가 이를 정상적인 실패와 구별할 수 없었습니다. 이제 Bun 테스트 러너(isBunTestRuntime()) 아래에서 지속성을 건너뜁니다.tool_choice.disable_parallel_tool_use를 강제하지 않도록 수정되었습니다. Claude Opus가 공급자의 기본 병렬 도구 호출 동작을 사용할 수 있도록 합니다.function_call 항목이 llama.cpp의 OpenAI Responses 엔드포인트(/v1/responses)에 대해 인자를 잃는 것이 수정되었습니다. 마지막을 제외한 모든 호출이 {}로 완료되고 에이전트가 path: Invalid input: expected string, received undefined로 거부했습니다. llama.cpp의 to_json_oaicompat_resp는 output_item.added를 item.call_id만으로 내보냅니다(item.id, output_index 없음). 일치하는 function_call_arguments.delta는 item_id: "fc_<call_id>"를 포함합니다. processResponsesStream이 이제 함수 호출 및 사용자 정의 도구 호출 항목을 item.call_id에 보조 조회 키(item.id/output_index 함께)로 등록하므로 식별자 편차가 있는 호스트가 델타 및 완료 이벤트를 올바른 블록으로 라우팅합니다. (#2015)PI_REQ_DEBUG 응답 기록이 스트리밍된 응답이 비행 중에 취소되었을 때 캡처된 본문을 자르는 것이 수정되었습니다. wrapResponse의 응답 티가 cancel 콜백과 재개된 pull(done을 소스 리더가 취소된 후 관찰) 모두에서 FileRequestDebugResponseLog.close()를 호출할 수 있습니다. 두 번째 호출자는 핸들이 이미 무효화되었음을 보고 첫 번째 호출자의 대기 중인 쓰기가 플러시되기 전에 반환하여 .res.log가 이미 버퍼링된 청크를 잃었습니다. close()가 이제 플러시 및 종료 프로미스를 메모이제이션하므로 모든 호출자가 동일한 완료를 기다립니다.display.smoothStreaming 설정(기본값 true)이 추가되었습니다. 사용자가 부드러운 어시스턴트 스트림 텍스트 표시를 활성화하거나 비활성화할 수 있습니다./tan <work> 슬래시 명령어가 추가되었습니다. 현재 대화를 백그라운드 에이전트로 분기하여 접선 작업이 비동기적으로 계속되는 동안 메인 세션을 유지할 수 있습니다./tan 디스패치 메시지가 추가되었습니다. 트랜스크립트에 핸드오프를 기록하고 위임된 작업을 비차단으로 표시합니다.CreateAgentSessionOptions에 providerPromptCacheKey 지원이 추가되었습니다. /tan 백그라운드 세션이 부모 세션의 프롬프트 캐시 계보를 재사용할 수 있습니다./tan 실행을 위한 세션 복제가 추가되었습니다. 복사된 아티팩트 및 공유 MCP 프록시 도구를 포함합니다.SessionManager.forkFrom의 선택적 suppressBreadcrumb 모드가 추가되었습니다. 백그라운드 /tan 세션 분기 시 브레드크럼 업데이트를 회피합니다.InputController에 OSC 5522 향상된 붙여넣기 처리가 추가되었습니다. 터미널 클립보드 이벤트가 이미지 또는 텍스트 페이로드로 디코딩되고 원시 붙여넣기 시퀀스를 편집기에 전달하지 않고 삽입됩니다.CustomEditor에 괄호로 묶인 이미지 경로 붙여넣기 지원이 추가되었습니다. 단일 붙여넣은 이미지 파일 경로(PNG/JPEG/GIF/WEBP)가 디스크에서 로드되고 이미지 후보로 삽입됩니다.Image #N 삽입에 대한 직접 지원이 추가되었습니다. 성공한 이미지 경로 붙여넣기를 클립보드 이미지 붙여넣기와 동일한 이미지 정규화 및 크기 조정 흐름으로 라우팅합니다./fresh 명령어가 추가되었습니다. 공급자 측 세션 ID를 회전하고 메모리 내 공급자 스트림/캐시 상태를 지웁니다. 로컬 세션 파일은 변경되지 않습니다.ChatBlock 트랜스크립트 프리미티브(modes/components/chat-block.ts)와 단일 ctx.present(...) 싱크(ctx.resetTranscript() 포함)가 추가되었습니다. 채팅 출력이 한 곳에 마운트되므로 제어기에 산재된 반복된 chatContainer.addChild(...) + ui.requestRender() 패턴이 아닙니다. ChatBlock은 React/Svelte 스타일 라이프사이클을 제공합니다. onMount는 효과를 시작하고, onCleanup은 정리를 등록하며, finish()는 자체 완료(타이머 중단 및 블록을 최종 콘텐츠에 고정)하고, dispose()/resetTranscript()는 모든 것을 해체합니다. 애니메이션 블록은 호출자에게 setInterval/requestRender 기록부를 누수시키는 대신 자신의 리소스를 소유합니다. MCP "Connecting…" 스피너가 이제 이러한 블록입니다.framedBlock 출력 블록 헬퍼(tui/output-block.ts)가 출력 블록의 borderColor 오버라이드 및 applyBg: false(배경 채우기 없음), renderStatusLine iconOverride, 및 icon.search(돋보기) 테마 기호와 함께 추가되었습니다. 도구 렌더러가 자체 포함 음소거 윤곽선 프레임을 그릴 수 있고 검색 계열 도구가 체크마크 대신 돋보기를 표시할 수 있습니다.bash 도구 프레임이 제목 표시줄에서 반복된 "Bash" 대신 일반 위쪽 규칙을 사용하도록 변경되었습니다. 최소화 장치 원시 출력 아티팩트 링크가 상태 바닥글에 Artifact: <id>로 접혔습니다.
그룹화된 read 출력이 그룹/단일 읽기 성공 상태에 흰색 채워진 원 표시를 사용하도록 변경되었습니다. 다중 읽기 그룹 내 중복 파일당 성공 표시가 생략됩니다.
어시스턴트 스트리밍 출력이 청크 단위 전체 메시지 교체 대신 30 FPS에서 그래핌 안전 적응형 catch-up으로 텍스트를 점진적으로 표시하도록 변경되었습니다.
shimmer 구동 TUI 애니메이션(작업 텍스트, 대기 중 bash/eval 테두리 및 테마 활동 스피너 문서)이 60fps 대신 30fps에서 렌더링되도록 변경되었습니다.
task 도구 에이전트 행 실행이 정적 • 표시자를 사용하고 서브에이전트 이름만 shimmer하도록 변경되었습니다. 설명, 통계 및 중첩 도구 상세 텍스트는 고정으로 유지되며 회전 상태 글리프가 제거됩니다.
설정 싱글톤 메서드 접근이 모든 settings.get 조회에 새 바인드 함수를 할당하는 대신 활성 인스턴스에 대해 바인드된 메서드를 재사용하도록 변경되었습니다.
계획 모드 승인이 초안 local://<slug>-plan.md 파일을 정규 계획 경로의 원래 이름으로 유지하도록 변경되었습니다. 승인된 계획이 더 이상 계획 모드를 떠날 때 이름이 바뀌지 않습니다.
계획 모드 쓰기 강제가 계획 중에 local:// 아티팩트 파일만 쓰기 가능하도록 변경되었습니다. 작업 트리 편집이 차단되고 로컬 아티팩트 영역에 스크래치 또는 초안 계획 파일을 허용합니다.
todo 도구 결과 렌더러가 각 업데이트에서 모든 단계의 전체 작업 목록을 다시 그리기를 중단하도록 변경되었습니다. 다중 단계 목록이 축소된 상태(기본값, 수동으로 확장되지 않음)로 렌더링될 때, 최근 업데이트가 건드린 단계만 렌더링됩니다. 즉, in_progress 작업을 보유한 단계, 방금 완료된 작업이 있는 단계, 실행된 작업으로 이름이 지어진 단계(init은 모두 건드리는 것으로 간주)가 렌더링됩니다. 건드리지 않은 단계는 한 줄 N. Name done/total 요약으로 축소됩니다. 호출 인자를 사용할 수 없을 때(예: 트랜스크립트 재구성) in_progress/완료 전환 신호로 폴백되고, 수동 확장 토글은 여전히 모든 작업을 표시합니다. 단계 간에 이전에 삽입된 빈 구분선이 제거되었습니다.
비에이전트 API 작업(제목 및 커밋 메시지 생성, 이미지 생성, 웹 검색, eval llm(), 자동 사고 분류자, 메모리 통합)이 registry.resolver() / authStorage.resolver()를 통해 세션 인식 API 키 리졸루션 및 인증 재시도를 사용하도록 변경되었습니다. 활성 자격증명을 새로고친 다음 다른 계정으로 회전합니다.
이미지 생성이 모든 공급자 fetch 브랜치를 withAuth로 래핑하도록 변경되었습니다. 401 / 사용량 제한 오류가 authStorage 지원 공급자(OpenAI 호스팅, antigravity, xai-oauth)에 대해 자격증명 강제 새로고침 및 회전을 트리거하는 동안 환경 전용 공급자(openrouter, gemini)는 단일 시도로 유지됩니다.
authStorage.getApiKey를 사용하는 웹 검색 공급자(anthropic, exa, tavily, parallel, synthetic, zai, kimi)가 401 / 사용량 제한 오류 시 자동 자격증명 회전을 위해 HTTP 호출을 withAuth로 래핑하도록 변경되었습니다.
find, search, ast_grep, ast_edit 및 lsp 진단에 대한 디렉토리 그룹화가 직접 디렉토리당 단일 평면 # dir/ 제목에서 공통 경로 접두사를 하나의 제목으로 접는 다단계 트리로 변경되었습니다. 이전에 모든 그룹이 전체 디렉토리 경로를 반복했습니다. 즉, cwd 외부에 루트된 결과는 모든 제목에 절대 접두사(예: /Users/me/proj/)를 인쇄했고 중첩 디렉토리는 절대 축소되지 않았습니다. 이제 단일 자식 디렉토리 체인이 하나의 제목(# packages/pkg/src/, cwd 외 결과의 절대 루트 포함)으로 접혀있고, 서브디렉토리가 한 # 더 깊게 중첩되며(## nested/ → ### child.ts), 각 디렉토리 자신의 파일이 서브디렉토리 전에 나열됩니다. TUI 하이퍼링크 재구성이 전체 출력에서 중첩된 디렉토리 스택을 추적하므로 파일 및 코드 프레임 링크가 올바른 절대 경로로 계속 리졸브됩니다.
계획 모드 승인 표면이 인라인 트랜스크립트 블록 및 별도 하단 선택기에서 단일 전체 화면 오버레이(예: /copy)로 변경되었고 네비게이션이 대폐되었습니다. 오버레이가 이제 ScrollView(줄 수준 ↑/↓ 스크롤, Shift+↑/↓ 빠른 스크롤, PgUp/PgDn, g/G)를 통해 섹션별로 계획을 렌더링하며 길 잃은 줄당 …이 없습니다. 터미널이 충분히 넓고 계획에 ≥2개 제목이 있으면 콤팩트 VS Code 스타일 섹션 사이드바를 표시합니다(중복 계획 제목 및 "Contents" 레이블이 생략됨). 포커스는 Tab/Shift+Tab(및 모서리의 흐름: 마지막 섹션 또는 본문 맨 아래 지난 Down이 승인 옵션으로 떨어짐; Up이 돌아감)으로 영역 간에 이동하고, 사이드바는 스크롤된 섹션을 추적하려고 빛납니다. 사이드바는 섹션 간에 빠르게 점프하고, 섹션을 삭제(u 실행 취소)하고, 피드백으로 섹션에 주석을 달(a) 수 있습니다. 삭제 및 주석이 수집되어 연산자가 "계획 정제"를 선택할 때 모델에 제출되는 정제 피드백으로 표시됩니다. 마우스도 작동합니다. 승인 옵션을 클릭하면 활성화되고, 사이드바 섹션을 클릭하면 점프되며, 휠이 계획을 스크롤합니다. ←/→은 항상 모델 티어 슬라이더를 구동하고, Enter가 확인하며, 외부 편집기 키가 계획을 열고, Esc가 취소합니다. 오버레이는 생명 주기 동안 터미널의 대체 화면 버퍼를 차용합니다(fullscreen 오버레이). 트랜스크립트는 모달 뒤 스크롤백을 통해 출혈하는 대신 일반 화면에 제자리에 유지됩니다.
대화형 컨트롤러(명령어, MCP, 선택기, 확장 UI, 이벤트), 디버그 패널 및 상태/오류/경고 헬퍼가 chatContainer에 추가하고 ui.requestRender()를 직접 호출하는 대신 ctx.present(...)를 통해 채팅 출력을 렌더링하도록 변경되었습니다. 트랜스크립트 재구성이 ctx.resetTranscript()를 통해 라이브 블록을 처분하므로 애니메이션 블록의 타이머가 리셋에서 중단됩니다.
도구 실행 블록 렌더링이 컨테이너(ToolExecutionComponent)가 투명한 패스스루가 되도록 변경되었습니다. 더 이상 위쪽/아래쪽 빈 줄을 삽입하거나 좌측/우측 패딩을 추가하거나 도구 출력 뒤에 상태 색상 배경을 칠하지 않습니다. 실질적인 본문이 있는 도구는 이제 음소거 윤곽선으로 자체 프레임하고 프레임 상단 바에 도구 제목을 표시합니다(edit/apply_patch, write, ask, todo, github, goal, inspect_image, search_tool_bm25, task). 이미 프레임된 bash/read/eval/debug/web_search/lsp 블록과 일치하는 동안 스트리밍/진행 중 및 사소한 결과가 깨끗한 상태 줄로 축소됩니다. 검색 계열 목록 도구(find, search, ast_grep) 및 job이 프레임 없음/최소한으로 렌더링합니다. find/search/ast_grep이 성공 시 체크마크 대신 돋보기를 표시하고, job이 Job: 레이블 접두사를 삭제합니다(작업별 행이 자체 설명). search_tool_bm25, github 및 inspect_image 프레임이 배경 채우기 없이 그려지고, inspect_image의 레이블이 Inspect로 단축되었습니다.
계획 모드 활성 프롬프트(prompts/system/plan-mode-active.md)가 계획이 결정 완전하고 필러를 자르도록 변경되었습니다. 목적 프레이밍("또 다른 엔지니어가 단일 디자인 결정을 하지 않고 종단 간 실행할 수 있음"), 공유