stream이 OpenAI JSON 문자열 계약 대신 완전한 객체로 function.arguments를 전달할 때 MiniMax 호환 OpenAI completions 호스트(예: minimax-code-cn/MiniMax-M3)가 tool-call 인수를 잃는 문제를 수정했습니다. 스트리밍 버퍼는 이전에 객체를 문자열로 연결하여 [object Object]로 강제 변환했으며, bash/edit 호출이 빈 입력이나 잘못된 형식의 입력을 남겼습니다. 이제 tool-call 블록은 객체 payload를 직접 보유합니다. (#1776)
Cloud Code Assist(Gemini / Antigravity)가 properties라고 명시된 속성을 가진 tool에서 tool 스키마를 거부하는 문제를 수정했습니다(예: Resend MCP create_contact tool). 에러는 Invalid JSON payload received. Unknown name "propertyNames" (HTTP 400)였습니다. 스키마 정규화기의 insideProperties 플래그는 해당 속성의 값 스키마로 내려갈 때 다시 설정되어, 그 안에 중첩된 Google 미지원 키워드(propertyNames, additionalProperties 등)가 제거되지 않았습니다. 이제 플래그는 스키마 노드에서 실제 properties 맵에 들어갈 때만 설정되고, 다른 properties 맵 내에서는 설정되지 않습니다.
로컬/자체 호스팅 제공자가 머신 관련 엔드포인트를 번들된 models.json으로 누수시키는 문제를 수정했습니다. LiteLLM 프록시가 있는 머신에서의 generate-models 실행이 커밋된 카탈로그에 1202개의 litellm 모델을 http://localhost:4000/v1로 고정시켰습니다. litellm과 lm-studio는 이제 ollama/vllm과 함께 생성기의 discovery-only 제외 집합에 포함되므로, 로컬 제공자는 생성 중에 가져오거나 models.json에 기록되지 않으며 대신 런타임에 동적으로 발견됩니다. LiteLLM 모델 발견은 이제 번들된 참조 맵 대신 models.dev(다른 게이트웨이 제공자들이 사용하는 동일한 참조 소스)에 대해 메타데이터를 보강합니다. 불변성을 고정하는 회귀 테스트를 추가했습니다(로컬 제공자 블록 없음, 번들된 카탈로그에 loopback/private-network baseUrl 없음).
@oh-my-pi/pi-coding-agent
주요 변경사항
SessionStorage와 핵심 구현체(MemorySessionStorage, FileSessionStorage, RedisSessionStorage, SqlSessionStorage)에서 동기식 readTextSync를 제거했으며, 호출자가 비동기 텍스트 읽기를 사용하도록 요구합니다.
공개 SessionStoragereadTextPrefix(path, maxBytes) 및 readTextSuffix(path, maxBytes) 메서드를 readTextSlices(path, prefixBytes, suffixBytes): Promise<[string, string]>로 대체했습니다. 사용자 정의 세션 스토리지 백엔드는 새로운 결합된 slice API를 구현해야 합니다.
추가됨
환경 변수 기반 OpenTelemetry trace export를 추가했습니다. OTEL_EXPORTER_OTLP_ENDPOINT(또는 OTEL_EXPORTER_OTLP_TRACES_ENDPOINT)가 설정되면 omp는 전역 OTLP/proto trace exporter를 등록하고 에이전트 루프의 텔레메트리를 켜므로 invoke_agent / chat / execute_tool spans가 no-op 트레이서 대신 수집기에 도달합니다. 표준 OTEL_* 환경 변수 계약(엔드포인트, 헤더, OTEL_SERVICE_NAME, OTEL_SDK_DISABLED 및 OTEL_TRACES_EXPORTER=none을 대소문자 구분 없이 파싱)과 OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT 캡처 토글을 준수합니다. 엔드포인트가 구성되지 않으면 no-op입니다. http/protobuf 전송만 지원되며 grpc 또는 http/jsonOTEL_EXPORTER_OTLP*_PROTOCOL은 spans를 잘못 라우팅하지 않고 거부합니다. 이를 통해 omp를 스폰된 자식 프로세스로 실행하는 헤드리스 호스트에서 기존 텔레메트리를 사용할 수 있으므로 부모가 등록한 in-process TracerProvider가 자식에 도달할 수 없습니다. @opentelemetry/exporter-trace-otlp-proto 2.x 라인을 사용하며, Bun에서 깔끔하게 내보냅니다.
수정됨
상태 라인 세션 이름(및 편집기 테두리 / 상태 라인 간격 채우기)이 밝은 테마에서 거의 읽을 수 없는 문제를 수정했습니다.
공유 메타데이터 인덱싱 세션 백엔드를 지원하도록 IndexedSessionStorage 및 SessionStorageBackend 내보내기를 추가했습니다.
인라인 이미지가 라이브 터미널 그래픽으로 렌더링되는 개수를 제한하는 tui.maxInlineImages 설정(기본값 8)을 추가했습니다. 새 이미지가 개수를 상한 이상으로 밀어내면 가장 오래된 이미지는 전체 다시 그리기를 통해 숨겨집니다. 이들은 [Image: …] 텍스트 자리 표시자로 대체되고 터미널의 그래픽 저장소에서 제거됩니다. 따라서 많은 스크린샷/다이어그램을 포함한 긴 세션이 이미지를 계속 쌓지 않습니다(Kitty에서 scrollback 유령을 남기지 않습니다). 0으로 설정하면 모든 이미지를 인라인으로 유지합니다.
검출된 터미널, 라이브 기하 및 셀 크기, 멀티플렉서, 실제로 사용 중인 협상된 subprotocol을 출력하는 /debug 메뉴에 "View: terminal state" 항목을 추가했습니다. 그래픽(Kitty/iTerm2/Sixel), 데스크톱 알림(BEL/OSC 9/OSC 99, OSC 99가 device-attributes 프로브를 통해 확인되었는지 여부), OSC 8 하이퍼링크, 24비트 컬러, DECCARA 직사각형 SGR 배경 채우기, DEC 2026 동기화된 출력 — scrollback 지우기 전략(CSI 22 J vs CSI 2 J 다시 그리기 / ED3 eager-erase 위험) 및 원본 TERM/TERM_PROGRAM/COLORTERM 감지 신호와 함께 제공됩니다.
렌더러가 내보낼 수 있는 모든 특수 escape 프로토콜의 라이브 샘플 하나를 렌더링하는 /debug 메뉴에 "Test: terminal protocols" 항목을 추가했습니다. SGR 텍스트 속성(bold/italic/underline/strikethrough/inverse/dim), 테마 및 24비트 truecolor, OSC 8 하이퍼링크, OSC 66 텍스트 크기 조정(큰 텍스트), 활성 이미지 프로토콜(Kitty/iTerm2/Sixel, 텍스트 fallback 포함)을 통한 인라인 그래픽 견본을 렌더링하고 데스크톱 알림을 발생시키므로 현재 터미널이 실제로 어떤 프로토콜을 처리하는지 확인할 수 있습니다. 샘플 이미지는 in-process에서 생성되는 gradient PNG이므로 그래픽 테스트는 디스크의 자산이 필요하지 않습니다.
Kitty의 OSC 66 텍스트 크기 조정 프로토콜을 통해 Markdown H1 제목을 2배 크기로 렌더링하는 tui.textSizing 설정(기본값 off)을 추가했습니다. 문서화되지 않은 PI_TUI_TEXT_SIZING 환경 변수를 실제 설정으로 대체합니다. 이는 Kitty 터미널에서만 작동하며(OSC 66이 구현된 곳) 다른 곳에서는 무시되므로 제목이 절대 원본 escape 바이트를 내보내지 않습니다.
/resume 세션 선택기에 생명 주기 상태를 추가했습니다. 각 세션의 tail(마지막 32 KiB)은 이제 기존 헤더 윈도우와 함께 단일 패스로 읽어지며, 최종 메시지는 done(에이전트가 턴을 끝내고 제어를 돌려줌), interrupted(루프에서 계속되지 않은 후행 tool call 또는 tool result), aborted, error 또는 pending(회신이 없는 후행 사용자 메시지)으로 분류됩니다. 상태는 각 세션의 메타데이터 라인에 색상 세그먼트로 렌더링됩니다. 최종 메시지가 tail 윈도우보다 크면 상태가 추측되지 않고 생략됩니다.
Agent Skills 표준의 disable-model-invocation: true frontmatter 필드에 대한 지원을 추가했습니다. 이 필드를 사용하는 Skills는 이제 hide: true의 동작과 일치하는 시스템 프롬프트 목록에서 숨겨집니다.
변경됨
읽기 전용 에이전트를 태그 지정하고 명시적으로 파일 편집/명령 할당 또는 quick_task/explore로 추론을 오프로드하는 것을 금지하도록 task 도구 설명을 변경했습니다.
Redis 및 SQL 세션 스토리지 초기화를 전체 세션 콘텐츠 대신 인덱싱된 메타데이터(size, mtimeMs)만 로드하도록 변경했습니다.
세션 콘텐츠를 전체 메모리 내 미러로 캐시하지 않고 온디맨드로 가져오도록 SessionStorage 읽기 경로를 백엔드 지원 메타데이터/인덱싱된 스토리지에 의존하도록 변경했습니다.
세션 목록 slice 읽기를 모든 백엔드에서 SessionStorage.readTextSlices를 통해 수행하도록 변경했으며, 파일 전용 단일 개방 브랜치 및 호출자 관리 버퍼를 제거했습니다. FileSessionStorage는 이제 peekFileEnds를 통해 두 윈도우를 읽으며, Redis 및 SQL 백엔드는 결합된 읽기당 세션 콘텐츠를 한 번 인코딩합니다.
ask 도구 transcript 렌더러를 변경하여 단일 선택 질문을 직사각형 확인란 glyphs(☐/☑) 대신 원형 라디오 glyphs(○/◉)로 표시하도록 변경했습니다. 이는 다중 선택 질문과 공유합니다. 따라서 "하나를 선택" 콤보 박스는 체크리스트가 아닌 라디오 그룹으로 시각적으로 읽힙니다. 다중 선택 질문은 확인란을 유지합니다. unicode, nerd-font, ASCII 사전에 radio.selected/radio.unselected 기호 쌍을 추가했습니다.
ask 도구 transcript 렌더러를 변경하여 선택한 답변을 질문 양식 내에 표시하도록 변경했습니다. 이전에는 질문 양식 아래의 분리된 요약 블록에 다시 나열했습니다. 질문에 답하면 독립형 프롬프트 미리보기가 제거되고 결과가 동일한 양식을 다시 그립니다. 제공된 모든 옵션은 여전히 표시되지만 선택된 것은 채워집니다(◉/☑, 강조됨) 나머지는 흐려집니다(○/☐). 사용자 정의 자유 텍스트 답변 및 취소는 최종 항목으로 제자리에 렌더링됩니다. 이전에 나타난 호출 미리보기 및 결과로 중복되는 질문/옵션 목록을 제거합니다.
task 완료 및 ask 데스크톱 알림을 구조화된 터미널 알림(제목, 본문, 유형, 클릭 포커스 작업)으로 변경했습니다. Kitty에서 이들은 OSC 99를 통해 적절한 제목/본문으로 렌더링되고 클릭하여 포커스할 수 있습니다. 확인된 OSC 99 지원이 없는 터미널은 이전 한 줄 메시지(BEL/OSC 9)로 축소합니다.
"each kitty/tmux split" 팁을 cmux를 포함하도록 업데이트했습니다.
수정됨
컴파일된 바이너리에서 tiny-model 시작을 수정했습니다. package.jsonexports/main 메타데이터를 사용하여 설치된 캐시에서 @huggingface/transformers 및 런타임 종속성을 해결함으로써 모델을 시작할 때 모듈 해석 실패를 방지합니다.
컴파일된 바이너리에서 tiny runtime 설치 흐름을 수정했습니다. 빌드 타임 해석 @huggingface/transformers 버전을 사용하고 설치 잠금을 획득하기 전에 런타임 잠금 디렉토리의 부모가 존재하는지 확인함으로써 신규 설치에서 mismatch 및 설정 실패를 방지합니다.
반복된 패널에서 하나의 안정적인 Kitty 그래픽 id를 재사용했던 터미널 프로토콜 디버그 프로브를 수정했습니다. 이는 새로 렌더링하는 대신 이전 견본을 이동/대체할 수 있었습니다.
선택자 대화상자(the ask tool, hook 프롬프트)가 옵션에 긴 설명이 있을 때 더 짧은 터미널에서 단일 표시 옵션으로 축소되는 문제를 수정했습니다. 강조된 옵션의 래핑된 설명이 전체 행 예산을 소비하여 다른 모든 옵션을 숨기고 메뉴가 탐색할 수 없는 것으로 느껴집니다(아래쪽은 유일한 표시 항목을 이동했으며 좌우는 아무 것도 하지 않음). 완전히 확장된 목록이 오버플로우될 때 HookSelectorComponent는 이제 compact 목록을 렌더링합니다. 모든 옵션 레이블이 화면에 유지되고 강조된 옵션만 설명을 확장하며, 남은 행으로 잘립니다. 따라서 전체 메뉴는 항상 표시되고 세부 정보 창은 커서를 따릅니다.
read가 scheme //이 단일 /로 축소된 웹 URL에서 "Path not found" 오류로 실패하는 문제를 수정했습니다(예: https:/github.com/...). 이는 URL이 Node의 path.normalize/path.resolve를 통해 라우팅될 때 발생합니다. fetch URL 인식기는 이제 단일 슬래시 scheme을 수락하고 가져오기 전에 //로 복구하므로 축소된 URL이 파일 시스템 조회로 폴스루되는 대신 해석됩니다.
Opus 4.8을 사용할 수 있을 때 subagent 느린 모델 우선순위가 이전 Claude Opus 별칭으로 폴스루되는 문제를 수정했습니다. Opus 4.8 및 4.7 별칭을 이전 Opus fallback 앞에 추가했습니다(#1753).
웹 검색 제공자 선택자가 TUI 설정/설정에서 공유 제공자 메타데이터에서 파생되도록 수정했으므로 새로 추가된 제공자는 기본 설정 목록에서 생략될 수 없습니다.
@oh-my-pi/pi-natives
수정됨
정렬된 glob() 스캔을 캐시되지 않은 탐색 중 maxResults로 제한하고 제한된 top-maxResults heap에 허용된 항목에 대해서만 onMatch 콜백을 내보냈으므로 광범위한 OMP find progress와 timeout partials은 반환된 mtime 순위 세트와 일치하면서 부모 프로세스 메모리를 제한된 상태로 유지합니다(#1761).
wrapTextWithAnsi가 BEL 종료 문자열 escape를 포함하는 텍스트에서 무한 루프로 멈추는 문제를 수정했습니다. DCS/SOS/PM/APC(ESC P/ESC X/ESC ^/ESC _)는 ST 대신 BEL로 닫혀 있습니다. ansi_seq_len_u16은 이들에 대해 ST(ESC \) terminator만 수락했습니다(OSC는 이미 둘 다 수락함). 따라서 TUI cursor 마커(ESC _ pi:c BEL)와 같은 BEL 종료 APC는 분류되지 않았습니다. 이는 보이는 너비로 오산되었으며 break_long_word의 비 ESC 스캔은 ESC를 지날 수 없어 영원히 회전했습니다. terminator 집합은 이제 OSC(ST또는BEL)와 일치하며, break_long_word는 방어적으로 분류할 수 없는 모든 escape를 내보내고 건너뜁니다. 따라서 잘못되었거나 알 수 없는 시퀀스가 래핑 루프를 차단할 수 없습니다.
@oh-my-pi/swarm-extension
수정됨
swarm /swarm run이 authStorage/modelRegistry 식별 오류로 실패하는 문제를 수정했습니다(#1472)
@oh-my-pi/pi-tui
추가됨
비파괴 전체 페인트를 위한 Kitty CSI 22 J screen-to-scrollback 지웁니다. 파괴적인 history/session 재구성을 위해 ED3를 유지합니다.
Kitty OSC 99 rich notification 형식 지정 및 시작 기능 프로빙을 추가했습니다.
Kitty OSC 66 텍스트 크기 Markdown H1 제목(2배 크기) 및 OSC 66 spans에 대한 native 텍스트 너비 지원을 추가했습니다. 기본값은 off이고 TERMINAL.textSizing capability를 통해 Kitty(OSC 66을 구현하는 유일한 터미널)로 제한됩니다. 호스트는 setTextSizing을 통해 활성화합니다.
Kitty Unicode 자리 표시자 이미지 렌더링(U=1 + U+10EEEE with 명시적 행/열 diacritics)을 추가했습니다. 인라인 이미지는 전경색에 이미지 id를 운반하는 실제 텍스트 셀로 그려지므로 수평 슬라이싱, reflow, 겹치는 그리기 후에도 유지됩니다. cursor 위치 지정 a=p 배치에 의존하지 않습니다. Kitty 계열 터미널에서는 기본적으로 활성화됩니다. PI_NO_KITTY_PLACEHOLDERS=1로 옵트 아웃하고 grid가 diacritic 테이블의 주소 지정 범위를 초과할 때 직접 배치로 폴백합니다.
Kitty temp-file 이미지 전송(t=t)을 추가했습니다. 로컬 세션에서 디코딩된 PNG 바이트는 tty-graphics-protocol temp 파일에 기록되고 in-band base64 대신 경로가 전송됩니다. 시작 a=q,t=t 지원 프로브 뒤에 제어됩니다. PI_KITTY_IMAGE_TRANSMISSION=direct|temp-file|auto로 제어됩니다. 명시적으로 강제하지 않으면 SSH에서 비활성화됩니다.
DEC private 모드 2026(동기화된 출력) 및 2048(in-band resize)에 대한 DECRQM capability 감지를 추가했습니다. 동기화된 출력 페인트 래퍼는 터미널이 2026 미지원을 보고할 때 제거됩니다(PI_NO_SYNC_OUTPUT 재정의 유지). DEC 2048 in-band resize는 지원될 때 활성화됩니다. 보고된 기하 및 셀 픽셀 크기는 CSI 48 ; rows ; cols ; yPx ; xPx t 보고서에서 업데이트되며, SIGWINCH 및 CSI 16 t는 fallback으로 유지됩니다.
TUI 테스트를 위한 주입 가능 render scheduler를 추가했으므로 전역 시계 또는 이벤트 루프 타이밍을 패치하지 않고 결정론적 render 드레인이 가능합니다.
ImageBudget을 추가했으며, 이는 가장 최근 N개 이미지를 라이브 터미널 그래픽으로만 유지하고 이전 이미지를 텍스트 fallback으로 강등시키는 인라인 이미지 상한입니다. 새 이미지가 개수를 상한 이상으로 밀어내면 렌더러는 전체 다시 그리기 및 명시적 Kitty 그래픽 제거(a=d,d=I)를 통해 가장 오래된 이미지를 숨깁니다. 텍스트 지우기 escapes(CSI 2 J/CSI 3 J)는 Kitty 이미지를 제거하지 않습니다. TUI#setMaxInlineImages를 통해 상한을 구성합니다(0은 비활성화).
Kitty 인라인 이미지를 transmit-once + placement 체계로 변경했습니다. base64 데이터는 se