- Added new `tui.tight` setting with default `false` and documented behavior.
- Added global tight-mode APIs and `setIgnoreTight` propagation across Box, Text, and Markdown.
- Handled `tui.tight` updates to refresh UI borders and trigger rerendering.
- Updated key message components to ignore tight mode selectively and preserve intended spacing.
Persisted the GitHub Copilot apiEndpoint when usage-driven OAuth refresh writes the refreshed credential row.
Added coverage for Business endpoint preservation through the credential-health refresh path.
Fixes#2876
- Adjusted image budget IDs to use a shared 24-bit seed and wrap safely so new budgets no longer collide.
- Added transmit-state reset and changed image output ordering so full paints can replay image data after terminal clears.
- Updated image and protocol tests to match the new wrapped-id behavior and cursor-save/restore-wrapped transmit sequences.
Stored GitHub Copilot plan-specific API endpoints discovered during OAuth login and propagated them through structured credentials, model discovery, usage/probe metadata, and request base URL resolution.
Added regression coverage for Business endpoint discovery, serialization, dynamic model discovery, and chat/responses routing.
Fixes#2876
- Added cursor save/restore escape handling around direct image emission.
- Replaced the previous up-and-down cursor movement sequence with restore logic to keep renderer output positioned correctly.
- Ensured direct image replay path no longer depends on moving back down after placement to align the cursor.
- Removed ANTIGRAVITY_NO_PREAMBLE_INSTRUCTION from the shared Gemini header constants.
- Updated Gemini CLI and web search request builders to prepend only ANTIGRAVITY_SYSTEM_INSTRUCTION before existing system parts.
- Adjusted the Gemini CLI alignment test to stop asserting the removed anti-preamble prompt lines.
- Enabled Antigravity request envelopes to include requestId/labels and per-attempt responseId state.
- Enabled budget transport to send `thinkingBudget` and capped `maxOutputTokens` 65_536 for Gemini calls.
- Added budget-aware model profiles for Gemini flash/pro variants and updated effort routing expectations.
- Refreshed variant collapse to separate Gemini and Antigravity tables and heal stale snapshots.
- Changed provider delta input comparisons in `buildResponsesDeltaInput` to use `Bun.deepEquals` instead of stringified JSON checks.
- Updated session message diffing to return early on length changes and compare normalized entries with deep equality.
- Replaced JSON-string assertions in the issue-966 repro test with `Bun.deepEquals` for stable equality checks.
- Added Gemini thinking-loop detection helpers for near-duplicate and verbatim output checks.
- Wrapped `stream`, `streamPiNative`, and `streamSimple` dispatches with the loop guard.
- Emitted retryable empty-content loop errors and stopped completion events on loop hits.
- Added `enableGeminiThinkingLoopGuard` options for OpenAI compatibility with Gemini defaults and overrides.
- Split over-limit sleep_consolidation source groups into multiple capped episodes.\n- Added regression coverage that every claimed working-memory id lands in an episode.\n\nFixes #2869
- Tracked completed primary turns in `AgentSession` and started an immune-turn window after each interrupting advisor steer.
- Routed follow-on `concern`/`blocker` notes to the aside channel while the immune window is active, while preserving prior auto-resume-suppressed handling.
- Added the `advisor.immuneTurns` setting and tests for immune-turn detection and delivery-channel decisions.
- Added Matplotlib figure PNG rendering and display tracking in Python runner to emit PNG output immediately when figures are displayed via display(fig).
- Extended session persistence to externalize oversized image payloads in both content and details.images, enabling tool result images to survive session reload.
- Enhanced session loader to resolve image data payloads and blob references across content and details.images during session reconstruction.
- Added image cache invalidation in TUI image component when image protocol, cell dimensions, or Kitty Unicode placeholder mode changes.
- Added comprehensive test coverage for Matplotlib display, image persistence across reload, and TUI image rendering with protocol and dimension changes.
- Added a configurable maxEpisodeChars cap for sleep_consolidation episodic rows.\n- Marked truncated sleep summaries in metadata before extraction, graph ingest, and embedding scheduling.\n- Covered oversized transcript consolidation with a regression test.\n\nFixes #2869
Added a shared raw-text cap for regex-only entity and pattern fact extraction so multi-megabyte transcripts skip noisy heuristic passes instead of flooding MEMORIA. Added regression coverage for the entity extractor and MEMORIA pattern fact path.\n\nFixes #2868
- Added `effortBudgets` to `ThinkingConfig` and configured Antigravity Gemini variants to use budget mode with per-effort token maps.
- Updated `mapOptionsForApi` to resolve thinking budget from request options, then model `effortBudgets`, then the provider default ladder.
- Adjusted Antigravity user-agent metadata and introduced wire profiles with IDs to support routed-model request mapping.
- Updated `executeSearch` to read `providers.antigravityEndpoint` once and catch uninitialized-settings errors, so web search fallback no longer aborts before any provider runs.
- Added missing `Vision` and `Git` entries to `TAB_GROUPS` so those new settings now render in their intended setting-section groups.
- Adjusted context and idle-compaction tests to wait for prompt-in-flight transitions and provide `getContextUsage` for deterministic snapshots during pending turns.
The deadline was only checked at loop entry and the top of the inner loop,
so a provider response returning tool calls after the deadline still
executed them, and a deadline crossed during onBeforeYield could dequeue
then drop queued steering/follow-up messages.
- Re-check the deadline after streamAssistantResponse before running tools;
pair leftover tool calls with aborted "Deadline exceeded" placeholders to
keep the tool_use/tool_result contract valid.
- Re-check after emitTurnEnd and after onBeforeYield before draining the
steering/aside/follow-up queues so queued messages are never dequeued and
dropped.
- Merge a deadline AbortController into the loop signal so in-flight provider
requests and tools are cancelled at the boundary.
Added C=1 to Kitty display commands so direct inline-image cursor restoration is the sole row accounting path. Updated focused image rendering and placement encoding coverage.\n\nFixes #2863
- Guarded `session_stop` continuations against aborted or superseded hook results before queueing hidden follow-up turns.
- Reported compaction recovery continuations from `#checkCompaction` and skipped stop hooks while internal recovery owns the next turn.
- Let terminal empty-stop retry caps fall through to `session_stop` and added regression coverage for aborts, empty-stop caps, and promotion recovery.
- Kept `resolveDialect("auto")` on the legacy GLM fallback when a tool-less model has no catalog-recognized dialect.
- Added `sdk-dialect` coverage for unclassified tool-less models alongside MiniMax preferred dialect routing.
- Updated the coding-agent changelog entry to mention MiniMax auto-mode routing.