@oh-my-pi/pi-agent-core/compaction에 generateHandoffFromContext(context, model, options)를 추가했습니다: 완전히 구축된 provider Context(시스템 프롬프트, 정규화된 도구, 변환된 히스토리, 후행 핸드오프 프롬프트)에 대해 핸드오프 원샷을 실행하며, streamOptions는 실시간 턴의 캐시 라우팅을 반영하므로 변환 파이프라인을 소유한 호스트가 핸드오프 요청을 주 턴이 채운 프롬프트 캐시와 공유하도록 할 수 있습니다. generateHandoff(messages, …)는 변경되지 않았으며 이제 이를 위임합니다.Agent.buildSideRequestContext(llmMessages, systemPrompt?)에 선택적 systemPrompt 인수를 추가했습니다. 기본값은 실시간 에이전트 프롬프트이며, 호출자는 다른 프롬프트를 고정할 수 있습니다(예: 핸드오프 생성은 턴별 before_agent_start 훅 오버라이드가 아닌 기본 프롬프트를 사용합니다).buildSideRequestContext를 업데이트하여 커스텀 시스템 프롬프트 고정 허용context_management.keep: "all" 없이 재생된 사고 블록을 보내는 것을 수정했습니다. API 키 제공자에 대해 다중 턴 추론 컨텍스트를 보존합니다. API 키 요청은 이제 필수 context-management-2025-06-27 베타 헤더를 광고하므로 필드가 거부되는 대신 적용됩니다. 주입된 SDK 클라이언트, GitHub Copilot의 Anthropic 프록시, Vertex rawPredict는 이 코드 경로가 호출자 소유 클라이언트에 베타를 추가할 수 없고, Copilot이 Anthropic 베타를 제거하고 사고 블록을 텍스트로 강등하며, Vertex가 Anthropic HTTP 베타 헤더가 아닌 JSON 본문에서 베타를 기대하기 때문에 제외됩니다. (#3288)format 메타데이터를 후속 요청에 누수시키는 것을 수정했습니다. 이는 암호화된 추론 재생을 유지하면서 HTTP 400 거부를 야기했습니다.agent() 헬퍼 매개변수를 모든 워크플로우 런타임(Python, JavaScript, Ruby, Julia)에서 agent_type → agent와 return_handle → handle로 이름을 변경했습니다. 따라서 모든 언어에서 이름이 동일하고(camelCase/snake_case 분리 없음) 에이전트 선택 매개변수가 task 도구의 agent과 일치합니다. __agent__ eval 브릿지 와이어 프로토콜의 이름도 일치하도록 변경되었습니다.eval 도구를 cells 배열 대신 호출당 단일 셀({ language, code, title?, timeout?, reset? })을 가져오도록 변경했습니다. 상태는 여전히 별도의 eval 호출, 도구 호출, task 서브에이전트 전체에서 언어별로 유지되므로 각 호출은 이전 호출이 정의한 모든 것을 재사용하는 하나의 논리적 단계입니다. 배열은 모든 배치에서 동일한 설정을 다시 가져오거나 다시 선언하도록 권장했을 뿐입니다. 스키마, 필드 설명, 예제, 시스템 eval.md/workflowz 헬퍼 문서, [i/n] 셀 카운터(이제 단일 셀에 대해 숨겨짐)가 일치하도록 업데이트되었습니다. 렌더러, ACP 시작 텍스트, 복사 대상, 협업 웹 도구 보기는 여전히 레거시 다중 셀 기록을 파싱합니다.isolated, apply, merge 옵션을 모든 워크플로우 런타임(Python, JavaScript, Ruby, Julia)에서 eval agent()에 추가했습니다. workflowz 기반 팬아웃이 task 도구가 제공하는 동일한 copy-on-write 워크트리 격리를 요청할 수 있습니다(isolated: true를 통한 엄격한 옵트인, task 도구와 일치; apply: false는 캡처된 패치/브랜치를 병합하지 않고 유지합니다; merge: false는 패치 모드를 강제합니다). 작업 격리 라이프사이클을 task/isolation-runner.ts로 추출했으므로 eval 브릿지와 TaskTool이 하나의 구현을 공유합니다 (#3196)eval 도구를 셀 배열 대신 단일 논리적 단계(코드 블록)를 허용하도록 단순화했습니다eval 도구 문서를 업데이트하여 증분, 단일 단계 실행을 강조합니다bash 도구를 ls 또는 find 사용에서 제한하여 read 또는 find 도구 사용을 요구합니다todo 도구 인터페이스를 작업 배열 대신 단일 작업을 직접 허용하도록 단순화했습니다bash보다 eval 도구로 강화했습니다. 시스템 프롬프트 도구 정책, bash.md, eval.md는 이제 루프, 조건문, heredocs, 인라인 -e/-c 스크립트, 다단계 파이프라인, 인용 부호/JSON 이스케이핑을 eval 셀을 작성하는 신호로 취급합니다. bash의 "사실 계산" 특례는 단일 짧은 파이프라인으로 축소되며, eval.md는 이제 런타임 템플릿 예제로 해당 영역을 적극적으로 주장합니다(활성화된 백엔드만 광고됨).eval을 필수 기본 제공 도구(loadMode: "essential", 기본 필수 도구 집합에 추가)로 만들었습니다. 따라서 tools.discoveryMode: "all" 아래에서 활성 상태로 유지되며 search_tool_bm25 뒤에 숨겨지지 않습니다.--resume 세션 선택기를 터미널의 대체 화면에서 전체 화면으로 만들었으므로 목록이 마우스 휠로 스크롤되고 행을 클릭하면 세션이 재개됩니다. 행은 실시간 스크롤 윈도우에 대해 히트 테스트되며, 키 바인딩 힌트 + 아래쪽 테두리는 이제 화면 하단에 고정되어 표시된 윈도우 높이가 변경될 때 위아래로 드리프트하지 않습니다.local:// URL을 손상된 텍스트(mojibake)로 디코딩하는 대신 이미지를 표시하는 것을 수정했습니다omp --resume이 시작 세션 선택기가 취소(Esc)되거나 재개할 세션이 없을 때 종료되지 않고 중단되는 것을 수정했습니다. 시작은 장기 실행 핸들(테마/모양 리스너, 설정 저장 타이머, 모델 레지스트리)을 준비하므로 취소/빈 경로의 단순 return은 이벤트 루프를 살아 있게 두고 선택기가 대체 화면을 지운 후 프로세스를 고착시켰습니다. 이러한 경로는 이제 --version/--export 조기 종료 규칙과 일치하는 process.exit(0)을 통해 깔끔하게 종료됩니다. 세션 내 /resume 선택기는 영향을 받지 않습니다. 오버레이를 닫기만 하는 자체 취소 핸들러를 유지합니다./resume 세션 선택기가 아래로 스크롤되는 것을 수정했습니다. 삭제 확인 대화상자가 선택기의 아래쪽 테두리 아래에 형제로 마운트되었습니다. 선택기를 터미널 높이를 넘어 짧게 커졌습니다. TUI가 선택기의 헤더 행을 네이티브 scrollback에 커밋하여 맞췄으며, 대화상자가 닫혔을 때 windowTop은 새 커밋 경계에 고정된 상태로 유지되어 헤더가 뷰포트 위에 고립되었습니다. 선택기는 이제 SessionList를 단일 콘텐츠 슬롯에 호스트하고 대화상자가 열려 있는 동안 해당 슬롯에 대화상자를 교체(SessionList 교체)합니다. 대화상자는 SessionList의 렌더링 예산과만 경쟁합니다. SessionList AND 선택기 크롬이 아니며, 선택기 프레임은 뷰포트 내에 유지됩니다. (#3283)eval 도구 카드가 여전히 실행 중인 셀의 stdout을 스트리밍하지 않는 것을 수정했습니다: 장시간 실행되는 셀(예: time.sleep() 모니터 루프)은 반환되거나 중단될 때까지 아무것도 표시하지 않은 다음 모든 것을 한 번에 덤프했습니다. 렌더러는 details.cells[i].output에서 셀 출력을 그리는데, 이는 backend.execute() 해석 후에만 채워졌습니다. 라이브 stdout은 일시적인 결과 content 테일(및 renderContext.output)로 스트리밍되었으며, 이는 셀별 렌더링 분기가 무시합니다. 스트리밍된 청크는 이제 도착할 때 활성 셀의 output(전용 셀별 테일 버퍼, 집계와 같이 제한됨)에 추가되므로 카드가 진행 상황을 실시간으로 표시합니다. 완료 시 권위 있는 전체 출력이 라이브 테일을 덮어씁니다. log()/phase()/display()및 상태 작업은 영향을 받지 않습니다. 이미 상태 채널을 통해 스트리밍하기 때문입니다.\x1b[27u]로 보고하며, 텍스트 입력 서브메뉴의 원본 \x1b 비교가 누락되었습니다. handleInputOrEscape는 이제 matchesKey를 통해 Escape를 디코딩하여 다른 모든 Escape-취소 경로와 일치합니다.eval 그래프/플롯 시각화(Plots.jl, GraphRecipes, Makie 등)가 인라인으로 렌더링되지 않는 것을 수정했습니다. 두 가지 버그: (1) 러너의 build_mime_bundle/emit_error는 셀이 실행되기 전에 세계 나이가 고정된 장기 실행 main() 루프에서 직접 show/showable/showerror를 디스패치했습니다. 플롯 패키지가 셀 내부에서 using될 때 등록된 rich show(::IO, ::MIME"image/png", …) 메서드는 보이지 않았습니다. show는 기본 구조체 repr로 폴백했습니다(자체가 Julia 1.12에서 던져졌고 전체 결과를 중단했습니다). 이러한 호출은 이제 Base.invokelatest를 통해 라우팅되며, text/plain 프로브는 실패한 repr이 더 이상 이미지 MIME를 억제할 수 없도록 보호됩니다. (2) 기본 GR 백엔드는 각 플롯에서 네이티브 gksqt GUI 창을 팝업했습니다. 러너는 이제 기본 GKSwstype=100(헤드리스, 재정의 가능)을 설정하므로 플롯은 Python 러너의 MPLBACKEND=Agg 기본값을 미러링하는 인라인 PNG로만 렌더링됩니다.bash/eval 도구 출력이 … (N earlier lines, showing 10 of M) (ctrl+o to expand) 미리보기를 네이티브 scrollback으로 복제하는 것을 수정했습니다. 축소된 출력은 10줄에서 고정된 슬라이딩 테일 윈도우입니다. 박스가 실시간 뷰포트를 초과했을 때(여전히 실행 중인 병렬 도구 같은 선행자 아래의 긴 명령/출력), 그 변경되는 테일은 커밋 윈도우 위로 스크롤되었고 렌더러는 모든 프레임에서 새 스냅샷을 다시 커밋했으며, 수십 개의 오래된 미리보기 배너와 청크를 쌓았습니다. 출력 미리보기는 이제 뷰포트 테일(Math.min(10, previewWindowRows()))에 제한되고 박스의 내부 콘텐츠 너비(새 outputBlockContentWidth 헬퍼를 통해)로 시각적 행에서 측정되므로, 짧은 터미널에서 변동 테일은 화면에 유지되도록 축소되고 커밋되지 않습니다. 스크롤 오프 커밋이 무손실로 만들어졌을 때 도입된 복제를 수정합니다./handoff 실행을 방지하여 세션 손상을 피합니다/handoff cold-missing 제공자 프롬프트 캐시를 수정했습니다. 핸드오프 생성은 이제 라이브 턴이 사용하는 동일한 파이프라인(convertMessagesToLlm + Agent.buildSideRequestContext + prepareSimpleStreamOptions, 새 generateHandoffFromContext를 통해)을 통해 요청을 빌드합니다. 따라서 라이브 시스템 프롬프트, 정규화된 도구, 변환/난독화된 메시지 히스토리, 그리고 가장 중요하게 고유한 사이드 sessionId를 가진 안정적인 promptCacheKey를 재사용합니다. 이전에 원샷은 캐시 라우팅 키를 보내지 않았고 루프가 적용하는 transformContext/transformProviderContext와 도구/메시지 정규화를 건너뛰었으므로 해당 접두사는 턴이 채운 것과 일치하지 않았고 모든 핸드오프는 전체 컨텍스트를 캐시되지 않은 상태로 다시 읽었습니다. 이미 /btw와 /omfg에서 사용된 캐시 보존 경로를 미러링합니다./handoff(및 RPC handoff 명령)가 응답이 여전히 스트리밍되는 동안 에이전트를 초기화하는 것을 수정했습니다. 이는 라이브 턴이 분해된 세션에 계속 내보낼 수 있었습니다. 수동 핸드오프는 이제 프롬프트가 비행 중일 때(/fork 및 /move와 일치) 거부합니다. 자동 핸드오프 경로는 영향을 받지 않습니다.exa.searchDelayMs 지연(기본 1000ms)을 추가했습니다. (#3271)Other (type your own) 커스텀 입력을 해제했을 때 ask가 (cancelled)를 반환하거나 도구를 중단하는 것을 수정했습니다. 이제 옵션 선택기로 반환되므로 사용자가 나열된 답변을 선택할 수 있습니다. (#3269)/goal 임계값 자동 압축이 세 가지 경로를 통해 실제 세션을 건너뛰는 것을 수정했습니다: 턴별 초과 달성/drop-useless 정리가 더 이상 임계값 트리거를 마지막 제공자 청구 컨텍스트 아래로 수축시키지 않습니다. 활성 목표 텍스트 중지가 이제 예상치 못한 중지 재시도 연속이 사후 턴 처리에서 반환되기 전에 임계값 유지를 시도합니다. 그리고 빈 toolUse 중지는 활성 컨텍스트 + 세션 히스토리에서 고아 어시스턴트를 제거하는 기존 정리 패스를 유지합니다 이후 압축 연속입니다. 활성 목표 압축 연속은 이제 반환 전에 완료된 재시도 게이트를 해석하여 isRetrying이 재시도 성공 후 고착되지 않도록 방지합니다. shouldCompact를 공급한 청구/저장/해석/사후 유지 관리 토큰 수를 식별하는 정확한 조기 반환 분기를 식별할 수 있도록 agent_end maintenance routing 및 Auto-compaction threshold decision 디버그 로그를 추가했으므로 향후 시작 안 함 보고서가 식별됩니다. (#3174)agent_end에 도달하지 못한 활성 /goal 실행을 수정했습니다. 임계값 유지는 이제 도구 호출 턴 사이에서 실행되며, 라이브 루프 컨텍스트를 현재 위치에서 압축하고, 여전히 실행 중인 목표 루프와 경쟁할 수 있는 대기 중인 연속을 억제합니다. (#3174)append, tree, diff eval 헬퍼 함수를 제거했습니다sort, uniq, counter 텍스트 처리 eval 헬퍼를 제거했습니다append(path, content), tree(path, max_depth?, show_hidden?), diff(a, b) eval 프리루드 헬퍼를 제거했습니다. 상태 렌더러, 아이콘 항목, 도구/docs 참조도 함께 제거되었습니다. 파일 변경을 위해 write/read를 사용하고 풍부한 파일 시스템 작업을 위해 tool.<name>(...)을 사용하세요.sort(text, reverse?, unique?), uniq(text, count?), counter(items, limit?, reverse?) eval 텍스트 헬퍼를 제거했습니다(Julia는 이를 정의하지 않았음). JS HelperBundle/HelperOptions 멤버 및 docs 참조도 제거되었습니다. 셀 코드에 정렬/중복 제거/계산을 인라인으로 수행하세요.language/code/title/timeout/reset)를 렌더링하도록 eval 도구 보기를 업데이트했습니다. Ruby(rb) 및 Julia(jl) 셀을 Python으로 축소하지 않고 자신의 구문으로 강조하면서, 이전 기록에서 레거시 다중 셀 cells 배열 및 프레임 input 문자열을 계속 파싱합니다.분량 관계로 이후 내용은 번역에서 제외했습니다. 전체 내용은 위 원문 링크에서 확인하세요.