Skip to content

[WRONG BRANCH] release: promote dev to preview for v2.31.0-preview.20260822 - #2353

Merged
lidge-jun merged 114 commits into
previewfrom
dev
Aug 22, 2026
Merged

[WRONG BRANCH] release: promote dev to preview for v2.31.0-preview.20260822#2353
lidge-jun merged 114 commits into
previewfrom
dev

Conversation

@lidge-jun

@lidge-jun lidge-jun commented Aug 22, 2026

Copy link
Copy Markdown
Owner

Summary

Promote dev (ced9a85) into preview for the v2.31.0-preview.20260822 release train.

This is a maintainer promotion merge, not a feature PR. No code is authored here: the merge brings the 114 non-merge commits that accumulated on dev since v2.29.0 (224 files, +12000/-539).

Release readiness was certified in devlog/_plan/260822_dev_release_readiness/090_go_verdict.md (GO verdict) and re-verified locally at head ced9a85.

Verification

  • Full suite: 14264 pass / 10 skip / 0 fail (897 files, 579s)
  • Typecheck (tsc --noEmit): clean, TypeScript 7.0.2
  • privacy:scan: passed
  • Cross-platform CI: success on a012a46, the last code-bearing commit. The diff from a012a46 to ced9a85 excluding devlog is empty, so the CI-verified tree is byte-identical to this head.
  • Service lifecycle: success on 6e2a6b6, and no service-gate path changed between that commit and this head. The release bump commit touches package.json and retriggers the workflow on the release SHA, which is the run the release.yml gate actually reads.
  • Merge is conflict-free, verified with git merge-tree --write-tree.

Checklist

  • Tests pass locally
  • Typecheck passes
  • Privacy scan passes
  • Targets the correct branch for this change type (maintainer release promotion)

Summary by CodeRabbit

  • New Features

    • Added routed vision sidecars with validated provider/model selection for image-capable models.
    • Added ocx service restart and guarded ocx doctor coordinator recovery.
    • Improved Cursor model availability, stream reliability, OAuth handling, credential failover, and tool-call display.
    • Added xAI web-search compatibility and enhanced Priority Processing and long-context cost estimates.
  • Bug Fixes

    • Improved Cursor error classification, Google thought-signature preservation, tool-result replay, and unsupported execution handling.
    • Hardened SSH target validation.
  • Documentation

    • Updated service, provider, recovery, pricing, and localized CLI documentation.

