AgentLoopConfig.beforeModelCall을 추가했습니다. 이 기능은 최종 프로바이더 컨텍스트와 실행 중단 신호를 받으며, 프로바이더가 호출되기 전에 실행을 종료하기 위해 { stop: true, reason? }를 반환할 수 있습니다. 이를 통해 호스트는 비용을 지불하지 않기로 결정한 요청을 거부할 수 있습니다(프롬프트가 더 이상 맞지 않음, 예산 한계 도달, 세션 핸드오프 필요). Agent.setBeforeModelCall은 호스트 콜백을 설치하며, Agent.addBeforeModelCall은 기존 콜백을 대체하지 않으면서 추가 콜백을 등록하고 처리기를 반환합니다. 게이트에 의해 중단된 실행은 보류 중인 소프트 도구 리마인더/에스컬레이션과 다음 승인된 요청을 위한 미처리된 하드 도구 선택을 유지합니다. 연기된 선택은 활성 도구에 대해 재검증되고 대기 중인 세션 상태로 지워집니다(#6543 by @paralin).NO_PROXY 지원을 통해 프로바이더별 및 표준 프록시 환경 해석이 필요한 트랜스포트를 위해 getProxyForUrl()을 추가했습니다(#6770).omp login siliconflow / omp login siliconflow-cn이 각 지역의 /v1/models 엔드포인트에 대해 검증된 재사용 가능한 자격증명을 저장합니다.siliconflow, siliconflow-cn)를 추가했습니다. 번들된 카탈로그가 없으며, 모델 목록은 각 지역의 /v1/models 엔드포인트에서 실시간으로 가져오고 비채팅 항목(임베딩, 리랭커, 이미지, 오디오, 비디오)은 필터링됩니다. 발견은 런타임에 프로바이더의 models.dev 카탈로그에서 가격 책정, 컨텍스트/출력 제한 및 추론 메타데이터를 하이드레이트합니다(models.dev에서 아직 색인하지 않은 id의 번들된 업스트림 참조를 추론 전용 폴백으로 사용). 이를 통해 추론 모델은 사고를 계속 활성화된 상태로 유지하고 세션은 실제 컨텍스트 윈도우에 대해 압축합니다. SILICONFLOW_API_KEY / SILICONFLOW_CN_API_KEY 환경 변수는 getEnvApiKey에 연결됩니다.$2.67 (sub) + $0.41 (adv)처럼 기본 및 Advisor 지출을 렌더링하면서 런타임 비활성화 및 동일 세션 기록 다시 쓰기 전반에 걸쳐 이미 발생한 Advisor 비용을 유지합니다.effort 파라미터를 task.enableEffort를 통해 옵트인으로 만들었으며, 기본값은 false이고 활성화될 때까지 플랫 및 배치 스키마 및 도구 지침에서 필드를 생략합니다.bun:ffi를 통해 SetConsoleTitleW를 사용하고 모든 플랫폼에서 변경되지 않은 제목을 중복 제거하여 터미널 제목 업데이트 오버헤드를 줄였습니다. Windows 작업 제목은 이제 스핀 업데이트 일정 대신 정적 : 구분자를 유지하며, 다른 플랫폼은 애니메이션 구분자를 유지합니다.task.maxEffort를 추가하여 모델별 해석 후 작업 도구의 선택적 스폰별 노력 힌트를 캡 처리하므로, 운영자는 설정된 상한선을 초과하지 않도록 허용하면서 노력 힌트를 활성화할 수 있습니다. 상한선은 이제 스폰된 세션으로도 이동하므로 재시도 폴백 모델 스왑이 캡을 초과하도록 에스컬레이션하는 대신 다시 클램프합니다(#6580, #6794 by @wolfiesch).<user_interjection>...<message>...</message>... 래퍼는 이제 중재를 설명하는 <system-notice>이고 그 뒤에 래핑되지 않은 사용자의 원본 메시지가 따릅니다. 이는 기존 <system-notice>/<system-directive> 규칙과 일치하며, 리터럴 메시지를 자신의 태그 쌍 내부에 중첩하는 대신 일부 모델에서는 혼동을 유발했습니다.enabled: false인 프로젝트 foo는 사용자 수준 foo를 비활성화된 상태로 유지하면서도 다르게 이름이 지정된 동등한 연결을 굶기지 않습니다.read와 omp read는 이제 ags://capabilities/current-host와 같은 서버 공시 네이티브 리소스 URI를 해석하면서 기존 mcp://<resource-uri> 양식을 유지합니다./인 서버 공시 URI(예: catalog://root/)는 이제 재구성 시 후행 슬래시를 잃는 대신 바이트 단위로 보존됩니다. 불투명 리소스 URI(urn:example:document, custom:item)는 파일 시스템 처리로 폴스루되는 대신 read와 omp read 리졸버 게이트에서 인식됩니다. 실패한 resources/templates/list는 더 이상 성공한 resources/list를 폐기하지 않으며, 이전에는 거짓 누락 리소스 오류를 생성했습니다.languageId: "plaintext"를 전송하는 문제를 수정했습니다. 디스크 및 메모리 내 문서 열기를 위해 lsp.json에서 선택적 서버별 languageId를 명시하면 됩니다(#6800).dialogOptions를 무시하는 문제를 수정했으며, 확장 watchdog의 시간 초과 시 처리기 소유 대화 상자를 취소하여 오래된 승인 UI가 차단된 도구 호출보다 더 오래 지속될 수 없습니다(#6805).ctx.model getter를 스냅숏하는 문제를 수정했으므로, pi.setModel()을 호출한 후 ctx.model을 읽는 처리기는 오래된 모델을 보았습니다. 범위가 지정된 컨텍스트는 이제 스프레드하는 대신 기본 컨텍스트에 위임합니다.$ 명령 및 eval 도구)가 러너 내부 트레이스백 프레임을 노출하는 문제를 수정했습니다. 셀 구문 오류는 이제 _handle_request_async/ast.parse 스택 덤프 대신 <cell> 파일명을 가진 베어 캐럿 표시로 렌더링되며, 런타임 트레이스백은 사용자 코드에서 시작하여 Ruby 러너의 사용자 프레임 필터링과 일치합니다./session, /advisor status, /jobs, /changelog, /context, /memory view)뿐만 아니라 /usage가 네이티브 스크롤백에서 중복되는 문제를 수정했습니다. 이 콜사이트는 present()를 통해 최종화된 패널을 즉시 마운트했으며, 턴이 끝날 때까지 presentCommandOutput()을 통해 연기하지 않았습니다(#5427에서 /tools//mcp에 추가된 경로). 따라서 패널은 여전히 성장하는 라이브 블록 위에 추가했고 더 낮은 곳에서 재커밋했습니다(#6767).ModelRegistry에서 확장 제공 모델, 자격증명, 관리자 및 커스텀 API를 등록 해제하는 문제를 수정했습니다(#6783)./live 사이드밴드 WebSocket이 표준 프록시 환경 변수 및 NO_PROXY를 무시하는 문제를 수정했으며, 이는 프록시된 세션을 막혔으나 Codex 연결의 나머지는 성공했습니다(#6770).kill 기본 제공이 숫자 신호를 거부하고 여러 프로세스 피연산자를 거부하며, 첫 실패한 대상에서 중단하고 표준 SIGTERM 대신 SIGKILL으로 기본값을 지정하는 문제를 수정했습니다. 음수 PID 피연산자(프로세스 그룹 kill(2))와 -- 옵션 끝 마커는 이제 신호로 잘못 파싱되는 대신 처리됩니다(#6779).learned.md 저장이 모든 쓰기(후행 줄바꿈 분할 아티팩트)에서 빈 줄을 증가시키고 모든 제목/산문을 모든 불릿 위로 끌어올리는 문제를 수정했으며, 이는 손으로 정렬된 파일에서 잘못된 제목 아래에 수업을 재지정했습니다. 저장은 이제 바이트 단위로 멱등하며 혼합 마크다운 순서를 유지합니다. 비목록 줄은 위치를 유지하고, 새 수업은 첫 불릿 실행 헤드에 최신 우선으로 삽입되며, 중복 제거/캡은 제자리에서 불릿 줄에 작동합니다.bun run build는 scripts/bazel-natives.ts를 구동합니다. TypeScript 바인딩 재생성은 bun run build:bindings로 이동했습니다(Rust API 표면이 변경될 때만 필요함). CI는 sccache + 대상 디렉터리 스냅숏 대신 콘텐츠 주소 bazel-remote 작업 캐시를 통해 캐시합니다. 이는 웜 네이티브 다시 빌드를 ~20분에서 초로, 콜드 캐시 히트 빌드를 ~2.5분으로 줄입니다.pi-uutils-ctx, pi-shell(fd 소유자 필터, coreutils argv) 및 vendored uu-find/uu-stat의 unix 전용 필드/헬퍼의 데드 코드(Windows용 컴파일 시), 그리고 musl의 pi-iso에서 더 이상 사용되지 않는 libc::time_t 캐스트. pi-walker는 이제 작업 공간 전체 기능 통합에 의존하는 대신 사용하는 windows-sys 기능(Win32_Foundation, Win32_Security, Win32_Storage_FileSystem, Win32_System_IO)을 선언합니다.setRawMode failed with errno: 2 오류로 사망하는 문제를 수정했습니다. 재활용된 터미널 창은 pty를 취소하므로 stop()의 원본 모드 복원은 더 이상 tty가 아닌 fd에 도달했습니다. throw는 #markTerminalDisconnected()에서 벗어나 자신의 SIGHUP를 선제했습니다. 터미널 티어다운은 이제 연결 해제 경로에서 최선의 노력이며, emergencyTerminalRestore()과 일치하므로 #5837에서 추가된 종료는 항상 실행됩니다.ctrl+backspace(선언된 tui.editor.deleteWordBackward 기본값)는 발생하지 않았으며 deleteWordBackward, deleteWordForward, deleteToLineStart, deleteToLineEnd, yank, 및 yankPop의 keybindings.yml 리맵은 무시되었습니다. 이는 이러한 작업이 커서 모션 및 단일 줄 Input이 이미 수행하는 것처럼 keybindings.matches(...)가 아닌 하드코드된 코드로 일치했기 때문입니다(#6782).0x08 → ctrl+backspace 명확화(WT_SESSION 설정, SSH_* 설정 해제)를 matchesKey/parseKey 이음을 통해 내보낸 matchesRawBackspace 헬퍼를 라우팅하여 복원했습니다. 터미널 ID를 사용할 수 없는 원격 SSH/컨테이너 세션은 PI_TUI_RAW_BACKSPACE_IS_CTRL=1로 옵트인할 수 있습니다(#6782).WT_SESSION을 상속하지만 일반 Backspace에 대해 원본 0x08을 발합니다. 따라서 자동 원본 백스페이스 → ctrl+backspace 휴리스틱이 잘못 발동했습니다. 휴리스틱은 이제 멀티플렉서 세션(TMUX/STY/ZELLIJ 또는 tmux/screen으로 시작하는 TERM)을 건너뜁니다. PI_TUI_RAW_BACKSPACE_IS_CTRL=1은 모든 곳에서 명시적 옵트인으로 남습니다(#6784).전체 변경 로그: v17.1.5...v17.1.6