CHANGELOG_EN.md
Complete version history for Antigravity Tools. Return to project home at README_EN.md.
!has_tool_calls check prevented compressing historical assistant reasoning_content in agent environments (e.g. OpenClaw) where almost every assistant turn contains tool calls. Allows pruning long thoughts down to placeholder ... while fully preserving tool calls and their valid thoughtSignature tokens, eliminating token bloat and preventing upstream Google API 400 signature errors.openai/request.rs to generate a minimal placeholder thought block { "text": "...", "thought": true } for historical assistant thinking in older turns outside the recent window, fulfilling upstream thinking schema requirements while discarding thousands of redundant thinking tokens.prepare_session_input with semantic prefix matching (ignoring client ID format differences) and sliding suffix boundary identification. Added fallback protection: when client sends full history and matches fail, uses client's full sequence instead of appending client history onto server history, eliminating exponential history compounding (2x/4x).video_url / inlineData) in OpenAI-Compatible API (Issue #3381):
video_url: Extended OpenAIContentBlock to natively deserialize and process video_url blocks, resolving Invalid request: data did not match any variant of untagged enum OpenAIContent when clients send video inputs.proxy/video) supporting base64 data URLs (data:video/mp4;base64,...), remote video URLs (fileData), local files (file:// or filesystem paths automatically encoded to inlineData), and raw base64. Covers MP4, WebM, MOV, AVI, WMV, MKV format normalization, oversize advisory warnings, and token estimation.call:default_api:ToolName{...}) into plain text deltas instead of structured functionCall blocks, silently breaking Claude Desktop / Claude Code agent loops. Enforced a 7-point strict fail-closed guard sequence (registered tools required, no native tool use in current turn, strict prefix match, registered tool whitelist alignment, no surrounding prose, valid JSON args, no prior text deltas emitted) to securely recover leaked calls into standard tool_use blocks without prompt injection risks.streaming.rs) and non-streaming responses (response.rs), added diagnostic warning logs (tracing::warn) when text patterns are detected, and reinforced stability with 9 unit test scenarios.query.where: { type: "array", items: { type: "array" } }). The recursive JSON schema sanitization now injects a Gemini-compatible {"type": "string"} fallback for itemless array nodes, backed by unit regression tests.type: "error" structure with error: { "type": "overloaded_error", "message": ... } emitted via state.emit("error", ...), ensuring Claude clients reliably catch and handle stream aborts.VariantType::ClaudeThinking support for claude-opus-4-5 and claude-opus-4-6 base model definitions. This resolves an issue where selecting base model IDs yielded no thinking tiers in dropdown selectors. Also aligned Gemini3Pro variant ordering.resources/app/package.json directly from the installation directory, preventing executing --version from inadvertently launching the Chromium/Electron GUI window.APPIMAGE, APPDIR, ARGV0, LD_LIBRARY_PATH, GTK_PATH, etc.) are stripped, and /tmp/.mount_* paths are filtered from XDG_DATA_DIRS to avoid inheriting conflicting runtime libraries.tauri-plugin-window-state configuration to exclude StateFlags::VISIBLE. This prevents the window from popping up on autostart or tray background launches when configured with visible: false.update_account_json to an async function that dispatches synchronous disk I/O and global account locks to Tokio's blocking thread pool (spawn_blocking). This prevents disk serialization contention from blocking Tokio worker threads and causing runtime starvation under high concurrency.get_token scheduling path, file persistence after OAuth token refreshes and project_id resolution is now offloaded to background tasks after updating memory caches immediately, preventing disk write overhead from consuming the 5-second timeout window.message_start, fallback text ContentBlock, and message_stop events, eliminating peek loop timeouts.collect_stream_to_json always returns at least one valid text ContentBlock when parsing empty upstream streams, complying strictly with Anthropic client non-empty content constraints.x-goog-user-project headers on content requests to ensure proper upstream PA service authentication.trailing characters at line ...), the parser automatically recovers the valid full Account data and atomically rewrites a clean file back to disk, completely preventing accounts from silently disappearing from the UI and causing cascading 429 rate limit outages.ACCOUNT_FILE_LOCKS) to ensure strict serialized thread safety across concurrent quota refreshes, 429 rate-limit event writes, and last_used touch operations.resolveQuotaModels. When a pinned selector matches a real quota model name (such as gemini-3.7-flash-low, gemini-3.7-flash-high, etc.), it renders as an independent discrete chip (model:${id}) instead of being collapsed and deduplicated into a single legacy category:gemini-flash slot that was hardcoded to older models.to_lowercase() matching in Claude protocol and common handlers to capture all Google thought signature error variants (Invalid thought signature., thought_signature, thoughtsignature), reliably triggering automatic retry and signature stripping.gemini-3.x (Flash / Pro families) and gemini-3.7 in is_model_compatible, ensuring thought signatures persist correctly across laddered variant turns.error! logs when load_app_config() fails in lib.rs, converting silent exits into actionable error logs and clarifying that services were not started.tokio::spawn(async {}) handles from ProxyServiceInstance, leaving unified lifecycle management to AdminServerInstance.{{name}}, {{error}} interpolation parameters to avoid runtime UI render issues.gemini-3.7-flash, gemini-3.1-flash-lite, claude-opus-4-6, gpt-oss-120b-medium with @lobehub/icons official brand icons.useProxyModels to eliminate duplicate model entries caused by sub-tier suffixes.ClaudeThinking reasoning variants for Claude models and disabled unsupported max variants for Gemini 3 series.DETACHED_PROCESS with CREATE_NO_WINDOW (0x08000000) across Cloudflared, tar decompression, and manual executable calls to eliminate console windows popping up.std::process::Command and tokio::process::Command extensions.ContextManager compressed thinking content to "...", it preserved the original thoughtSignature, causing Google API to fail validation with 400 INVALID_ARGUMENT: Invalid thought signature._is_valid_version() semantic version format validation and switched Method 2 to curl -w '%{url_effective}' to avoid header parsing whitespace issues.thoughtSignature placeholders to prevent context from exceeding the 1M token ceiling.usageMetadata, middleware uses the local token estimation engine to calculate input_tokens, preventing blank token stats in monitor logs.const Keyword Normalization for Computer Use MCP (Issue #3327):
{"const": "value"} into standard {"type": "...", "enum": ["value"]} compatible with Gemini/Vertex Schema Proto.anyOf/oneOf unions and deeply nested objects containing const fields.response_format.json_schema Structured Outputs (PR #3324):
response_format: { type: "json_schema", json_schema: { ... } }.$ref/$defs definitions, converting schemas into Gemini generationConfig.responseSchema standards with responseMimeType: "application/json".https://cp.cloudflare.com/generate_204 via standard HTTPS CONNECT tunnels, eliminating false 407 Proxy Authentication Required errors.username and password from http(s)://user:pass@ip:port proxy URLs and injects HTTP Basic Auth.gemini-3.7-flash, gemini-3.7-flash-low, gemini-3.7-flash-medium, gemini-3.7-flash-high, and gemini-3.7-flash-tiered.input_audio (Base64 + format) and audio_url, converting seamlessly to Gemini inlineData/fileData.wav, mp3, m4a, ogg, flac, aiff from Data URLs, remote HTTP links, local files, and raw Base64.invalid_grant and disables accounts only after 2+ consecutive confirmed failures.validation_url / appeal_url from Google RPC responses and flags accounts in the UI with a quick-action verification button.