compaction/index.ts에서 snapcompact 헬퍼의 재내보내기가 제거되었으므로, snapcompact 유틸리티는 더 이상 에이전트 compaction 배럴에서 사용할 수 없으며 @oh-my-pi/snapcompact에서 가져와야 합니다compaction/messages에서 convertToLlm 별칭 내보내기가 제거되었습니다 — 두 번째 이름으로 defaultConvertToLlm을 복제했습니다. 대신 defaultConvertToLlm(배열 형식) 또는 새로운 convertMessageToLlm(단일 메시지 형식)을 가져오세요convertMessageToLlm() 추가: defaultConvertToLlm() 뒤의 단일 메시지 핵심 변환기입니다. 앱별 메시지 역할이 있는 임베더는 자신의 역할을 처리하고 모든 핵심 역할(user/developer/assistant/toolResult/custom/hookMessage/branchSummary/compactionSummary)을 변환을 복제하는 대신 여기에 위임해야 합니다 — 복제된 compactionSummary 사례가 snapcompact 프레임이 공급자 요청에서 조용히 이탈했던 방식입니다pruneSupersededToolResults()와 옵트인 PruneConfig.supersedeKey 훅 추가로, 하네스가 같은 파일의 최신 읽기로 대체된 오래된 도구 결과를 정리할 수 있습니다; 대체된 결과는 나이 기반 대상보다 먼저 오버플로우 정리 중에 정리되고 [Superseded by a newer read of this file] 플레이스홀더로 대체됩니다. 새로운 설정 없이는 pruneToolOutputs() 동작이 변경되지 않습니다.readToolSupersedeKey() 추가로 읽기 도구 경로/선택기 문법 구현(선택기 없는 읽기는 같은 파일의 범위 읽기를 대체; URL 스킴 경로 제외). 정리는 프롬프트 캐시 경제를 고려합니다: 턴별 정리는 포스트 후보 접미사가 작거나 캐시가 콜드(유휴 간격)일 때만 실행됩니다.@oh-my-pi/snapcompact를 통한 snapcompact 컴팩션 전략 추가: LLM 요약 대신, 버려진 히스토리가 조밀한 비트맵 프레임에 인쇄되고 이미지 블록으로 컴팩션 요약 메시지에 재첨부됩니다. CompactionSummaryMessage는 선택적 images 필드를 얻고, estimateTokens()는 첨부된 프레임마다 요금이 부과되며, 프레임은 8프레임 중간 방출 예산으로 preserveData.snapcompact 아래 유지됩니다.SNAPCOMPACT_SHAPES + resolveSnapcompactShape(api))로 렌더링되며, snapcompact 200k 토큰 모놀리식 평가를 따릅니다: Anthropic 계열 및 알려지지 않은 API는 8x8r-bw(unscii-8 정사각형 셀, 검은색 잉크, 모든 줄이 두 번 인쇄되고 사본은 연한 하이라이트 밴드에 위치 — 원시 텍스트와 F1 패리티로 읽을 수 있으며 ~2배 낮은 비용과 가장 거부 견고성)를 얻습니다, Google은 8x8r-sent(문장 색상 잉크, ~2.9배 저렴)를 얻습니다, OpenAI는 6x6u-sent(unscii Lanczos 확장을 6x6 셀로 — OpenAI는 이미지당 ~2.9k 토큰을 고정 비용으로 청구하므로 프레임 개수가 유일한 비용 레버) 및 프레임 이미지에 detail: "original"을 얻습니다. snapcompactCompact()는 model/shape 옵션을 허용하고, 프레임은 모양 메타데이터를 유지하고, 혼합 모양 아카이브(공급자 전환, 레거시 5x8 프레임)는 읽기 지시에 표시되고, snapcompactGeometry()/renderSnapcompactFrame()은 이제 모양을 사용합니다<read-files>/<modified-files> 대신 단일 <files> 태그입니다: 경로는 find/search 도구가 내보내는 그룹화되고 접두사 축약된 디렉토리 트리(# dir/ 헤더, 맨 파일명)로 렌더링되며, 각각 (Read), (Write), 또는 (RW)로 주석이 달립니다 — 읽기도 한 수정된 파일은 (RW)를 얻습니다. 이전 버전에서 작성한 요약의 레거시 태그는 여전히 제거되고 다음 컴팩션에 자동으로 복구됩니다Agent.continue()를 위해 큐가 그대로 유지됩니다.<read-files> 컴팩션 목록이 라인 범위/원본 선택기마다 같은 파일을 한 번씩 기록하도록 수정(src/foo.ts:50-200, :raw, :1-50:raw, …): 읽기 도구 선택기는 이제 추적 전에 제거되므로 읽기는 기본 경로로 중복 제거되고 읽기 전용 vs 수정된 목록 분할 시 쓰기/편집 경로와 일치합니다. 선택기로 오염된 목록은 이전 컴팩션에 저장되며 다음 컴팩션에 자동으로 복구됩니다. readToolSupersedeKey()는 이제 같은 스플리터(splitReadSelector())를 공유하여 이전에 놓친 .. 범위 별칭과 L 접두사 형식을 얻습니다.estimateTokens() 수정: thinkingSignature 페이로드(OpenAI 응답 암호화 추론 항목, Anthropic 서명된 사고 블록 등) 및 redactedThinking.data는 이제 가시적 사고 텍스트와 함께 요금이 부과되므로 로컬 추정이 공급자 보고 사용량을 추적하고 모든 턴에 임계값을 넘나드는 대신 (#2275).ImageContent.detail("auto" | "low" | "high" | "original") 추가: openai-responses 시리얼라이저가 전달하는 OpenAI 해상도 힌트(기본값은 auto 유지) 및 Chat Completions이 지원하는 값에 대해 openai-completions으로 전달됩니다. "original"은 네이티브 해상도를 유지합니다 — 기본 다운스케일에서 생존하지 않는 픽셀 폰트 글리프가 있는 snapcompact 프레임에 필수입니다. detail 노브가 없는 공급자는 필드를 무시합니다.anyOf를 중첩하여 선택적 합집합에 대해 type 없는 분기를 생성하고 OpenRouter의 Invalid tool parameters schema : field anyOf: missing field type 400을 트리거하는 문제 수정. (#2270)enforceStrictSchema는 이제 네이티브 중첩 순수 합집합을 부모 anyOf로 스플라이스합니다(내부 노드가 제약 형제를 수행하지 않을 때만, 형제 키워드는 anyOf와 결합이므로), 중첩된 합집합이 있는 소스 스키마는 더 이상 엄격한 업스트림 검증자가 거부하는 타입 없는 anyOf 분기를 생성하지 않습니다. (#2270)"mixed" 엄격 모드에서 도달 가능하게 함(이전에는 all_strict, 즉 Cerebras만 제한) 및 업스트림 도구 스키마 검증 400(Invalid tool parameters schema …, Invalid schema for function …)을 인식하도록 가르쳤습니다. 일치하는 거부는 이제 기본(비엄격) 스키마를 사용하여 요청을 재시도하고 공급자 세션에 strictToolsDisabled를 유지하므로, 나중의 요청은 모든 턴에 400 + 재시도 왕복을 지불하는 대신 저주받은 엄격한 시도를 건너뜁니다. (#2270)anthropic-messages → anthropic-messages 연속은 이제 이전 어시스턴트 턴의 추론 체인을 end-to-end로 유지합니다: 모든 이전 thinking/redactedThinking 블록이 생존하며(최신 생존 어시스턴트만 아님), 제3자 ↔ 제3자 리플레이는 서명을 그대로 유지하므로 추론 체인은 다음 턴을 위해 서명됩니다. 서명은 리플레이의 한쪽 끝에 공식 Anthropic 엔드포인트가 있을 때만 제거되며(및 네이티브 착지 지점이 없는 redacted_thinking 형제는 삭제됨) — 공식 Anthropic은 추론 서명을 키+세션+모델에 암호화로 바인딩하지만, 호환 추론 엔드포인트(Z.AI, DeepSeek, models.yaml을 통해 구성된 사용자 정의 anthropic-messages 공급자)는 이들을 불명확한 연속 힌트로 취급합니다. 소스측 공식 감지는 표준 카탈로그 공급자 id "anthropic"(어시스턴트 메시지는 baseUrl을 수행하지 않음)을 사용합니다; 대상측 감지는 구워진 compat.officialEndpoint 플래그를 재사용합니다. 최신 턴 바이트 대 바이트 동작(Anthropic의 "최신 어시스턴트 메시지의 사고 블록은 수정할 수 없음" 규칙) 및 기존 중단됨/오류 마지막 블록 살균은 변경되지 않습니다. (#2257, #2265)buildModel이 efforts 없는 형식이 잘못된 명시적 사고 메타데이터를 희소 입력으로 취급하고 모델 해석 중 충돌하는 대신 추론되도록 수정 (#2251).task 도구 API에서 resume 옵션과 그 재개 실행 경로가 제거되었습니다; irc를 통한 후속 메시지를 보내 완료된 서브에이전트에 대한 작업을 계속하세요irc.enabled 설정이 제거되었습니다: irc 가용성이 이제 파생되었습니다 — 도구는 메시지를 보낼 누군가가 있을 때 정확히 존재합니다(세션이 task를 통해 서브에이전트를 생성할 수 있거나, 그것이 서브에이전트 자체입니다). 설정의 오래된 irc.enabled 키는 무시됩니다task 도구가 독립적인 지속적 에이전트로 백그라운드에서 생성을 항상 실행하도록 재작성되었습니다: 결과는 비동기 작업 배달로 도착합니다(job poll만 정말 필요할 때 블록합니다). 와이어 스키마는 이제 새로운 task.batch 설정(기본 활성화)으로 형태 교환됩니다: { agent, context, tasks[] } — 작업 항목당 하나의 서브에이전트, 항목별 isolated, 필수 공유 context — 또는 비활성화되면, 플랫 단일 생성 형태 { agent, id?, description?, assignment, isolated? }로 local:// 파일을 통해 공유 백그라운드 전달task.simple 설정과 task 도구의 호출 schema 매개변수가 완전히 제거되었습니다: 구조화된 서브에이전트 출력은 이제 에이전트 정의의 output 프론트매터 또는 상속된 세션 스키마에서만 제공되며, 임시 구조화된 워크플로는 평가 agent(prompt, schema)를 사용합니다. 설정의 오래된 task.simple 키는 마이그레이션됩니다irc를 에이전트별 메일박스 버스 위의 send/wait/inbox/list ops로 재작성했습니다: 차단 awaitReply 자동 응답 턴이 제거되었습니다 — send는 배달 영수증과 함께 fire-and-forget이고, 응답은 wait를 통해 관찰한 수신자의 실제 턴입니다(또는 send await: true 슈거)agent()에서 context 인수가 제거되었습니다: 프롬프트에서 참조되는 local:// 파일을 통해 공유 백그라운드를 전달하세요app.session.observe(ctrl+s)는 이제 허브를 열고, 채팅 보기는 관찰자의 트랜스크립트 렌더러를 흡수했습니다8x8r-bw, Google의 경우 8x8r-sent, OpenAI의 경우 Lanczos 확장 6x8u-sent 및 detail: "original"), snapcompact 200k 토큰 평가에 따라read 결과의 턴별 대체 정리 추가: 파일을 다시 읽을 때, 같은 경로/선택기의 이전 복사본은 캐시 유리한 순간(작은 접미사, 유휴 간격, 또는 오버플로우 정리와 함께)에서 컨텍스트로 정리됩니다. 새로운 compaction.supersedeReads 설정으로 제어됩니다(기본 활성화)task.softRequestBudget을 통해 설정 가능, 0은 비활성화): 예산을 초과하면 자식에게 일회성 정리 조종을 주입합니다; 1.5배를 초과하면 실행을 우아하게 중단합니다(no output) 대신, 병합된 작업 결과는 이제 자식의 마지막 활동 스니펫과 요청/토큰 통계를 운반하며, 자식별 통계 줄에는 요청 개수가 포함됩니다read 도구에 반복 읽기 알림 추가: 세션에서 같은 파일의 3번째 이상의 읽기는 범위 다시 읽기 또는 편집 결과에서 반향된 컨텍스트를 제안하는 한 줄 알림을 추가합니다artifact:// 바닥글을 추가하여 이전에 100KB+ 결과를 인라인으로 도달하던 경로를 닫습니다ctrl+s, alt+a, 또는 빈 편집기에서 왼쪽 화살표 이중 탭): 등록된 서브에이전트(상태, 읽지 않은 IRC 개수, 현재 작업, 최근 활동)의 라이브 테이블과 에이전트별 채팅 — Enter는 실행 중인 에이전트를 조종하고, 유휴 에이전트에 메시지를 표시하고, 정지된 에이전트를 되살리는 트랜스크립트 + 입력 줄을 엽니다; r은 되살리고 x는 선택된 에이전트를 중단/릴리스합니다snapcompact 컴팩션 전략 추가(compaction.strategy: "snapcompact"): 히스토리는 비전 모델이 직접 읽는 조밀한 비트맵 "snapcompact" 프레임에 아카이브되며, LLM 생성 요약 대신 — 즉각적, 무료, 그대로입니다. 자동 컴팩션(오버플로우 복구 포함) 및 수동 /compact는 둘 다 이를 준수합니다; 현재 모델이 텍스트 전용(예: Codex API 서피스)이거나 /compact에 사용자 정의 지시사항이 주어진 경우 컨텍스트 풀 상태로 폴백합니다. 프레임은 컨텍스트 재구축 및 나중의 컴팩션을 생존하며(예산 제거는 중간 방출: 세션 헤드 프레임이 핀으로 고정됨); 확장된 컴팩션 메시지는 첨부된 프레임 개수를 나타냅니다idle로 생존하고, task.agentIdleTtlMs 후에 디스크로 정지됩니다(기본 7분; 0은 종료될 때까지 생존 유지), 메시지를 보내거나 Agent Hub에서 프롬프트할 때 자동으로 되살아납니다history:// 프로토콜 추가: history://는 모든 등록된 에이전트를 나열하고 history://<agentId>는 생존 및 정지된 에이전트 모두에 대해 간결한 마크다운 트랜스크립트(도구 호출이 한 줄로 축약, 사고는 생략)를 렌더링합니다irc wait는 일치하는 메시지가 도착할 때까지 블록하고, inbox는 보류 중인 메시지를 배출하거나 엿보고, 유휴 또는 정지된 에이전트로 보내기는 실제 턴을 위해 깨우거나 되살립니다irc 도구에 전용 TUI 렌더러 추가: 배달 결과 색칠이 있는 방향별 전송/수신 헤더, 확장 인식 절단이 있는 인용된 메시지 본문, 브로드캐스트 및 오류에 대한 수신자별 영수증 트리, 읽지 않은 개수가 있는 상태 배지 피어 목록task.batch 설정 추가(기본 활성화): task 도구의 배치 형태 { agent, context, tasks[] }는 항목당 하나의 서브에이전트를 생성합니다 — 각각 정상 유휴/정지 라이프사이클이 있는 자신의 독립적인 백그라운드 작업 및 선택적 항목별 격리 — 및 모든 생성된 서브에이전트의 시스템 프롬프트에 필수 공유 context를 앞에 추가합니다; 비활성화하면 플랫 단일 생성 스키마를 복구합니다tasks[] 항목을 병렬로 팬아웃하고 비동기 작업 관리자를 사용할 수 없을 때 병합된 결과 페이로드를 반환하도록 변경함buildSessionContext({ transcript: true }))를 렌더링하며, 각 컴팩션은 발생한 지점에 슬림 인라인 구분선 — ── 📷 compacted · ctrl+o ── — 으로 표시됩니다; 확장(ctrl+o)하면 요약과 snapcompact 프레임 개수가 표시됩니다. 라이브 컴팩션, /compact, /tree 네비게이션, 및 세션 재개에 적용됩니다분량 관계로 이후 내용은 번역에서 제외했습니다. 전체 내용은 위 원문 링크에서 확인하세요.