From b704ac698ace685609f9e6dbb2f69af0ed502b1f Mon Sep 17 00:00:00 2001 From: can1357 Date: Tue, 30 Jun 2026 06:44:42 +0200 Subject: [PATCH] chore: update changelogs --- packages/ai/CHANGELOG.md | 27 ++++++++----------- packages/catalog/CHANGELOG.md | 4 +-- packages/coding-agent/CHANGELOG.md | 12 ++++----- .../test/agent-session-retry-cap.test.ts | 4 +++ .../web/search/cli-provider-settings.test.ts | 19 +++++++++---- packages/natives/CHANGELOG.md | 2 +- packages/snapcompact/CHANGELOG.md | 6 ++--- packages/stats/CHANGELOG.md | 2 +- packages/tui/CHANGELOG.md | 2 +- 9 files changed, 42 insertions(+), 36 deletions(-) diff --git a/packages/ai/CHANGELOG.md b/packages/ai/CHANGELOG.md index b3e3e89e5..89eb89c73 100644 --- a/packages/ai/CHANGELOG.md +++ b/packages/ai/CHANGELOG.md @@ -4,28 +4,23 @@ ### Added -- Added service tier support for Google Gemini and Vertex AI -- Introduced `ServiceTierByFamily` to allow model-specific service tier configurations -- Added Google Vertex AI Interactions API support, sharing one Interactions transport across the direct Google and Vertex providers. Gemini 3+ models use the Interactions API by default — on the official `generativelanguage` endpoint for direct Google, and under ADC/bearer auth for Vertex — with automatic fallback to `:streamGenerateContent` when the model/endpoint can't serve Interactions. Pass `useInteractionsApi: false` to force generateContent. -- Added support for an explicit Vertex bearer access token via `GOOGLE_CLOUD_ACCESS_TOKEN` / `CLOUDSDK_AUTH_ACCESS_TOKEN`, so `gcloud auth print-access-token` can drive Vertex without a full `application-default login`. +- Added service tier support for Google Gemini and Vertex AI, including model-specific service tier configurations via ServiceTierByFamily. +- Added Google Vertex AI Interactions API support for Gemini 3+ models by default, with automatic fallback to :streamGenerateContent and a useInteractionsApi: false option to force standard generation. +- Added support for explicit Vertex bearer access tokens via GOOGLE_CLOUD_ACCESS_TOKEN or CLOUDSDK_AUTH_ACCESS_TOKEN environment variables. ### Changed -- Updated service tier logic to avoid global scopes in favor of per-provider configurations -- Refactored priority request billing to better align with specific provider capabilities -- Updated internal `coerceServiceTierByFamily` helper to facilitate migration from legacy settings -- Changed API-key resolution precedence so an explicit environment variable (e.g. `GEMINI_API_KEY`) overrides a stored/broker-migrated static API key; a deliberate OAuth login still takes precedence over the env var. +- Updated service tier logic to use per-provider configurations instead of global scopes. +- Refactored priority request billing and accounting to better align with specific provider capabilities. +- Updated API key resolution precedence so explicit environment variables (e.g., GEMINI_API_KEY) override stored or broker-migrated static API keys, while deliberate OAuth logins still take highest precedence. ### Fixed -- Improved Vertex AI reliability by automatically falling back to global endpoints on 404 errors - -- Fixed safety setting application for Google Vertex AI models -- Ensured Gemini service tier is correctly passed through to the API -- Corrected priority request accounting for supported providers -- Fixed Kimi Code's Anthropic-compatible request path to keep thinking enabled and downgrade forced tool choice for Kimi K2.7 Code title generation. ([#3852](https://github.com/can1357/oh-my-pi/issues/3852)) -- Healed leaked reasoning fences (` ```thinking ` / ``) live for every provider via a central stream wrapper, splitting them into structured thinking blocks during streaming. -- Fixed Codex requests failing with `Unsupported value: 'all_turns' is not supported with this model`: the `reasoning.context: "all_turns"` default is now gated to gpt-5.4+ Codex models. Older ids (`gpt-5.1-codex`, `gpt-5.3-codex`, `gpt-5.3-codex-spark`) omit `context` so the server applies its `current_turn` default; an explicit `all_turns` override is also suppressed on those models, while `current_turn`/`auto` always pass through. +- Improved Vertex AI reliability by automatically falling back to global endpoints on 404 errors. +- Fixed safety setting application for Google Vertex AI models. +- Fixed Kimi Code's Anthropic-compatible request path to keep thinking enabled and downgrade forced tool choice for Kimi K2.7 Code title generation. +- Fixed leaked reasoning fences (such as ```thinking or ) across all providers by splitting them into structured thinking blocks during streaming. +- Fixed Codex requests failing with unsupported all_turns errors on older models (gpt-5.1 and gpt-5.3) by gating the reasoning.context: "all_turns" default to gpt-5.4+ models. ## [16.2.6] - 2026-06-29 diff --git a/packages/catalog/CHANGELOG.md b/packages/catalog/CHANGELOG.md index 6014bf5c0..28a9608f0 100644 --- a/packages/catalog/CHANGELOG.md +++ b/packages/catalog/CHANGELOG.md @@ -4,8 +4,8 @@ ### Fixed -- Fixed Kimi K2.7 Code compatibility to avoid disabled thinking and forced tool choice on native Kimi endpoints that require thinking mode. ([#3852](https://github.com/can1357/oh-my-pi/issues/3852)) -- Fixed Cerebras `gemma-4-31b` dynamic discovery to mark the model as image-capable so attached images are serialized as OpenAI Chat Completions `image_url` data URIs. ([#3854](https://github.com/can1357/oh-my-pi/issues/3854)) +- Fixed compatibility with Kimi K2.7 Code on native endpoints to ensure thinking mode is preserved and tool choice is not forced. +- Fixed Cerebras gemma-4-31b dynamic discovery to correctly identify the model as image-capable, enabling proper serialization of attached images. ## [16.2.6] - 2026-06-29 diff --git a/packages/coding-agent/CHANGELOG.md b/packages/coding-agent/CHANGELOG.md index b1691cd15..55426fdb6 100644 --- a/packages/coding-agent/CHANGELOG.md +++ b/packages/coding-agent/CHANGELOG.md @@ -2,12 +2,11 @@ ## [Unreleased] -### Changed +### Breaking Changes -- Replaced the global `serviceTier` setting with `tier.openai`, `tier.anthropic`, and `tier.google` for granular control -- Updated `/fast` to target the service-tier family of the currently selected model -- Updated subagent and advisor tier configuration to use the new per-family setting structure -- Removed `fastModeScope` setting, as per-family scoping is now natively supported via the `tier.*` settings +- Replaced the global `serviceTier` and `fastModeScope` settings with granular, per-family settings (`tier.openai`, `tier.anthropic`, and `tier.google`) to control service tiers, subagents, advisors, and `/fast` mode targets. + +### Changed - Improved binary file detection and terminal handling to prevent corruption from non-UTF-8 content, and updated file summaries to explicitly note skipped binary files. - Enhanced context compaction (snapcompact) to resolve shapes contextually based on rendered text content. @@ -21,8 +20,7 @@ - Improved error reporting for `omp tiny-models download` by displaying the actual worker-side download error. - Resolved status inconsistencies between `/extensions`, `/mcp list`, and the dashboard, ensuring MCP server states, allowlists/denylists, and configuration files (like `mcp.json`) stay fully synchronized. - Improved branch-mode task merges to preserve the agent's original commit history (messages and authors) and fixed a bug where merges were rejected due to unrelated dirty changes in the parent checkout. -- Fixed the `Working…` loader staying gone for the rest of a parent turn when a long-running tool (e.g. a `task` subagent) finished inside a transient overlay window (auto-snapcompact, auto-context-full, auto-retry). Those overlays null the working loader on start and the overlay-end handler is the only restorer keyed off the missing loader; if the subagent's `tool_execution_end` lands while the overlay is still active (or its end handler errored before re-arming), the spinner stayed gone until the next turn even though the parent kept streaming. `tool_execution_end` now mirrors the `tool_execution_update` self-heal so the working loader survives a subagent completing inside the overlay window ([#3858](https://github.com/can1357/oh-my-pi/issues/3858)). -- Fixed the working loader disappearing after a subagent (`task`) tool completed while the focused session was still streaming: `tool_execution_end` did not re-arm the loader the way `tool_execution_update` did, so a tool result landing after a transient overlay (auto-compaction / auto-retry) left the UI looking idle ([#3857](https://github.com/can1357/oh-my-pi/issues/3857)). +- Fixed an issue where the `Working...` loader spinner would prematurely disappear or fail to re-arm after a subagent (`task`) tool completed or during transient overlays (such as auto-compaction or auto-retry). ## [16.2.6] - 2026-06-29 diff --git a/packages/coding-agent/test/agent-session-retry-cap.test.ts b/packages/coding-agent/test/agent-session-retry-cap.test.ts index 60c54526a..d9b8d1333 100644 --- a/packages/coding-agent/test/agent-session-retry-cap.test.ts +++ b/packages/coding-agent/test/agent-session-retry-cap.test.ts @@ -4,6 +4,7 @@ import { scheduler } from "node:timers/promises"; import { Agent } from "@oh-my-pi/pi-agent-core"; import type { ApiKeyResolveContext, AssistantMessage, ToolCall } from "@oh-my-pi/pi-ai"; import { createMockModel } from "@oh-my-pi/pi-ai/providers/mock"; +import * as aiStream from "@oh-my-pi/pi-ai/stream"; import { AssistantMessageEventStream } from "@oh-my-pi/pi-ai/utils/event-stream"; import { getBundledModel } from "@oh-my-pi/pi-catalog/models"; import { ModelRegistry } from "@oh-my-pi/pi-coding-agent/config/model-registry"; @@ -54,6 +55,9 @@ describe("AgentSession retry delay cap", () => { beforeEach(async () => { tempDir = TempDir.createSync("@pi-retry-cap-"); authStorage = await AuthStorage.create(path.join(tempDir.path(), "testauth.db")); + // A live env var now overrides a stored static api_key; these tests rotate stored Anthropic + // credentials, so neutralize env resolution (ignores every provider's ambient env key). + vi.spyOn(aiStream, "getEnvApiKey").mockReturnValue(undefined); authStorage.setRuntimeApiKey("anthropic", "anthropic-test-key"); modelRegistry = new ModelRegistry(authStorage, path.join(tempDir.path(), "models.yml")); }); diff --git a/packages/coding-agent/test/web/search/cli-provider-settings.test.ts b/packages/coding-agent/test/web/search/cli-provider-settings.test.ts index fb64f7c87..c7a3ae18c 100644 --- a/packages/coding-agent/test/web/search/cli-provider-settings.test.ts +++ b/packages/coding-agent/test/web/search/cli-provider-settings.test.ts @@ -1,7 +1,11 @@ import { afterEach, beforeEach, describe, expect, it, vi } from "bun:test"; import { stripVTControlCharacters } from "node:util"; import { resetSettingsForTest, Settings } from "@oh-my-pi/pi-coding-agent/config/settings"; -import { setExcludedSearchProviders, setPreferredSearchProvider } from "@oh-my-pi/pi-coding-agent/web/search/provider"; +import { + SEARCH_PROVIDER_ORDER, + setExcludedSearchProviders, + setPreferredSearchProvider, +} from "@oh-my-pi/pi-coding-agent/web/search/provider"; import { __resetDirsFromEnvForTests, setAgentDir, TempDir } from "@oh-my-pi/pi-utils"; import { runSearchCommand } from "../../../src/cli/web-search-cli"; @@ -128,17 +132,22 @@ describe("runSearchCommand provider settings", () => { }); it("treats explicit --provider auto as a one-shot override of the configured preferred provider", async () => { - // Same Tavily preference is configured by `beforeEach`, but no exclusions - // hide Jina here, so the auto chain order (Jina before Tavily) decides. + // Tavily is the configured preference, but `--provider auto` overrides it and walks the + // chain. Restrict eligibility to Jina + Tavily so an ambient broker/OAuth provider + // (gemini, anthropic, codex, perplexity…) can't win on a dev machine; the chain order + // (Jina before Tavily) still decides between the two. const currentTempDir = tempAgentDir; if (!currentTempDir) throw new Error("tempAgentDir missing"); + // Drive the exclusion through settings too — Settings.init re-applies + // `providers.webSearchExclude`, overwriting a bare setExcludedSearchProviders() call. + const onlyJinaTavily = SEARCH_PROVIDER_ORDER.filter(id => id !== "jina" && id !== "tavily"); resetSettingsForTest(); setPreferredSearchProvider("auto"); - setExcludedSearchProviders([]); + setExcludedSearchProviders(onlyJinaTavily); await Settings.init({ inMemory: true, cwd: currentTempDir.path(), - overrides: { "providers.webSearch": "tavily" }, + overrides: { "providers.webSearch": "tavily", "providers.webSearchExclude": onlyJinaTavily }, }); vi.spyOn(globalThis, "fetch").mockImplementation(makeFetchMock()); diff --git a/packages/natives/CHANGELOG.md b/packages/natives/CHANGELOG.md index e2b7abe82..c17560987 100644 --- a/packages/natives/CHANGELOG.md +++ b/packages/natives/CHANGELOG.md @@ -5,7 +5,7 @@ ### Added - Added embedded Silver TrueType font rendering support to `renderSnapcompactPng`, featuring automatic per-glyph fallback for missing bitmap characters and anti-aliased scaling for East Asian wide code points. -- Added `snapcompactSupportedChars` to check font capability for specific characters. +- Added the `snapcompactSupportedChars` function to check font capability for specific characters. ## [16.2.5] - 2026-06-28 diff --git a/packages/snapcompact/CHANGELOG.md b/packages/snapcompact/CHANGELOG.md index fa3a517e9..a7d33af7e 100644 --- a/packages/snapcompact/CHANGELOG.md +++ b/packages/snapcompact/CHANGELOG.md @@ -9,9 +9,9 @@ ### Changed -- Improved text normalization for non-ASCII text: semantic emojis fold to ASCII labels (e.g., `[OK]`, `[WARN]`, `[FAIL]`), decorative emojis are dropped, box-drawing/compatibility symbols fold to ASCII skeletons, and Unicode text is preserved when supported by the selected font or the embedded Silver fallback. -- Updated bitmap shapes to draw missing glyphs per-character using the embedded Silver TrueType fallback instead of rendering blanks or switching entire snippets, with support for East Asian wide characters across two grid cells. -- Updated text wrapping, pagination, and provider shape geometries to account for wide character footprints and updated X.org 8x13 font metrics (11px/22px pitches). +- Improved non-ASCII text normalization by folding semantic emojis to ASCII labels (e.g., `[OK]`, `[WARN]`), dropping decorative emojis, and folding box-drawing symbols to ASCII skeletons. +- Enhanced missing glyph rendering to use the embedded Silver TrueType fallback per-character, including support for East Asian wide characters across two grid cells. +- Updated text wrapping, pagination, and provider shape geometries to support wide character footprints and updated X.org 8x13 font metrics. ## [16.1.23] - 2026-06-26 diff --git a/packages/stats/CHANGELOG.md b/packages/stats/CHANGELOG.md index fcfe5d6dc..e131c8cf5 100644 --- a/packages/stats/CHANGELOG.md +++ b/packages/stats/CHANGELOG.md @@ -4,7 +4,7 @@ ### Fixed -- Improved premium request calculation logic to account for specific model families +- Improved premium request calculation accuracy by correctly accounting for specific model families. ## [16.2.6] - 2026-06-29 diff --git a/packages/tui/CHANGELOG.md b/packages/tui/CHANGELOG.md index cf0d338cb..5b7affbe3 100644 --- a/packages/tui/CHANGELOG.md +++ b/packages/tui/CHANGELOG.md @@ -4,7 +4,7 @@ ### Fixed -- Fixed `StdinBuffer` swallowing a fast double-Esc that arrived as one `"\x1b\x1b"` chunk: `parseKey` returns `undefined` for the combined chunk, so the editor's double-escape gesture and any single-Esc handler the second press should have hit never fired. The buffer now splits a bare `"\x1b\x1b"` into two ESC events only when no follower arrives in the disambiguation window; when a follower arrives, the second ESC stays attached so legacy Alt chords like `"\x1bd"` and meta-CSI/SS3 chords like `"\x1b\x1b[A"` still emit as parseable sequences ([#3857](https://github.com/can1357/oh-my-pi/issues/3857)). +- Fixed an issue where a fast double-Escape keypress was swallowed and ignored, preventing double-escape gestures and subsequent Escape key handlers from firing. ## [16.2.3] - 2026-06-28