CheckCredentialsOptions.completionProbe (및 completionTimeoutMs)를 추가하여 AuthStorage.checkCredentials가 만료 시 새로고침 후 각 자격증명을 공급자의 채팅 완료 엔드포인트에 대해 추가로 검증할 수 있습니다. 결과는 CredentialHealthResult.completion ({ok, reason?, modelId?, latencyMs?})에 기록되며 사용량 ok 필드는 변경되지 않습니다. 공개 타입: CompletionProbe, CompletionProbeInput, CompletionProbeCredential, CredentialCompletionResult. 해당 행에 등록된 UsageProvider가 없어도 프로브는 실행되며, OAuth 새로고침 실패 시에는 건너뜁니다(오래된 바이트는 업스트림 실패만 가립니다).wafer-pass, wafer-serverless)를 추가했습니다. OpenAI 호환(https://pass.wafer.ai/v1), bearer 인증, wfr_… 키를 사용합니다. /login wafer-pass 및 /login wafer-serverless는 키를 /v1/models에 대해 붙여넣고 검증합니다. WAFER_PASS_API_KEY 및 WAFER_SERVERLESS_API_KEY 환경 변수가 getEnvApiKey에 연결되어 있습니다. 번들된 카탈로그는 wafer-pass/{GLM-5.1, Qwen3.5-397B-A17B} 및 wafer-serverless/{GLM-5.1, Kimi-K2.6, Qwen3.5-397B-A17B, Qwen3.6-35B-A3B, qwen3.7-max, deepseek-v4-flash, deepseek-v4-pro}를 시드합니다. /v1/models을 통한 동적 검색은 런타임에 추가 모델을 오버레이합니다. Pass 계층 검색은 wafer.tier === "pass_included"로 필터링합니다. Pass-SKU 비용은 0으로 시드됩니다(정액 구독, 토큰당 요금 없음 — kimi-code/firepass/alibaba-coding-plan과 일치). Serverless 비용은 *_cents_per_million 엔벨로프에서 파생된 wafer.ai 소매 가격이며 value × 125 / 10000으로 계산됩니다(예: GLM-5.1 120 → $1.50/M, Kimi-K2.6 88 → $1.10/M). 추론 항목은 wafer.provider 엔벨로프에서 선택된 사고 호환성을 가집니다: zai/moonshotai → zai 스타일 thinking: { type }, qwen → 최상위 enable_thinking, deepseek 및 알 수 없는 업스트림은 설정되지 않아 detectOpenAICompat이 요청 시간에 ID 패턴에서 reasoning_effort를 선택할 수 있습니다.AuthStorage.getApiKey를 호출할 때 대화별 promptCacheKey/sessionId를 사용하도록 변경하여 반복 턴이 사용 불가능할 때까지 동일한 자격증명을 유지할 수 있도록 합니다.sessionId를 프롬프트/컨텍스트 ID와 일치하도록 합니다.tool 메시지에서 name을 수락하고 일치하는 어시스턴트 tool_calls 이름으로 폴백하여 파싱된 도구 결과가 와이어에서 생략될 때 적절한 도구 이름을 포함하도록 합니다.checkCredentials를 변경하여 OAuth 새로고침 실패 시 completionProbe 실행을 건너뜁니다. 따라서 오래된 bearer 토큰은 절대 프로브되지 않으며 새로고침 실패가 반환된 reason으로 유지됩니다.completion: { ok: null, reason: ... }를 반환합니다.AuthStorage.checkCredentials를 리팩토링하여 OAuth 만료 시 새로고침이 사전에 실행되고 새로고침된 자격증명이 사용량 프로브와 새로운 완료 프로브 간에 공유되며, 등록된 UsageProvider가 없는 행은 완료 프로브 실행 전에 단락되지 않습니다.usage_limit_reached, resource_exhausted, Codex 스타일 Try again in ~X min 텍스트와 같은 사용량 제한 메시지를 429 rate_limit_error 응답으로 분류합니다.markUsageLimitReached를 통해 형제 자격증명으로 전환하며, 속도 제한 자격증명을 무효화하는 대신 처리합니다.streamSimple을 수정하여 콘텐츠가 내보내지기 전에 사용량 제한 오류(메시지 전용 오류 이벤트 포함)에서 재시도하여 onAuthError가 자격증명을 자동으로 회전할 수 있습니다.GenerateContentRequest 및 유사한 메시지가 더 이상 속도 제한 오류로 잘못 보고되지 않습니다.checkCredentials를 수정하여 completionProbe 예외를 처리하고 실패를 CredentialHealthResult.completion.reason에 기록하면서도 사용량 프로브 결과를 반환합니다.deepseek-ai/deepseek-v3.2-maas와 같은 MaaS 항목을 포함하는 권위 있는 models.dev 카탈로그를 사용하고 폐기된 Gemini 1.5 폴백을 제거합니다. (#1456)@@ A..B @@(@@ BOF @@ 및 @@ EOF @@ 포함)와 같은 래핑된 hunk 헤더가 필요하도록 하며, 빈 @@ A..B @@ 블록은 고정된 범위를 삭제하고 레거시 인라인 페이로드 형식은 형식이 잘못된 것으로 처리됩니다.vault.enabled 설정(Tools → Obsidian Vault, 기본값 false)을 추가하여 vault:// 내부 URL을 제어합니다. 비활성화되면 VaultProtocolHandler.resolve / write, resolveVaultUrlToPath, hasObsidian()이 모두 거부합니다. 후자는 시스템 프롬프트의 Handlebars {{#if hasObsidian}} 블록에서 vault:// 항목을 숨깁니다. 테스트는 vi.spyOn(vaultProtocol, "isVaultEnabled").mockReturnValue(true)을 통해 옵트인할 수 있습니다.
경로 해석 유틸리티에서 vault:// URL 지원을 추가했습니다. 계획 모드 및 내부 선택기 파싱을 포함하여 read 및 편집 경로가 Obsidian 볼트 파일을 직접 대상으로 할 수 있습니다.
편집 가능한 Obsidian 볼트 파일을 위한 vault:// 내부 URL을 추가했습니다. 파일 시스템 기반 읽기/쓰기/나열 및 CLI 기반 볼트 인덱스 작업을 포함합니다.
omp auth-gateway check 출력에 엄격한 모드 표시기를 추가했습니다. 엄격한 모드 텍스트 헤더에 [strict]를 추가하고 --json 출력에 최상위 strict 필드를 추가합니다.
omp auth-gateway check --strict는 각 브로커 제공 자격증명을 공급자의 채팅 완료 엔드포인트에 대해 검증합니다(공급자당 가장 저렴한 번들된 채팅 모델, 시도당 15초 시간 제한 및 "모델을 찾을 수 없음 / 잘못된 모델" 오류 시 최대 4개의 카탈로그 폴스루). 사용량 엔드포인트는 200을 보고하지만 채팅 엔드포인트는 동일한 bearer에 401을 반환하는 경우의 실패를 나타냅니다(취소된 OAuth 범위, 잘못된 공급자 행 레이블 등). 출력은 텍스트 모드에서 [chat: ok|FAIL|skip] 열을 획득하고 --json 모드에서 각 자격증명에 대한 completion 필드를 획득합니다. 채팅 실패 카운트는 0이 아닌 종료 코드에 기여합니다.
↑/↓ 페이로드 기호를 ^ 반복 구문 및 | 리터럴 행으로 대체하여 더 명확한 편집 의미를 제공합니다.A: 또는 A-B: 형식에서 명시적 A-B:- 인라인 삭제 마커로 변경했습니다.A: 대신 명시적 범위 표기법 A-B:를 요구하도록 합니다.edit.hashlineAutoDropPureInsertDuplicates 설정을 제거했습니다.edit.hashlineAutoDropPureInsertDuplicates 설정을 제거했습니다.edit.hashlineAutoDropPureInsertDuplicates 설정을 제거했습니다.edit.hashlineAutoDropPureInsertDuplicates 설정을 제거했습니다.response.incomplete(OpenAI Responses / Codex stopReason: "length")에서 에이전트가 조용히 산출되는 것을 수정했습니다. 에이전트는 이제 출력 측 불완전성을 복구 사례로 취급합니다: 잘린/추론만 있는 어시스턴트 턴을 삭제하고 더 큰 모델로 컨텍스트 승격을 시도하며 압축 또는 인수인계로 폴백합니다. AutoCompactionStartEvent.reason 및 커스텀 도구 auto_compaction_start.trigger 판별식은 "incomplete" 값을 획득합니다. 인수인계 전략은 "incomplete"에 대해 준수됩니다("overflow"와 달리 입력이 손상되어 인수인계가 동일한 벽에 부딪힐 것임).eval 도구를 수정하여 큰 표시 이미지를 크기 조정하고 텍스트 출력에 치수 메모를 추가합니다.write 도구를 수정하여 파일 내용 작성 전에 형식이 잘못되었거나 느슨한 해시라인 섹션 헤더를 제거합니다.eval 도구 이미지 렌더링을 수정하여 표시 이미지를 반환 전에 크기 조정하고 텍스트 출력에 이미지 치수 메모를 추가합니다.write 도구 출력 살균을 수정하여 파일 내용 작성 전에 형식이 잘못되었거나 느슨한 해시라인 섹션 헤더를 제거합니다.omp auth-broker serve가 시작 시 logger.setTransports is not a function으로 충돌하는 것을 수정했습니다. 호출 사이트를 import { setTransports } from "@oh-my-pi/pi-utils/logger"로 전환하여 일부 Bun 버전이 런타임에 노출하지 못한 logger 네임스페이스 재내보내기를 우회합니다.omp auth-gateway가 공급자가 401이 아닌 사용량 제한 오류로 응답했을 때(Codex usage_limit_reached, Anthropic usage_limit_reached, Google resource_exhausted) 502 upstream_error를 반환하고 자격증명 회전을 거부하는 것을 수정했습니다. classifyGatewayError는 이제 pi-ai의 중앙 isUsageLimitError 휴리스틱을 재사용하고 해당 실패를 429 rate_limit_error로 보고합니다. streamSimple의 사전 내보내기 재시도 훅은 HTTP 401뿐만 아니라 사용량 제한 문구에서도 실행됩니다. 게이트웨이의 새로고침 콜백은 오류 유형을 분기하고 invalidateCredentialMatching(행을 의심/삭제하는 것)이 아니라 AuthStorage.markUsageLimitReached(provider, sessionId, { retryAfterMs })를 호출합니다. 이는 소진된 자격증명만 임시로 차단하고 다음 형제를 나타냅니다. 동일한 분기가 코딩 에이전트 streamFn 콜백에 연결되어 구독 다중 계정 회전이 두 화면에서 동일하게 작동합니다.extractRetryHint가 Codex의 Try again in ~N min. / … hour / … hours 표현을 인식하지 못하는 것을 수정했습니다. 이는 업스트림 계정이 사용량 한도에 도달했을 때 게이트웨이 및 TUI가 서버 제안 재시도 윈도우 없이 남겨졌습니다. 공유된 try again in 패턴은 이제 ms / s / sec 외에도 min, minutes, mins, h, hr, hour, hours 단위를 수락하고 선행 ~ 및 포함된 공백을 허용합니다.sessionId: undefined를 AuthStorage.getApiKey에 스레딩하는 것을 수정했습니다. 이는 #sessionLastCredential을 비우고 게이트웨이 중개 요청에 대해 markUsageLimitReached를 무작동으로 만들었습니다. /v1/chat/completions 스타일 엔드포인트와 /v1/pi/stream 빠른 경로 모두 클라이언트의 prompt_cache_key에서(없을 때 기존 모델+시스템+도구+첫 메시지 해시) 안정적인 sessionId를 파생하고 자격증명 고착성 및 접두사 캐시 라우팅에 동일한 ID를 재사용합니다.eval 도구를 수정하여 큰 표시 이미지를 크기 조정하고 텍스트 출력에 치수 메모를 추가합니다.write 도구를 수정하여 파일 내용 작성 전에 형식이 잘못되었거나 느슨한 해시라인 섹션 헤더를 제거합니다.eval 도구 이미지 렌더링을 수정하여 표시 이미지를 반환 전에 크기 조정하고 텍스트 출력에 이미지 치수 메모를 추가합니다.write 도구 출력 살균을 수정하여 파일 내용 작성 전에 형식이 잘못되었거나 느슨한 해시라인 섹션 헤더를 제거합니다.omp auth-broker serve가 시작 시 logger.setTransports is not a function으로 충돌하는 것을 수정했습니다. 호출 사이트를 import { setTransports } from "@oh-my-pi/pi-utils/logger"로 전환하여 일부 Bun 버전이 런타임에 노출하지 못한 logger 네임스페이스 재내보내기를 우회합니다.vault:// 읽기 및 쓰기를 보호합니다.A A 단일 라인, A B 범위)가 필수입니다. 맨 A 행은 single-number hunk header "A" is no longer accepted 예외를 발생시킵니다. &A 본문 행 약칭은 &A..A로 변경되지 않습니다.A-B:에서 @@ A..B @@로 변경하고 @@ A @@ 단일 행 약칭을 사용합니다.^A-B에서 &A..B로 변경하고 &A 단일 행 약칭을 사용합니다.-에서 ..로 변경했습니다.applyEdits()및 관련 API에서 ApplyOptions 매개변수를 제거했습니다. 자동 흡수 동작은 더 이상 구성할 수 없습니다.ApplyResult에서 제거했습니다. 경고는 이제 파서, 패치기 또는 복구에서만 옵니다.A-B:, A-B:-, ^A-B를 제거하고 @@ A..B @@ hunk를 사용하여 편집을 대체하며 + 및 & 본문 행을 사용합니다.A: 약칭 구문을 제거했습니다. 단일 행 앵커의 경우 명시적 A-A:를 사용하세요.↑ 및 ↓ 페이로드 기호를 제거했습니다. 리터럴 행의 경우 |TEXT를 사용하고 원본 라인 반복의 경우 ^A-B를 사용하세요.A-B:- 구문을 사용하세요.after_anchor 커서 종류를 제거했습니다. 모든 삽입은 이제 before_anchor 배치를 사용합니다.|TEXT는 리터럴 텍스트를 내보내고 ^A-B는 원본 파일 라인을 인라인으로 반복합니다.A-B:-를 사용하세요.A-B:, BOF:, EOF: 블록을 변경하여 거부되지 않고 대신 한 개의 빈 줄을 작성하도록 했습니다.A-B:- 인라인 삭제 구문을 추가했습니다.^A-B 반복 페이로드 구문을 추가했습니다.-old 행을 자동으로 삭제하고 컨텍스트 행을 경고와 함께 +TEXT 리터럴로 변환하는 것으로 거부 대신 처리합니다.ABORT_MARKER 동작을 변경하여 경고를 나타내지 않고 파싱을 종료합니다.A..B 형식으로 변경하고 @@ A @@를 @@ A..A @@의 약칭으로 수락합니다.BOF/EOF 빈 hunk가 더 이상 빈 줄을 삽입하지 않도록 합니다.*** Abort에 대한 파싱 동작을 변경하여 추론된 절단 경고를 반환하지 않고 처리를 중지합니다.|, ↑, ↓)에서 두 개(|, ^)로 변경했습니다.A-B 형식을 요구합니다(단일 행 약칭 없음).