@oh-my-pi/pi-agent-core/compaction 아래에 shake 컴팩션 프리미티브(collectShakeRegions, applyShakeRegion, applyShakeRegions, summarizeShakeRegions, DEFAULT_SHAKE_CONFIG, AGGRESSIVE_SHAKE_CONFIG 및 ShakeRegion/ShakeConfig/ShakeSummaryItem/ShakeSummaryComplete/ProtectedToolMatcher 타입)를 추가했습니다. 이들은 무거운 컨텍스트 영역(전체 도구 호출 결과 및 큰 펜스 처리/XML 블록)을 감지하고, 이를 플레이스홀더로 제거하거나 주입된 완성 백엔드를 통해 추출적으로 압축합니다(LLM 요약 컷포인트 없음). 컴프레서는 제공자에 관계없이 작동합니다: 호출자는 이를 로컬 온디바이스 모델에 연결합니다. 순수 감지/변경; I/O 없음.
수정됨
read에 대한 도구 출력 정리 및 shake 보호를 수정했습니다: 일반적인 파일/URL 읽기는 이제 컴팩션 대상이 되며, path가 skill://로 시작하는 read 호출은 네이티브 skill 결과처럼 보호된 상태로 유지됩니다.
@oh-my-pi/pi-ai
변경됨
OpenAI 응답/Codex 도구 호출 인수의 델타별 스트리밍 JSON 재파싱을 제한했습니다(중간 스트림 파싱 비용을 O(N²)에서 O(N)으로 제한). response.output_item.done을 통한 최종화는 이제 권위있는 전체 인수를 지속되는 어시스턴트 메시지 블록에 다시 쓰므로, 후행 response.function_call_arguments.done 없이 최종화된 도구 호출은 더 이상 오래되거나 비어있는({}) 인수를 유지하지 않습니다. (#1507)
@oh-my-pi/pi-coding-agent
추가됨
소수 및 k/m 접미사 턴 예산 지시어에 대한 지원을 추가했습니다. eval 메시지 파싱에서 +1.5k 및 +2m 같은 예산을 활성화합니다.
eval 예산 해결을 변경하여 활성 Goal Mode 제한보다 사용자 +Nk 지시어를 우선하고 턴당 상한이 설정되지 않았을 때 Goal Mode로 폴백합니다.
eval 옵션 agent_type/agentType, model, context, 및 label을 agent() 에이전트에 추가했으며, JS 및 Python eval 셀에서 schema가 제공될 때 구조화된 JSON을 반환합니다.
eval agent() 호출을 위한 라이브, Task 도구 스타일의 진행 트리를 추가했습니다. 노트북(코드 셀) 박스 아래에 그려집니다. 각 서브에이전트는 상태 라인(아이콘 · ID · 도구 수 · 컨텍스트 · 비용, 완료 시 지속시간)으로 나타나며, 실행 중일 때 현재 도구/의도를 표시하고 셀의 최종 결과가 아닌 실행 중간에 업데이트됩니다. 진행 이벤트는 서브에이전트 ID당 병합되므로 지속되는 이벤트 목록은 많은 제한된 틱에서 제한된 상태로 유지됩니다.
eval 런타임에 agent()를 추가했으므로 JS 및 Python 셀은 기존 작업 실행자를 통해 한 개의 서브에이전트를 생성할 수 있습니다. JS eval은 또한 서브에이전트 호출을 오케스트레이션하기 위한 제한된 parallel() 및 pipeline() 헬퍼를 얻었습니다.
workflow 매직 키워드를 추가했습니다(orchestrate/ultrathink 미러링): 독립 실행형 단어는 에디터에서 황색→녹색으로 빛나며, 모델이 eval(에이전트/병렬/파이프라인)에서 결정적인 다중 서브에이전트 팬아웃을 작성하도록 안내하는 숨겨진 공지를 추가합니다. 일치는 공백으로 구분되며 대소문자를 구분합니다(소문자만). 단수 및 복수 모두 트리거되지만, 대문자 형식, workflowed 같은 변곡, workflow.ts 같은 경로 임베드 발생은 트리거되지 않습니다.
Python eval 런타임에 parallel() 및 pipeline()을 추가했습니다(동기 agent() 브릿지를 통한 스레드 풀). JS 헬퍼를 미러링합니다: 제한된 풀(기본값 4, 최대 16), 입력 순서 보존, 모든 pipeline 단계 사이의 배리어, 및 워커 스레드 내에서 agent()가 작동하도록 하는 contextvar 전파입니다.
log(), phase() 및 budget 객체를 두 eval 런타임(Python 및 JS)에 추가했습니다. log/phase는 진행/단계 상태 라인을 내보냅니다. budget.total/budget.spent()/budget.remaining()/budget.hard는 실시간 턴당 출력 토큰 예산을 노출합니다. 사용자 메시지의 +Nk 지시어는 권고 예산을 설정합니다(모델이 budget.remaining()을 통해 자체 제한). +Nk! (또는 활성 Goal Mode 예산)은 도달하면 추가 eval agent() 스폰을 차단하는 하드 상한입니다. budget.spent()는 이 턴에서 메인 루프 및 모든 eval 스폰된 서브에이전트에서 소비한 출력 토큰을 계산합니다.
가상 내부 URL(예: omp:// 루트 포함)에 대한 검색 지원을 추가했습니다. 파일 시스템 경로와 함께 검색 대상으로 메모리 내 내부 리소스를 해결하고 스캔합니다.
가상 내부 URL 검색 대상의 확장을 추가했으므로 search가 omp://이 주어질 때 여러 내부 문서를 일치시킬 수 있습니다.
/omfg <complaint> 슬래시 명령어를 추가했습니다. 불만에서 TTSR 규칙을 작성하고, 현재 대화에 대해 검증하고, 프로젝트 또는 ~/.omp/agent/rules에 저장하고, 라이브로 등록합니다.
/shake 슬래시 명령어 및 LLM 요약 대신 무거운 콘텐츠를 기계적으로 드롭하여 컨텍스트를 줄이는 shake / shake-summary 컴팩션 전략을 추가했습니다. /shake(/shake elide 별칭)은 무거운 도구 호출 결과 및 큰 펜스/XML 블록을 제거하고, 원본을 한 세션 아티팩트로 오프로드하고, 복구 가능한 artifact://<id> 플레이스홀더를 남깁니다. /shake summary는 로컬 온디바이스 모델(providers.shakeSummaryModel, 기본값 qwen3-1.7b)로 동일한 영역을 압축하고, 모델을 사용할 수 없을 때 영역당 엘라이드로 폴백합니다. /shake images는 이미지 블록을 제거합니다. 자동 유지보수는 shake / shake-summary 전략(16k 보호 윈도우)을 준수합니다. 컨텍스트 오버플로우 시 아무것도 회수하지 않는 shake는 컨텍스트 전체 요약으로 폴백합니다.
/shake summary 및 shake-summary 컴팩션 전략에서 사용하는 로컬 온디바이스 모델을 선택하는 providers.shakeSummaryModel 설정을 추가했습니다. 온디바이스에서 완전히 실행되며(처음 사용 시 다운로드) 원격/클라우드 LLM을 호출하지 않습니다.
변경됨
eval 셀 timeout을 하드 벽시계 데드라인에서 비활성(유휴) 예산으로 변경했습니다: 셀은 이제 전체 윈도우 동안 진행 신호가 없은 후에만 중단되며, 모든 상태 이벤트(에이전트 진행 스냅샷, log()/phase() 및 도구 브릿지 활동)는 워치독을 다시 시작합니다. 계속 진행 상황을 보고하는 긴 agent()/parallel() 팬아웃은 더 이상 실행 중간에 타임아웃되지 않습니다(이전에는 서브에이전트가 적극적으로 진행 중일 때도 커널이 고정 데드라인에서 종료됨). 순수 print/stdout은 워치독을 리셋하지 않으므로 순수 계산 실행 루프는 제한된 상태로 유지됩니다. 타임아웃은 전적으로 중단 신호에 의해 구동되므로 런타임이 경쟁 고정 타이머를 시작하지 않습니다.
턴 예산 파싱을 수정했습니다. +Nk 지시어를 토큰 경계에서만 일치시켜, version 1.2.3, c++, +500kfoo 같은 값이 예산 규칙을 트리거하지 않도록 합니다.
오버플로우 제공자, 훅 옵션, 분기 메시지, 에이전트, 확장 및 세션 트리 피커를 변경하여 퍼지 유형별 필터 검색을 지원합니다.
Shift+Ctrl+P를 변경하여 지속하지 않고 앞으로 순환하는 대신 역할 모델을 역방향으로 순환하도록 합니다.
빈 프롬프트 입력을 변경했습니다. ?는 /hotkeys를 여는 대신 리터럴 물음표를 삽입합니다. 바로 가기 참조를 위해 /hotkeys를 명시적으로 사용하세요.
파일 기본명으로 축소하는 대신 search 출력을 변경하여 그룹화된 결과 및 details.files에서 전체 가상 및 내부 URL 경로를 보존합니다.
/omfg를 변경하여 최대 3개의 생성 시도를 검증 피드백으로 실행하고 드래프트가 어시스턴트 히스토리와 일치하지 않을 때만 저장 메시지를 표시합니다.
/omfg를 변경하여 라이브 드래프트 패널을 생성/검증/저장 상태와 함께 표시하고 Esc로 활성 규칙 요청을 취소할 수 있도록 합니다.
키바인딩 구성을 변경하여 ~/.omp/agent/keybindings.yml을 사용하며, 레거시 keybindings.json에서 자동 마이그레이션하고 keybindings.yaml 지원을 계속합니다.
로컬 SQLite 메모리 백엔드 식별자를 mnemosyne에서 mnemopi로 변경했습니다. 기존 구성은 로드 시 자동으로 마이그레이션됩니다: memory.backend: mnemosyne은 mnemopi가 되고 mnemosyne.* 설정 블록은 mnemopi.*로 이름이 변경됩니다(명시적인 mnemopi 블록이 이미 존재할 때 건너뜀).
ultrathink/orchestrate/workflow 매직 키워드를 변경하여 마크다운을 인식하도록 했습니다: 독립 실행형 단어는 이제 렌더링된 사용자 메시지 버블에서도 빛나며(라이브 에디터와 일치), 키워드가 펜스 코드 블록, 인라인 `code` 범위 또는 XML/HTML 섹션 내에 있을 때는 글로우도 숨겨진 스티어링 공지도 트리거되지 않습니다.
수정됨
POSIX 터미널에서 Ctrl+O 도구 결과 확장을 수정했습니다. 오프스크린 도구 블록이 뷰포트 위의 오래된 축소된 행을 남기는 대신 네이티브 스크롤백을 다시 빌드합니다.
제거됨
/drop-images 슬래시 명령어를 제거했습니다. 동일한 dropImages() 경로를 통해 세션에서 모든 이미지를 제거하는 /shake images를 사용하세요.
수정됨
eval 셀의 최종 agent() 완료 상태 내보내기를 수정했습니다. 마지막 라이브 진행 스냅샷은 이제 도구 수 및 비용과 같은 누적 서브에이전트 메트릭을 보존합니다.
eval의 agent()를 수정하여 서브에이전트를 시작하기 전에 플랜 모드, 스폰 허용 목록 및 비활성화된 에이전트 확인을 강제합니다.
eval에서 재귀 agent() 호출을 수정했습니다. 기존 최대 서브에이전트 깊이 제한을 강제합니다.
런타임 모델 전환(Ctrl+P 순환, --model, /model, 모델 피커 선택 및 프로그래밍 방식 변경)을 수정했습니다. 이제 지속되는 modelRoles.default를 덮어쓰지 않습니다. 모델 피커의 명시적인 "기본값으로 설정" 작업과 설정 변경만 기본값을 지속합니다.
search를 수정했습니다. 가상 내부 URL 대상에서 라인 범위 접미사를 준수하므로 요청된 범위 외의 일치는 더 이상 반환되지 않습니다.
소스 파일 없는 내부 URL을 처리하도록 search를 수정했습니다. Path not found를 잘못 보고하지 않고 대신 가상 콘텐츠의 일치를 반환합니다.
펜스 처리된 또는 노이즈가 많은 모델 출력을 허용하도록 /omfg 파싱을 수정했습니다. 생성된 규칙 이름을 정규화하고 저장하기 전에 유효하지 않은 정규 표현식 조건을 거부합니다.
자동 씽킹 세션을 수정했습니다. 분류 후 구체적으로 해결된 노력을 지속하여, 세션을 재개할 때 대기 중인 auto로 돌아가는 대신 해당 수준을 복원합니다.
확장 등록 CLI 플래그(예: --spawn-peer <value>)가 초기 프롬프트로 유출되는 것을 수정했습니다. 확장 플래그 집합을 알 수 있으면 argv를 다시 파싱하여 플래그 값이 소비되고 메시지가 되거나 @file 인수로 잘못 읽히지 않습니다. 등록된 플래그는 같은 이름의 기본 제공 플래그를 섀도우하므로, 충돌하는 플래그(예: 플랜 모드의 --plan)는 확장의 의미로 파싱되며, 기본 제공 분기에서 소비되지 않습니다(그렇지 않으면 다음 메시지를 먹고 기본 제공 필드를 손상시킬 것). 확장 플래그 및 @file 인수는 이제 세션이 생성되기 전에 해결되므로, 읽을 수 없는 초기 @file은 정크 세션/터미널 경로를 남기지 않고 종료됩니다. (#1503)
바닥글 상태 라인 잘림을 수정했습니다. 왼쪽 통계 및 오른쪽 모델 세그먼트는 이제 터미널 셀 너비로 잘라냅니다(truncateToWidth를 통해) SGR 전용 정규 표현식 및 코드 포인트 substring 대신 모든 VT/ANSI 이스케이프를 제거합니다(stripVTControlCharacters를 통해). 따라서 넓은 글리프, OSC 하이퍼링크 및 비SGR 수열은 더 이상 라인을 오버플로우할 수 없습니다.
스트리밍 편집 차이 미리 보기 렌더링이 높고 절반 비어있는 박스(및 이전의 "박스가 반복적으로 커지고 축소" 스터터)를 렌더링하는 것을 수정했습니다. 전체 파일 Myers 재차이는 스트리밍된 모든 청크에서 재계산되고 정렬은 페이로드 길이 측면에서 단조롭지 않으므로, 전체 변경 세그먼트를 유지하는 청크 인식 윈도우는 틱마다 행을 얻고 잃었습니다. 이전의 높은 수위 행 예약이 스터터를 숨겼지만 예약된 높이를 빈 행으로 채웠고, 차이가 피크 아래로 축소될 때마다 큰 빈 직사각형이 남았습니다. 미리 보기는 이제 고정 높이 후행 윈도우를 차이의 아래쪽에 고정합니다("뒤에서 수락"). 박스는 빈 패딩 대신 실제 차이 컨텍스트의 안정적인 전체 윈도우로 유지됩니다.
POSIX 터미널(macOS/Linux)의 스트리밍 도구 결과 위의 중복/오래된 스크롤백을 수정했습니다. 출력이 커지고 다시 배치되는 도구(예: 청크를 얻는 편집 차이)는 이미 네이티브 스크롤백으로 스크롤한 행을 다시 렌더링합니다. 알 수 없는 뷰포트 앤티 얀크 지연은 새 행이 아래에 렌더링되는 동안 이전 사본을 제자리에 두어 블록을 두 번 표시했습니다. 이벤트 컨트롤러는 이제 포그라운드 도구 실행 중 TUI의 eager 네이티브 스크롤백 재구축을 활성화합니다(setEagerNativeScrollbackRebuild). 따라서 이러한 오프스크린 재렌더링은 히스토리를 깔끔하게 재구축합니다(꼬리로 스냅은 도구 중간에 허용 가능). 백그라운드 실행 도구 및 일반 어시스턴트 텍스트 스트리밍은 비얀크 지연을 유지합니다. 모드는 각 턴 시작 시 리셋됩니다.
@oh-my-pi/pi-mnemopi
변경됨
임베딩 결과 정규화를 변경하여 Float32Array 벡터를 반환하므로 embed 및 embedQuery는 이제 float32 행을 캐시하고 내보냅니다.
임베딩 제공자 계약을 unknown 대신 단일 유형 EmbeddingOutput(AsyncIterable<number[][]>)으로 변경했습니다. fastembed의 embed()와 일치하므로 EmbeddingProvider.embed 및 provider 런타임 옵션은 임베딩 행렬을 비동기 배치로 스트림합니다(async *embed(texts) { yield texts.map(embedOne); }).
로컬 모델 캐시 디렉토리 해결을 변경했습니다. fastembed는 하드코드된 ~/.hermes/cache/fastembed 경로 대신 getFastembedCacheDir을 사용합니다.
수정됨
검색, 클러스터링 및 캐싱에서 코사인 유사도 동작을 수정했습니다. 일관되게 일치하지 않는 벡터 길이를 영 패드로 처리하고 비유한 값을 무시합니다.
임베딩 API 요청을 수정했습니다. 공유 재시도 로직을 통해 백오프로 일시적 실패를 재시도한 후 null을 반환합니다.
컴파일된 omp 바이너리가 fastembed 및 onnxruntime-node를 Bun의 정적 컴파일러에 도달 가능하게 유지하고 지연된 런타임 로딩을 유지하여 로컬 Mnemopi 임베딩을 잃는 것을 수정했습니다.
@oh-my-pi/pi-tui
추가됨
overflowSearch를 SelectListLayoutOptions에 추가했습니다. 소비자가 SelectList 인스턴스당 유형별 필터 검색 및 검색 상태 렌더링을 활성화 또는 비활성화할 수 있습니다.
오버플로우 SelectList 피커에 퍼지 유형별 필터 검색을 추가했습니다. 검색 상태 및 결과 수를 포함합니다.
TUI.setEagerNativeScrollbackRebuild(enabled)를 추가했습니다. 활성화되면 라이브 렌더 프레임은 뷰포트 위치가 관찰 불가능한 경우(POSIX) 비파괴적 재칠하기로 미루는 대신 오프스크린/구조적 변경 시 네이티브 스크롤백을 재구축합니다. 앤티 얀크 보장을 깨끗하고 중복 없는 히스토리와 교환합니다. 개활지 위의 출력이 적극적으로 다시 배치되는 윈도우(예: 결과가 여전히 스트리밍 중인 도구)를 의도합니다. 알려진 스크롤된 뷰포트를 보고하는 터미널은 여전히 미룹니다.
변경됨
에디터 자동완성 및 슬래시 명령어 SelectList에 대해 레이아웃 옵션에서 overflowSearch: false를 전달하여 대화식 검색 필터링을 비활성화했습니다.
수정됨
오버레이가 숨겨지는 동안 오버레이 콘텐츠를 뷰에서 제거하면서 창 히스토리를 그대로 유지하여 숨겨진 tmux 오버레이를 라이브 뷰포트에서 보존했습니다.
강제 TUI 렌더가 콘텐츠 성장과 병합되고 순수 꼬리 추가를 판독기가 히스토리로 스크롤할 때 지연하여 네이티브 스크롤백을 보존했습니다.
강제 및 구조적 TUI 렌더 중 기존 터미널 스크롤백을 보존하여 컴포넌트 변경 후 기존 셸 라인이 표시되도록 유지했습니다.