- Track terminal chunks including finish reasons, stop messages, and completion events during streaming
- Commit replay settlements and publish observed usage instead of reporting stream failure when the client disconnects after a terminal chunk
Closes: #6376
- Track `finish_reason` presence across initial and streaming response chunks
- Return a terminal bad gateway error instead of `[DONE]` when upstream stream closes prematurely without a finish reason
Closes: #6371
- Parse and map `url_citation` annotations to OpenAI message and delta annotations for both stream and non-stream responses
- Track emitted text rune offsets to calculate citation start and end indices accurately
- Deduplicate citations across streaming annotation events and message completion updates
Closes: #6361
- Buffer and assemble multi-line or split JSON chunks until a valid JSON payload is formed
- Intercept upstream backend error objects during streaming and surface them as terminal errors with appropriate status codes
Closes: #6357
- Track terminal connection errors on websocket session when upstream read loops fail or receive unexpected binary payloads
- Return recorded terminal errors immediately during session activation to prevent callers from blocking indefinitely after upstream disconnects
- Reset terminal error state when configuring new connections
Closes: #6354
- Add bounded in-memory store to retain Claude OAuth tool alias mappings keyed by message ID
- Restore alias mappings for thread continuation requests omitting tool declarations, returning a request-scoped not found error when state is missing
- Record tool aliases on execution and streaming response completion
Closes: #6346
- Treat Claude missing thread state 404 errors as client errors to bypass credential rotation and cooldown
- Inject `thread_not_found` error code into Claude error response details to signal client-side replay
- Support extracting upstream response bodies across error formatting and classification helpers
Closes: #6344
- Add `claudeMidConversationSystemMessagesAtEnd` to detect consecutive user messages ending the message array
- Append forwarded system blocks to top-level `system` payload instead of inserting mid-conversation message turns when trailing user turns are present
Closes: #6336
- Add `FlushResponse` to prefer error-aware flushing and unwrap wrapped response writers
- Bypass Gin's void `Flush` while maintaining header accounting via `WriteHeaderNow` to keep transport errors observable
Closes: #6332
- Add `lockAuthMutation` and `lockAuthMutationContext` with context cancellation support for mutation gates and reload barriers
- Introduce `persistLocked` to unlock manager state during storage I/O and prevent blocking runtime operations
- Implement `mergeAuthSaveDelta` to merge store save changes while preserving concurrent edits
Closes: #6329
- Add `CatalogSources` configuration to allow overriding general, Codex, and Devin catalog sources via URLs or absolute local file paths
- Centralize model catalog fetch, validation, and scheduled background updates in `catalogUpdater`
- Support dynamic catalog source updates and hot reloading during service runtime
- Update `--local-model` flag to use embedded models as defaults while respecting explicit overrides
Closes: #6319Closes: #5024
- Strip provider namespaces and prefix before evaluating model family
- Parse major and minor version numbers dynamically while ignoring snapshot dates
- Correctly identify unsupported assistant prefill models for Fable, Opus 5+, and Sonnet 4.6+
Closes: #5483
- Add `PayloadFinalizer` to apply configuration rules at the final serialization barrier
- Support decoding, modifying, and re-encoding Devin protobuf business fields
- Add multipart form-data payload normalization to JSON for media payload rules
Closes: #5067
Check plugin model declarations without executing discovery. Share one per-account refresh worker across registration and periodic triggers, retaining one latest queued snapshot with its publication epoch. Add ownership, coalescing, and stale-publication regression tests.
Isolate account entitlement caches and add retry backoff, auth-change cancellation, and publication fencing.
Decouple refresh scheduling from startup and config updates, bound native and plugin probe concurrency, and cancel background probes on shutdown.
Preserve cooldown state and projection generation watermarks during conditional model replacement, with regression coverage.
- Add `ClaudeMessagesJSONToSSE` adapter to convert native Claude message JSON payloads into synthetic SSE events
- Support non-stream Claude JSON responses in OpenAI chat completions and responses translators
- Preserve authoritative model from native responses in OpenAI responses format
Closes: #4815
- Map local shell tool declarations and tool choice to synthetic function calls
- Normalize shell call and output history items into chat completion tool messages
- Convert upstream tool calls back to `shell_call` output items in stream and non-stream responses
- Validate shell action arguments and handle invalid input errors
Closes: #4812
- Add integer field paths for memories, history, notes, web, and collaboration tool schemas
- Support nested property paths and union types in parameter schema normalization
Closes: #6255
- Emit `response.reasoning_summary_part.added` event on reasoning item initialization
- Include `item_id` and `summary_index` in reasoning summary text delta events
- Emit summary text done and part done events upon thought step completion
- Consolidate reasoning summaries into a single completed summary block
Closes#6309
- Allow early content streaming for OpenAI formats while preserving ordering behind queued tools
- Defer thought step termination and accumulate signature fragments for OpenAI Responses format
- Flush deferred reasoning step stops when closing open stream steps
Closes: #6306
- Add ASCII pre-filter to skip expensive gjson traversals for title helper and 1h TTL checks
- Check raw bytes for target keywords before initiating full JSON walks
- Fall back to full inspection when printable ASCII Unicode escapes are detected
Closes: #6291
- Retain `web_search_call.action.sources` alongside `reasoning.encrypted_content` in Codex request include field
- Avoid payload re-encoding when include array is already normalized
Closes: #6251
- Map Claude `pause_turn` stop reason to incomplete status with null incomplete details
- Switch stop reason evaluation to normalized lowercase matching
Closes: #6250
- Avoid retrying Claude token refresh on ambiguous transport or decoding errors to protect single-use tokens
- Block selection and unschedule refresh for credentials when both access token is rejected and refresh encounters `invalid_grant`
- Prevent in-flight request completions or cooldown clears from reviving terminal unauthorized credentials
- Allow manual force refresh to bypass terminal unauthorized checks
Closes: #6288
- Synthesize and populate live `auth_index` attributes into V8 `api-keys` responses
- Strip transient `auth_index` and `auth-index` fields from incoming update payloads and root nodes before persistence
- Ensure `auth_index` keys are omitted during V8 config transformations
Closes: #6287
- Pin local date to continuity context on the first request of a session
- Reuse pinned session date during cloaked date injection across execute and stream flows
- Prevent midnight calendar date flips from invalidating conversation prompt cache prefixes
Closes: #6282
- Retain `freeform` apply_patch tool type for native template models when `enable-apply-patch` is false
- Update client configuration documentation for `client.codex.enable-apply-patch`
Closes: #6286
- Add `MethodHostRoutingResetCooldown` RPC callback to plugin ABI and host dispatcher
- Introduce `HostRoutingResetCooldownRequest` and `HostRoutingResetCooldownResponse` in plugin API
- Reset credential quota and cooldown routing state in memory without persisting to token files
Closes: #6274
Accept historical v8 config paths and request bodies while saving the
latest canonical layout. Preserve comments on scalar updates and keep v0
saves from migrating legacy-only files unnecessarily.
Move shared Codex, Claude, and xAI provider options under upstream so
they apply consistently to OAuth and API-key credentials. Migrate
historical OAuth paths, preserve OAuth-only header scope, and expose the
new upstream management API path.