ImmutablePrefix caches system prompt + tool specs after first build()
so subsequent turns reuse identical byte sequences. AppendOnlyLog
converts messages once via syncMessages() and only appends deltas
on further turns — prior-turn bytes stay stable.
- New module: packages/agent/src/append-only-context.ts
StablePrefix, AppendOnlyLog, AppendOnlyContextManager
- AppendOnlyContextManager added to AgentLoopConfig
- Wired into streamAssistantResponse in agent-loop.ts
- Toggleable via provider.appendOnlyContext setting (auto/on/off)
- Default auto enables for deepseek provider
- 38 tests covering prefix, log, sync, compaction handling
- /session info surfaces current active state
WSLg exposes WAYLAND_DISPLAY, so readImageFromClipboard() took the
native arboard path on WSL2. arboard::Clipboard::get_image() returns
ContentNotAvailable on WSLg because the Wayland clipboard does not
carry image payloads from the Windows clipboard, and that surfaced as
silent 'No image in clipboard' on Ctrl+V.
Detect WSL via WSL_DISTRO_NAME / WSL_INTEROP and read the image with a
PowerShell one-liner that emits base64-encoded PNG bytes from
[System.Windows.Forms.Clipboard]::GetImage(). Fall back to the native
bridge when PowerShell returns nothing, exits non-zero, or is missing,
so non-WSLg Wayland setups continue working unchanged.
Fixes#1280
- Extended the abort scenario shell command from a 5-second sleep to 60 seconds.
- Raised the corresponding test timeout to 15,000 ms for the abort test case.
- Changed hashline format to canonical `§` section headers and `"`/`"`/`≔` operations across grammar, parser, and docs.
- Reworked range and op parsing so single anchors are valid, legacy `-`/`-=` ops error, and empty `≔` payloads now delete ranges.
- Removed legacy `HL_EDIT_SEP`, `$HSEP$`, and `hsep` plumbing, adopting raw payload lines.
- Updated execution, input, renderer, and streaming flows to use `HL_FILE_PREFIX` and `HL_OP_CHARS` helpers.
- Updated session-stats parsing to `§`/`≔`/`"`/`"` format, patch envelopes, and bumped parser versions.
- Removed the hashline-separator benchmark script and its PI_HL_SEP job orchestration.
- Added a shared `interruptHint()` utility in the modes shared module to generate the interrupt suffix with themed bracket glyphs.
- Replaced hardcoded working-message interrupt text in interactive and event controllers with calls to `interruptHint()`.
- Updated working-message rendering to recognize and strip the new themed hint when applying shimmer styling.
- Updated OpenAI completions compatibility logic to translate a disabled-reasoning `minimal` effort to `none` for Fireworks endpoints.
- Added a Fireworks-specific test confirming the disableReasoning payload uses `reasoning_effort: "none"`.
- Refactored the disable-reasoning tests to reuse a shared request-payload capture helper.
- Added constants for OAuth and metadata token endpoints in the Vertex AI repro test.
- Expanded the fetch mock in the issue #1270 test to return tokens for either token endpoint, accommodating different ADC environments.
- Updated OpenAI completions parameterization to honor `disableReasoning` on effort-based compatible models by sending the minimum supported effort.
- Expanded commit and title generation token budgets so reasoning models can return output after internal thinking while non-reasoning calls keep existing limits.
- Switched title generation to request a `set_title` tool call, added extraction from tool-call arguments, and updated tests for the new behavior.
- Updated interactive mode to render the loader spinner with the current working message accent when available.
- Added a fallback to theme accent and a reset color code when no working-message accent is provided.
- Loading message rendering now derived session-specific accent colors and applied them to shimmer output when a session name was available.
- Shimmer palettes were updated to accept raw ANSI color values as well as theme color names during compilation.
- A unit test was added to confirm shimmer text rendered with a supplied ANSI crest color.
- OpenAICodexOAuthFlow now passes a fixed redirectUri option to
OAuthCallbackFlow, preventing the silent fallback to a random port.
OpenAI's /oauth/authorize accepts any localhost redirect URI (loose
validation), so the browser callback could succeed even on a non-1455
port; but /oauth/token rejects it with 403 because the port is not
in the registered allowlist. The fix surfaces port conflicts as an
immediate actionable error instead.
- exchangeCodeForToken now reads the 403 response body (error /
error_description) and includes it in the thrown message, matching
the existing refreshOpenAICodexToken error handling.
- Added loginOpenAICodexDevice (openai-codex-device provider): device-
code flow via /api/accounts/deviceauth/usercode + polling, avoiding a
local callback server entirely. Credentials are stored under the
existing 'openai-codex' key so no model or tooling reconfiguration is
needed. Useful when port 1455 is unavailable or the browser flow is
blocked by network/proxy.
Fixes#1277
- Added SettingsList#setItems to replace items and clamp selection to a valid index after updates.
- Updated SettingsSelector to rebuild active memory items on backend changes and skip refresh when appropriate.
- Switched MCP wizard and command spinners to theme frames with themed initial frame and 80ms updates.
- Reworked welcome intro animation for a 3-second eased sweep with optional shine blending.
- Added memory backend refresh tests and aligned package changelogs with the updated behavior.
- Added optional `onBeforeYield` configuration and `setOnBeforeYield` in Agent, executed before follow-up checks.
- Added `YieldQueue` to `AgentSession`, with setup/teardown and streaming/idle flush via `setOnBeforeYield`.
- Replaced immediate async-result follow-up dispatch with queued batch entries, including stale-state suppression.
- Added MCP follow-up queueing in SDK, deduplicating updates by `serverName` and `uri`.
- Added changelog entries for `onBeforeYield`, async-result batching, MCP dedupe, and `display.shimmer` modes.
- Added yield queue unit tests for streaming emission, debounced idle batches, stale filtering, and error isolation.
- Added `display.shimmer` setting (`classic`, `kitt`, `disabled`) with default `classic` and UI metadata.
- Added shimmer mode resolution with defaulting plus classic/KITT intensity tier profiles and thresholds.
- Added `getFgAnsi` handling across shimmer compilation and progress-bar themes, with fallback ANSI output defaults.
- Reworked shimmer rendering to coalesce same-tier segments, cache palettes by symbol, and map disabled mode to mid-tier.
- Tuned loader timing to a 16ms render interval and 80ms spinner stepping for smoother ~60fps updates.
shouldInjectAntigravitySystemInstruction checked for the string
"gemini-3-pro-high" (hyphen) but the deployed model IDs are
"gemini-3.1-pro-high" and "gemini-3.1-pro-low" (dot-versioned).
String.includes() never matched, so the required identity header was
silently omitted and Cloud Code Assist returned HTTP 400 for every
request targeting these models.
Broadened the guard to match.includes("gemini-3"), consistent with
the existing isGemini3Model convention in google-shared.ts, covering
all current and future Gemini 3.x variants on the antigravity provider.
Fixes#1274
Appended the stealth iframe to documentElement when document.head is not available during new-document evaluation.
Added regression coverage for the null-head bootstrap path.
Fixes#1267
The native rule discovery provider only scanned the rules/ subdirectory under .omp/ and ~/.omp/agent/. The documented top-level RULES.md file (per https://omp.sh/docs/context-files) was silently ignored — neither ~/.omp/agent/RULES.md nor <repo>/.omp/RULES.md was ever read.
Load both as synthetic rules with alwaysApply forced to true (the whole point of RULES.md is to be reattached every turn). Project scope walks up from cwd to repoRoot using the same nearest-.omp/ search AGENTS.md uses.
Fixes#1266
The regex in isContextOverflow used a start-of-string anchor (^) to match
the Cerebras/Mistral pattern '400/413 status code (no body)'. When the
synthetic provider (api.synthetic.new) receives a context-overflow rejection
from the upstream HF inference backend it wraps it in a JSON envelope:
{"error": "Error from inference backend: 400 status code (no body)"}
finalizeErrorMessage then builds:
400 status code: {"error":"Error from inference backend: 400 status code (no body)"}
The '^' anchor fails to match because the outer HTTP status is followed by
': {JSON}', not '(no body)'. Changed to '\b' so the substring match finds
the phrase anywhere in the error string.
Also fixed formatCapturedHttpError to extract the error string from
{"error": "string"} bodies instead of falling back to the raw JSON.
Fixes#1251
- Added a shallow string-record sanitizer to normalize unknown model role values before applying updates.
- Updated setModelRole and overrideModelRoles to base persistence on global roles while retaining matching runtime overrides.
- Added model role override tests covering non-persistent temporary overrides, override clearing, and consistency after role updates over overrides.
- Added the active session model to compaction candidate selection before role-based candidates.
- Updated compaction routing so role-based models are only considered after the current chat model.
- Added a regression test proving an Anthropic session prefers its active model over `modelRoles.default` on OpenAI.
- Added configurable shimmer palettes by introducing ShimmerPalette and ShimmerSegment types.
- Added a new shimmerSegments helper to render a single sweep across multiple text segments with optional per-segment palettes.
- Updated working-message rendering to style the interrupt hint using a separate borderAccent palette.
- Added remote-write hooks to `AuthCredentialStore` and routed `AuthStorage` set/upsert/remove flows through them when present.
- Implemented `RemoteAuthCredentialStore` methods to upsert, replace, and delete credentials via broker endpoints and refresh local snapshots in-place.
- Added integration coverage for broker-backed API-key replacement and provider logout disabling all remote credentials.
- Added a new shimmerText helper that computes a moving accent shimmer band across characters.
- Updated the interactive mode loader and slash-command ASCII bar renderer to use shimmer styling, with interrupt hints kept dim.
- Added tests for shimmer-enabled progress rendering and verified the visible bar output remains correct.