olddonkey and others added 30 commits August 18, 2026 14:55
Phase B2 of the FastWire umbrella (#1886), closing the
request in #1875. Fast now works end to end for xAI, and only where xAI
documents it.

Capability follows the transport. The registry gains a key-auth service-tier
overlay applied only when a preset allows the key override and the captured
effective auth transport is key-based; xAI declares Fast there and stays
unclassified on OAuth, because Priority Processing is documented for the public
api.x.ai endpoints and not for the Grok CLI subscription gateway. The overlay
resolves inside the shared FastPolicyAuthority capture, so the catalog and the
runtime cannot disagree — and the runtime only rewrites the base URL to that
gateway when authMode is "oauth", exactly when the overlay withholds the
capability, so Fast can never be injected into the unverified endpoint.

The catalog stops telling every provider OpenAI's story. Fast tier copy is now
per-provider, and xAI's says what xAI actually charges: priority processing at
2x token price, not "1.5x speed". Providers that declare nothing keep their
current bytes.

Pricing is declared rather than hardcoded to one vendor. The OpenAI-only
provider gate becomes exact (provider, model) priority rules, so xAI gets its
documented flat 2x while routed resellers sharing the grok slug inherit
nothing. The long-context relationship is likewise a declaration: OpenAI
publishes that Fast and long context are exclusive regimes, while xAI publishes
neither a combined rate nor an exclusion — so a confirmed-priority request above
200k prices at the published long-context rate and is marked a known lower
bound, surfaced in the dashboard as "≥$" rather than an invented stacked
multiplier. Billing still follows the response echo, which matches xAI's rule
that the priority rate applies only when the response confirms it.

NOTE — beyond the Fast path: xAI's bundled cached-input price for grok-4.6 was
$0.30 against an official $0.50, so every xai cost estimate (not just Fast) was
low. A verified-override layer corrects it ahead of the bundled row, which the
existing expected-price overlays sit behind and could not reach. The Fast
multiplier applies on top of the base price, so shipping the premium without
this correction would have compounded the error.

Full suite at this commit: 13330 pass / 10 skip / 1 fail — the one failure is
the pre-existing dev-side key-login-live-update regression, confirmed to
reproduce on this branch's own base commit (bcc77c0) with none of these
changes applied.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The readiness checklist requires a screenshot for GUI changes. Three seeded
grok-4.6 rows exercise every branch of the new pricing path in one view:
standard, a response-confirmed priority request at exactly the documented 2x
premium, and a confirmed-priority request above the long-context threshold
rendering as "≥$" because xAI publishes no combined rate.

Captured against a local proxy with a seeded usage log; no live xAI request was
billed to produce it.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
# Conflicts:
#	docs-site/src/content/docs/reference/configuration/providers.md
#	gui/src/i18n/de.ts
#	gui/src/i18n/en.ts
#	gui/src/i18n/fr.ts
#	gui/src/i18n/ja.ts
#	gui/src/i18n/ko.ts
#	gui/src/i18n/ru.ts
#	gui/src/i18n/tr.ts
#	gui/src/i18n/zh-TW.ts
#	gui/src/i18n/zh.ts
#	gui/src/pages/Logs.tsx
#	gui/src/pages/logs-cost-format.ts
#	src/codex/catalog/provider-fetch.ts
#	src/providers/registry.ts
#	src/providers/service-tier.ts
#	tests/service-tier-capability.test.ts
33e1c3e split the OAuth subscription gateway from the API-key endpoint in the
provider table for en, ja, ko, ru, and zh-cn, but zh-tw, fr, and tr kept
https://api.x.ai/v1 as the base URL. OAuth routes through the Grok CLI gateway
at https://cli-chat-proxy.grok.com/v1; only the API-key override targets
api.x.ai, and only that transport injects Priority Processing.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017zpLCh4eEms6un3VjapRgL
Claude Code's Anthropic Messages path never received a reasoning-replay scope because it does not send the Codex parent-thread header. Derive one from the stable per-session prompt_cache_key (metadata.user_id) so Gemini/Antigravity thought signatures are remembered by call_id and survive history replay. Also read nested extra_content.google.thought_signature when parsing Google responses.
Adds regression coverage for the Anthropic Messages reasoning-replay scope and for reading nested extra_content.google.thought_signature from Google response parts.
`ROUTED_CUSTOM_TOOL_PASSTHROUGH` exempted `apply_patch` from routed
custom-tool lowering unconditionally, so it reached every routed destination
as a `type: "custom"` tool with `custom_tool_call` items. xAI's Responses
endpoint rejects that item type:

  422 Failed to deserialize the JSON body into the target type:
      input[5]: invalid "custom_tool_call" item: missing field `id`

The message is misleading — the id is present. Instrumenting the adapter
showed the item leaving as
`{"type":"custom_tool_call","id":"ctc_abc123","call_id":"c1",...}`; xAI
reports the first field its own parser cannot satisfy rather than the real
problem, which is that it does not accept the item type. Same class as its
"Could not decode the compaction blob" message for a reasoning field, so the
fix is not to generate or preserve ids.

Live A/B against the endpoint — identical body, identical id, only the tool
name differs:

  apply_patch      (exempt from lowering)  -> 422
  my_custom_thing  (lowered to a function) -> 200

Lowering is what makes it work; the exemption is what breaks it. It surfaces
on Codex's compact turn because a real session always contains apply_patch
calls, but a plain replay reproduces it too.

The exemption is not wrong everywhere — the canonical ChatGPT surface speaks
custom_tool_call natively and lowering there would regress it. The defect is
that one unconditional rule about "routed providers" encoded a claim about a
single destination's capability. Add `supportsResponsesCustomTools`,
following the existing `supportsOpenAiWebSearchToolFields` shape: declared on
the registry row and the provider config, filled only when unset, and
consumed as an explicit denial. Absent or true keeps today's behaviour
byte-identical; only xAI declares false.

The response path needed no special case: it is name-generic, so once
apply_patch joins the converted set the existing repair restores the
function_call and its streaming argument events to a custom_tool_call with
the original call id.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Every routed lowering step derives its plan from the tool declarations, and
the compaction body build deletes them. It ran first, so on a compaction turn
the plan was empty and replayed call items reached the wire in their private
shapes. Against xAI:

  422 Failed to deserialize the JSON body into the target type:
      input[5]: invalid "custom_tool_call" item: missing field `id`

The id is present; xAI reports the first field its own parser cannot satisfy
rather than the real problem, which is that it does not accept the item type.

Instrumented the adapter to pin the mechanism: with declarations present the
call item is converted; with them absent, or on a compaction turn, it goes out
raw. Reordering locally produced `function_call` / `function_call_output` with
`tools` still absent and the compact prompt still appended.

This is the second time this exact shape has been fixed here — a replayed
namespace key survived for the same reason. That fix taught one lowering step
to cope; this one fixes the pipeline, so the next private field added does not
need its own workaround. The invariant is now stated at the call site: the
compaction body build removes the tool surface and must be the last routed
transform.

Two effects beyond the call items, both improvements: `promoteClientLoadedTools`
could previously reintroduce top-level `tools` after compaction had removed
them, which running compaction last now prevents; and namespace-collision
validation runs before the declarations are deleted. Non-compaction output is
byte-identical, pinned by an exact comparison test.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
(cherry picked from commit 59d0cde7f75f0e645a12ec44a388609dfba50ce6)
The namespace-replay restore test verified the restored custom_tool_call events
but never checked that the stream still ends with data: [DONE], so a regression
that drops the terminal marker would have passed. The sibling lowering test
already asserts it; match that.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017zpLCh4eEms6un3VjapRgL
Forward auth is not an OpenAI-destination identity. A noncanonical
forward provider that denies native custom tools must still convert
apply_patch. Pin the adapter serialization and the handleResponses path.
Refresh B2 onto current dev without rewriting contributor history.
Keep the xAI Priority response-confirmation boundary and the grok-4.6
cached-input $0.50 correction. Resolve the leftover privacy:scan example
using the wording already on dev.

# Conflicts:
#	devlog/_plan/260820_bug_pr_backlog_consolidation/100_release_safety_audit.md
#2255's wire/tier matrix assumed API-key Grok chat does not forward
service_tier. B2 documents Priority Processing on that transport, so the
key-auth chat row must now match the Responses key-auth row.
OAuth remains unclassified.
scripts: add Windows Codex desktop full-restart helper
…ds (#2188 roadmap 170)

Any picker-visible, non-provably-text-only provider row can now be offered
as the vision describer through the new 'routed' backend. Adds the
VISION_BACKENDS descriptor table, namespaced routed option values, the
four-family + namespaced provably-blind probe, PUT coherence rules
(namespaced <-> routed), and claude-code override parity. Docs 170/180
revised with three audit rounds folded in.
…roadmap 180)

The routed backend describes images by POSTing the proxy's own
/v1/chat/completions with the namespaced describer model, so every provider
wire the router speaks is a valid describer. Recursion fence: the request
carries x-opencodex-vision-describe, detected at the chat surface (bridge
rebuilds headers) and honored at the Responses plan site — marked requests
strip instead of describing (depth cap 1). Native chat fast path now defers
image-bearing text-only-model requests to the Responses pipeline so vision
coverage is symmetric. Admission ladder: env token, service token file,
first apiKeys entry, sent as x-opencodex-api-key.
…ber verbatim

Splits VisionBackend from the legacy SidecarBackend pair (web-search keeps
its own union), infers routed for namespaced values in the GUI fallback so a
working describer is never rewritten on save, widens the claude-code
override select, updates the CLI usage line, and makes GET report a routed
backend's namespaced model instead of collapsing to the legacy default.
…2-shutdown

fix(cursor): OAuth poll fail-fast on terminal statuses + discovery H2 pool shutdown hook
devlog: round-3 Cursor live-probe evidence and lock (docs-only)
… back to wire names

#2305 (devlog 260822_senpi_cursor_transfer/230): some Cursor models emit a
TEXTUAL pseudo tool call ("[TOOL_CALL]mcp_opencodex-responses_grep[ARGS]{...}")
instead of a real frame. Text-mode clients (Pi) parse that text and cannot
dispatch the undeclared display name, so the turn dies after display.

Normalize the display alias to the advertised wire name at the textDelta
mapping boundary — marker-scoped (both [TOOL_CALL] and [ARGS] required),
guarded to the exact mcp_opencodex-responses_ prefix. Prose mentions and
other providers' names stay untouched; real frames were already normalized
structurally via mcpWireNameFromArgs. Split-marker streaming deltas are a
recorded non-goal until a live trace shows them (doc 230).

Closes #2305.
fix(cursor): normalize display aliases in textual pseudo tool-call markers (#2305)
…lass

Live probe evidence (devlog 260822_senpi_cursor_transfer/210, 260): a
plan-gated model (claude-opus-4-7-low-fast without -fast entitlement)
returns the SAME bare 0-token resource_exhausted shape on a ~20-token
prompt that a real payload overflow produces. #2320's overflow mapping
then makes Codex compact a tiny turn — the wrong remedy for an
entitlement rejection, and the retry can never succeed.

Add a size prior to classifyCursorError: when the caller can prove the
request was small relative to the model's context window (estimate <
50% of window), a bare RE keeps the 429-class mapping; large or unknown
sizes keep today's overflow mapping, so the prior only ever removes
false overflows it can prove. The adapter supplies the estimate from
the outgoing request text and the static context-window table at its
single error-mapping seam. Explicit quota cues and size phrases are
unaffected (they classify before the prior).

senpi's T01 (#1009/#1036) shares this false-overflow bug; this is a
beyond-parity refinement.
fix(cursor): size prior keeps provably-small bare resource_exhausted on the 429 class
devlog: 290 post-landing status (docs-only)
devlog: release-readiness unit + probe corrections and 300/310 roadmap (docs-only)
… tiers

Live GetUsableModels (260822, devlog 300) lists the Opus Fast wire ids ONLY
in effort-suffixed form ({base-without-fast}-{effort}-fast); the bare id
returns not_found — which is exactly what cursor/claude-opus-4-7-fast did
through the proxy, because the static catalog sent it bare ("tiers
unverified"). A live turn on claude-opus-4-8-high-fast succeeded, so the
families are callable on this plan.

- discovery.ts: claude-opus-4-7-fast gains its tier picker; add
  claude-opus-4-8-fast and claude-opus-5-fast.
- effort-map.ts: tier ladders per the dump — 4-7/4-8: low..max;
  opus-5-fast: low/medium/high (no xhigh/max non-thinking yet).
- No-effort requests still resolve to a suffix (max) via codexEffortRank,
  so a bare -fast id can never reach the wire; no registry default needed.
- Tests pin family presence, ladders, wire-id derivation, no-bare rule,
  and out-of-ladder clamping.
feat(cursor): expose Opus Fast families with live-verified effort tiers
devlog: 310 maxMode big-context A/B results (NOOP, docs-only)
devlog: WP4 regression-audit findings (docs-only)
devlog: release-readiness GO verdict (docs-only)
@lidge-jun
lidge-jun requested a review from Ingwannu as a code owner August 22, 2026 06:35
@github-actions

Copy link
Copy Markdown
Contributor

Deterministic PR hygiene checks passed.

@github-actions github-actions Bot changed the title release: promote dev to preview for v2.31.0-preview.20260822 [WRONG BRANCH] release: promote dev to preview for v2.31.0-preview.20260822 Aug 22, 2026
@github-actions

github-actions Bot commented Aug 22, 2026

Copy link
Copy Markdown
Contributor

⏳ DRAFT

  • wrong target branch (preview); retarget to dev. UI screenshot required.

What to do

  • Retarget this PR to dev — all contributions go to dev.
  • Add a screenshot of the UI change to the PR description.

Its title has been prefixed with [WRONG BRANCH].
Automatic draft conversion failed (token cannot change draft status). Please convert this pull request to a draft manually. The required enforce-target check will keep failing until every issue above is resolved.

@github-actions
github-actions Bot marked this pull request as draft August 22, 2026 06:36
@coderabbitai

coderabbitai Bot commented Aug 22, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: fde35650-e948-412c-a031-78bbaebe6bf5

📥 Commits

Reviewing files that changed from the base of the PR and between e9f8840 and ced9a85.

⛔ Files ignored due to path filters (2)
  • devlog/_plan/260818_fastwire_b2_xai/evidence/010_logs_priority_lower_bound.png is excluded by !**/*.png
  • devlog/_plan/260820_sidecar_selection_unification/assets/vision_routed_dropdown.png is excluded by !**/*.png
📒 Files selected for processing (174)
  • README.md
  • devlog/_plan/260818_fastwire_b2_xai/evidence/README.md
  • devlog/_plan/260820_sidecar_selection_unification/160_vision_external_research.md
  • devlog/_plan/260820_sidecar_selection_unification/170_vision_backend_union.md
  • devlog/_plan/260820_sidecar_selection_unification/180_vision_describe_executors.md
  • devlog/_plan/260820_sidecar_selection_unification/190_vision_surfaces_and_delivery.md
  • devlog/_plan/260821_260821-windows-picker-full-restart/000_plan.md
  • devlog/_plan/260821_260821-windows-picker-full-restart/010_phase1.md
  • devlog/_plan/260821_bug_merge_train/000_triage_matrix.md
  • devlog/_plan/260821_bug_merge_train/001_dependency_analysis.md
  • devlog/_plan/260821_bug_merge_train/002_audit_synthesis.md
  • devlog/_plan/260821_bug_merge_train/010_fix_dev_macos_ci.md
  • devlog/_plan/260821_bug_merge_train/020_merge_2295.md
  • devlog/_plan/260821_bug_merge_train/030_merge_2294.md
  • devlog/_plan/260821_bug_merge_train/040_merge_2296.md
  • devlog/_plan/260821_bug_merge_train/050_merge_2289.md
  • devlog/_plan/260821_bug_merge_train/060_merge_2270.md
  • devlog/_plan/260821_bug_merge_train/065_merge_2281.md
  • devlog/_plan/260821_bug_merge_train/070_final_gate.md
  • devlog/_plan/260822_dev_release_readiness/000_plan.md
  • devlog/_plan/260822_dev_release_readiness/001_delta_inventory.md
  • devlog/_plan/260822_dev_release_readiness/002_risk_matrix.md
  • devlog/_plan/260822_dev_release_readiness/009_roadmap_lock.md
  • devlog/_plan/260822_dev_release_readiness/010_wp4_findings.md
  • devlog/_plan/260822_dev_release_readiness/090_go_verdict.md
  • devlog/_plan/260822_senpi_cursor_transfer/000_plan.md
  • devlog/_plan/260822_senpi_cursor_transfer/001_opencodex_cursor_inventory.md
  • devlog/_plan/260822_senpi_cursor_transfer/002_senpi_cursor_inventory.md
  • devlog/_plan/260822_senpi_cursor_transfer/003_protocol_compare.md
  • devlog/_plan/260822_senpi_cursor_transfer/004_auth_catalog_compare.md
  • devlog/_plan/260822_senpi_cursor_transfer/005_exec_compare.md
  • devlog/_plan/260822_senpi_cursor_transfer/006_stream_overflow_compare.md
  • devlog/_plan/260822_senpi_cursor_transfer/007_cli_fallback.md
  • devlog/_plan/260822_senpi_cursor_transfer/090_transfer_verdict.md
  • devlog/_plan/260822_senpi_cursor_transfer/100_stabilization_round2_plan.md
  • devlog/_plan/260822_senpi_cursor_transfer/110_stream_health_watchdog.md
  • devlog/_plan/260822_senpi_cursor_transfer/120_small_hardening_pair.md
  • devlog/_plan/260822_senpi_cursor_transfer/190_round2_roadmap_lock.md
  • devlog/_plan/260822_senpi_cursor_transfer/200_round3_probe_plan.md
  • devlog/_plan/260822_senpi_cursor_transfer/210_maxmode.md
  • devlog/_plan/260822_senpi_cursor_transfer/220_rotation.md
  • devlog/_plan/260822_senpi_cursor_transfer/230_issue2305.md
  • devlog/_plan/260822_senpi_cursor_transfer/240_client_version.md
  • devlog/_plan/260822_senpi_cursor_transfer/250_billed_usage.md
  • devlog/_plan/260822_senpi_cursor_transfer/260_re_classification_refinement.md
  • devlog/_plan/260822_senpi_cursor_transfer/290_round3_lock.md
  • devlog/_plan/260822_senpi_cursor_transfer/300_opus_fast_catalog.md
  • devlog/_plan/260822_senpi_cursor_transfer/310_maxmode_bigctx.md
  • docs-site/src/content/docs/fr/guides/providers.md
  • docs-site/src/content/docs/fr/reference/cli/lifecycle.md
  • docs-site/src/content/docs/guides/codex-integration.md
  • docs-site/src/content/docs/guides/providers.md
  • docs-site/src/content/docs/ja/guides/providers.md
  • docs-site/src/content/docs/ja/reference/cli/lifecycle.md
  • docs-site/src/content/docs/ko/guides/providers.md
  • docs-site/src/content/docs/ko/reference/cli/lifecycle.md
  • docs-site/src/content/docs/reference/cli/lifecycle.md
  • docs-site/src/content/docs/reference/configuration/providers.md
  • docs-site/src/content/docs/ru/guides/providers.md
  • docs-site/src/content/docs/ru/reference/cli/lifecycle.md
  • docs-site/src/content/docs/tr/guides/providers.md
  • docs-site/src/content/docs/tr/reference/cli/lifecycle.md
  • docs-site/src/content/docs/zh-cn/guides/providers.md
  • docs-site/src/content/docs/zh-cn/reference/cli/lifecycle.md
  • docs-site/src/content/docs/zh-tw/guides/providers.md
  • docs-site/src/content/docs/zh-tw/reference/cli/lifecycle.md
  • gui/src/i18n/de.ts
  • gui/src/i18n/en.ts
  • gui/src/i18n/fr.ts
  • gui/src/i18n/ja.ts
  • gui/src/i18n/ko.ts
  • gui/src/i18n/ru.ts
  • gui/src/i18n/tr.ts
  • gui/src/i18n/zh-TW.ts
  • gui/src/i18n/zh.ts
  • gui/src/pages/claude-code-sidecar.ts
  • gui/src/pages/claude-manual-env.ts
  • gui/src/pages/dashboard-shared.ts
  • gui/src/pages/use-dashboard-data.ts
  • gui/tests/logs-cost-lower-bound.test.ts
  • scripts/release.ts
  • scripts/restart-codex-desktop-app.ps1
  • src/adapters/cursor.ts
  • src/adapters/cursor/cursor-errors.ts
  • src/adapters/cursor/discovery.ts
  • src/adapters/cursor/effort-map.ts
  • src/adapters/cursor/h2-pool.ts
  • src/adapters/cursor/live-models.ts
  • src/adapters/cursor/live-transport.ts
  • src/adapters/cursor/native-exec-common.ts
  • src/adapters/cursor/native-exec.ts
  • src/adapters/cursor/protobuf-events.ts
  • src/adapters/cursor/protobuf-request.ts
  • src/adapters/cursor/tool-definitions.ts
  • src/adapters/cursor/transport.ts
  • src/adapters/google.ts
  • src/adapters/openai-responses.ts
  • src/adapters/xai-web-search.ts
  • src/cli/agent.ts
  • src/cli/dispatch.ts
  • src/cli/doctor.ts
  • src/cli/help.ts
  • src/cli/registry.ts
  • src/codex/auth-context.ts
  • src/codex/catalog/effort.ts
  • src/codex/catalog/parsing.ts
  • src/codex/catalog/provider-fetch.ts
  • src/codex/coordinator-doctor.ts
  • src/codex/inject-coordination.ts
  • src/codex/transition-state.ts
  • src/lib/errors.ts
  • src/oauth/cursor.ts
  • src/providers/cursor-pool.ts
  • src/providers/derive.ts
  • src/providers/fastwire.ts
  • src/providers/openai-sidecar.ts
  • src/providers/registry.ts
  • src/providers/service-tier.ts
  • src/responses/custom-tool-compat.ts
  • src/responses/namespace-tool-compat.ts
  • src/router.ts
  • src/server/chat-completions.ts
  • src/server/chat-native.ts
  • src/server/management/agent-settings-routes.ts
  • src/server/management/config-routes.ts
  • src/server/management/vision-sidecar-options.ts
  • src/server/responses/compact.ts
  • src/server/responses/core.ts
  • src/service.ts
  • src/types/config.ts
  • src/types/provider.ts
  • src/usage/cost.ts
  • src/usage/expected-prices.ts
  • src/vision/backends.ts
  • src/vision/eligibility.ts
  • src/vision/index.ts
  • src/vision/routed-describe.ts
  • structure/02_config-and-codex-home.md
  • structure/04_transports-and-sidecars.md
  • structure/08_openai-provider-tiers.md
  • tests/claude-code-thought-signature-scope.test.ts
  • tests/cli-help.test.ts
  • tests/codex-auth-context.test.ts
  • tests/codex-coordinator-doctor.test.ts
  • tests/codex-inject-write-lock.test.ts
  • tests/cursor-blob.test.ts
  • tests/cursor-eof-terminal.test.ts
  • tests/cursor-errors.test.ts
  • tests/cursor-h2-pool-shutdown.test.ts
  • tests/cursor-native-exec.test.ts
  • tests/cursor-oauth.test.ts
  • tests/cursor-pool.test.ts
  • tests/cursor-protobuf-events.test.ts
  • tests/cursor-static-catalog.test.ts
  • tests/cursor-stream-health.test.ts
  • tests/cursor-tool-continuation.test.ts
  • tests/custom-tool-compat.test.ts
  • tests/fastwire-policy.test.ts
  • tests/google-signature-history-roundtrip.test.ts
  • tests/management-api-logs-metrics.test.ts
  • tests/namespace-tool-compat.test.ts
  • tests/openai-responses-passthrough.test.ts
  • tests/release-helper.test.ts
  • tests/responses-custom-tool-repair.test.ts
  • tests/responses-routed-web-search-fields.test.ts
  • tests/service-tier-capability.test.ts
  • tests/service.test.ts
  • tests/subagent-fallback-handle-responses.test.ts
  • tests/usage-cost.test.ts
  • tests/vision-backend-union.test.ts
  • tests/vision-eligibility.test.ts
  • tests/vision-routed.test.ts
  • tests/winsw.test.ts
  • tests/xai-web-search-compat.test.ts

📝 Walkthrough

Walkthrough

This pull request adds routed vision support, Cursor transport and authentication hardening, coordinator diagnosis and recovery, service lifecycle planning, provider capability handling, pricing updates, release validation, and related documentation and tests.

Changes

Application behavior

Layer / File(s) Summary
Routed vision execution and selection
src/vision/*, src/server/management/*, gui/src/pages/*, tests/vision-*
Adds the routed vision backend, namespaced model validation, image-capability filtering, loopback description requests, recursion fencing, and GUI provenance handling.
Cursor transport and continuation handling
src/adapters/cursor/*, src/oauth/cursor.ts, src/providers/cursor-pool.ts, tests/cursor-*
Adds pooled HTTP/2 discovery, stream-health watchdogs, clean END_STREAM handling, typed unknown-exec replies, size-aware error mapping, OAuth terminal failures, Opus Fast catalog entries, and continuation replay fixes.
Provider compatibility and pricing
src/adapters/openai-responses.ts, src/adapters/xai-web-search.ts, src/providers/*, src/responses/*, src/usage/*, tests/*
Adds xAI web-search normalization, capability-aware custom-tool lowering, provider-specific Fast metadata, Google thought-signature extraction, and verified priority and long-context pricing rules.
Coordinator and service lifecycle
src/codex/*, src/cli/*, src/service.ts, scripts/restart-codex-desktop-app.ps1, tests/*
Adds immutable coordinator diagnostics, guarded zero-byte recovery, fail-closed service installation probing, the restart alias, and a scoped Windows desktop restart script.

Documentation and release records

Layer / File(s) Summary
Documentation and verification records
README.md, docs-site/*, structure/*, devlog/_plan/*
Documents the new CLI behavior, coordinator recovery, xAI endpoints and pricing, routed vision design, Cursor transfer findings, merge-train results, and release-readiness evidence.

Estimated code review effort: 5 (Critical) | ~120 minutes

Possibly related PRs

Suggested labels: review-ready

Suggested reviewers: ingwannu

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 31.25% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 80 functions across 50 files. (124 skipped: 70 unsupported, 54 over the file limit.) Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly identifies the promotion from dev to preview and specifies the v2.31.0-preview.20260822 release train.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches 💡 1
🛠️ Fix failing CI checks 💡
  • Create stacked PR
  • Commit on current branch
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch dev

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@lidge-jun lidge-jun changed the title [WRONG BRANCH] release: promote dev to preview for v2.31.0-preview.20260822 release: promote dev to preview for v2.31.0-preview.20260822 Aug 22, 2026
@github-actions github-actions Bot changed the title release: promote dev to preview for v2.31.0-preview.20260822 [WRONG BRANCH] release: promote dev to preview for v2.31.0-preview.20260822 Aug 22, 2026
@lidge-jun
lidge-jun marked this pull request as ready for review August 22, 2026 06:51
@lidge-jun
lidge-jun merged commit c1d2915 into preview Aug 22, 2026
77 of 87 checks passed
@lidge-jun

Copy link
Copy Markdown
Owner Author

리뷰 · 우선순위 34 / 80

설명: 이 PR은 devced9a85c5 를 preview 로 올려 v2.31.0-preview.20260822 열차를 만들려는 메인테이너 승격이다. 지금 CURRENT dev HEAD도 같은 ced9a85c5 이다. 이 시간에 착지한 것은 문서뿐이다. #2348 WP4 감사(0 P0/P1, P2 두 개, 14264 통과), #2349 GO 판정. GO 문서는 코드 마지막을 #2346 Opus Fast 카탈로그로 두고 a012a46 이후 devlog 만 다르다고 적는다. 승격 자체는 MAINTAINERS.md 가 메인테이너 일이라고 한다. 기여자 PR 은 dev 만 받게 되어 있다. 타깃 브랜치 검사는 dev 만 통과시킨다. 게이트가 [WRONG BRANCH] 를 붙이고 드래프트로 둔 것은 기여자 규칙대로다. 이 PR을 dev 로 되돌리면 승격이 아니라 자기 자신으로의 머지가 된다. 그건 답이 아니다. 현재 HEAD package.json 은 아직 2.27.0 이다. 태그는 v2.29.0, 프리뷰 태그는 v2.30.0-preview.20260821 이 있다. 본문은 114 커밋을 preview 로 가져간다고 한다. 새 기능 코드는 이 PR이 쓰지 않는다. Cursor #2334 CursorCredentialRouter 는 여전히 src/providers/cursor-pool.ts 모듈+테스트만 있고 어댑터에 연결되지 않았다. #2332 H2 풀은 discovery 전용. #2347 maxMode 큰 컨텍스트 A/B 는 NOOP. 카탈로그 팁은 Ox Alpha x-preview-f-free + deepseek-v4-flash-vision-exp. #2188 사이드카+routed vision 은 이미 dev. GO 가 난 것과 배포를 지금 할지는 다른 결정이다. 이 페이지는 그 결정을 대신하지 못한다. 프로세스 충돌이라 34.

PR base preview / head dev - 기여자 게이트는 dev 만 받는다. 승격 PR 이라서 타깃이 preview 인 것은 맞다
MAINTAINERS.md 타깃 검사 - 기여자 PR 은 dev. 승격은 메인테이너 직접 통제. 이 이슈 트래커 PR 로 우회하지 말 것
package.json 2.27.0 vs 본문 v2.31.0-preview.20260822 - 버전 범프 커밋이 이 PR 안에 없다.
devlog/_plan/260822_dev_release_readiness/090_go_verdict.md - GO 는 dev 상태 인증이다. preview 배포 허가가 자동으로 나오지 않는다
게이트 [WRONG BRANCH] 드래프트 - dev 로 리타깃하지 말 것. 리타깃하면 승격이 사라진다

메인테이너의 판단이 필요한 지점

  • GO 직후 preview 를 지금 올릴지, P2 두 개와 #2334 미연결 라우터를 먼저 둘지
  • 이 GitHub PR 을 닫고 직접 승격으로 갈지, 게이트 예외를 승격 PR 에만 둘지
  • 버전을 2.31.0-preview 로 올리는 범프를 어디서 만들지

너의 추천
dev 로 리타깃하지 말 것. 이 PR은 닫는다. 승격은 MAINTAINERS.md 대로 메인테이너가 preview 에 한다. 패키지 버전 범프와 태그는 그 절차 안에 둔다. #2354 main 승격보다 preview 가 먼저다. 둘 다 기여자 게이트에 넣지 말 것. 라벨은 그대로 둔다. types.ts/config.ts 스플릿과 무관하다.

이 댓글은 grok-bot이 작성했습니다

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants