Repository navigation
[WRONG BRANCH] release: 2.85.0 - #7094
Conversation
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Inject a non-operating restart service through the common diagnostic fixture startup path. Cover refusal behavior and authenticated HTTP dependency forwarding, and include both helpers in the Windows mirror. Co-authored-by: Epinephrine <27862058+luvs01@users.noreply.github.com> Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
…#7023) Retain an absolute original home and arm the test-home guard after clearing the diagnostic child environment. Reuse the setup in Rust-driven module contracts and refuse relative protected-home inputs. Place the documentation beside fixture setup to avoid overlapping the pending process-isolation note. Co-authored-by: Epinephrine <27862058+luvs01@users.noreply.github.com> Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Co-authored-by: JUN <jun@lidgeai.com>
Adds Modelflare as an ordinary API-key preset (openai-chat, https://modelflare.dev/v1, ${MODELFLARE_API_KEY}) so `ocx provider add modelflare`, `ocx init` and the dashboard Add provider picker offer it. Seeds the four live-verified chat models (glm-5.3-flash default, claude-sonnet-5-5, gpt-6.1-sol, deepseek-v4-flash); deepseek-v4.1-flash is excluded because it answers 503. Docs recount presets to 104 / 85 key-based. Merged by the maintainer under the MAINTAINERS.md dev integration policy on the repository owner's explicit instruction, at head 82bcc8b with 0 failing and all Cross-platform CI jobs green on that exact head (run 38376510703). The Enforce PR target branch run was still queued in a repository-wide runner backlog; PR hygiene passed.
Based on #7027 by @luvs01. The opt-in health sentinel (#6671) now probes only numeric endpoints (loopback for default, localhost and every wildcard spelling the server accepts), pins that endpoint for its lifetime, and re-reads the runtime record before termination, so a DNS bind name or a changed record cannot turn unrelated timeouts into a kill of a healthy proxy. Co-authored-by: Epinephrine <27862058+luvs01@users.noreply.github.com> Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Some Azure Responses deployments reject Claude Code's tiny model-switch validation budget. Add opt-in provider setting minMaxOutputTokens for the azure / azure-openai adapter: explicit positive integer max_output_tokens below the floor are raised to it; unset providers, omitted or invalid budgets, and larger budgets are unchanged. Spend admission reserves the same effective cap at final route normalization and for each Combo target, and Combo restores the caller's ceiling for targets without a floor. Based on #7012 by @tsruu. Supersedes #6696 by @ismell0992-afk. Co-authored-by: tsruu <183051730+tsruu@users.noreply.github.com> Co-authored-by: ismell0992-afk <255305877+ismell0992-afk@users.noreply.github.com>
…7025) Parse code-mode tool declarations with one bounded forward scan instead of a backtracking regex, so a pathological exec description can no longer freeze the event loop. Quoted text and comments stay opaque while balancing delimiters, oversized descriptions and declarations carry no evidence, and an empty parameter type is still refused. Co-authored-by: luvs01 <luvs01@users.noreply.github.com> Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
) Recheck the model GitHub Copilot Auto negotiates (initially, on renewal, and on account or key rotation) against the key scope captured at admission, before route mutation or inference dispatch. A model outside the scope ends the request with a non-replayable model_not_allowed_for_key refusal that names the caller's selector: HTTP 403 before streaming or a terminal error in an already-started stream. Account recovery, sidecar credential rotation, and combo or policy fallback cannot continue past that refusal, and the combo boundary keeps its envelope. Co-authored-by: luvs01 <luvs01@users.noreply.github.com> Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
* fix(runtime): bound overflow parsing and batch replay scrubs Limit overflow normalization to a bounded prefix and collect rejected native reasoning blobs before scrubbing raw and parsed replay history once. Preserve existing route and credential provenance checks. Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * docs(claude): explain bounded overflow error messages * docs(claude): describe overflow prefix spacing in prose --------- Co-authored-by: Epinephrine <27862058+luvs01@users.noreply.github.com> Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Co-authored-by: JUN <jun@lidgeai.com>
* fix(codex): safely unlink generated profiles Refuse final-component profile symlinks before configuration or recovery journal changes. Unlink the checked regular entry under its canonical parent and preserve recovery evidence when its destination changes. Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * fix(codex): preserve recovery on refused profile removal Carry the verified rollback, dangling-link and ENOENT follow-up with focused journal regressions. Preserve the existing configuration lock and document its pathname race boundary. Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * fix(codex): bind removal recovery to its observed input --------- Co-authored-by: Epinephrine <27862058+luvs01@users.noreply.github.com> Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Co-authored-by: JUN <jun@lidgeai.com>
…7022) * fix(launcher): verify PATH ancestry and reject temporary app bundles Validate original and resolved POSIX PATH ownership, modes and symlink hops before executing a Bun candidate. Reject raw and canonical temporary app bundles while retaining permanent installations beneath ordinary TMPDIR overrides. Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * test(launcher): align stable bundle fixtures and PATH recovery docs --------- Co-authored-by: Epinephrine <27862058+luvs01@users.noreply.github.com> Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Co-authored-by: JUN <jun@lidgeai.com>
…sed (#7035) Refs #2999. When the native main refresh exchange succeeds but saving auth.json is refused because another writer changed it, serve the new access token to that request only. auth.json stays as the other writer left it, the rotated grant is not stored, and the old grant is not marked rejected. The comment claiming the inode check protects a Codex login is corrected (Codex rewrites in place, keeping dev/ino). Integrated by the repository owner's delegated agent under the dev maintainer-integration policy (MAINTAINERS.md); exact-head CI on 9c36701 was all green (25 pass, 9 skipped).
…7007) * fix(claude): preserve distinct Desktop aliases with effort fallback * fix(claude): handle Fast profile aliases and refresh localized guides * fix(claude): preserve genuine identities and filter unresolved discovery aliases * fix(claude): derive native identity from cold profile bindings * fix(claude): treat configured Anthropic defaultModel as a genuine native ID A cold native launch has no server registry, so nativeClaudeModelIds() is the only evidence that an alias-shaped ID is a real Anthropic model. The catalog seeds providers.anthropic.defaultModel for static providers, but the native identity list omitted it, so a saved genuine selection was replaced and its env slot deleted. Include the default under the same profile-collision rules; an active synthetic binding still wins. --------- Co-authored-by: Fei <283775571+richardfeiliu-a11y@users.noreply.github.com> Co-authored-by: bitkyc08-arch <bitkyc08@gmail.com>
…inary exists (#7048) Fixes #2999. Add nativeMainRefresh: "codex" | "opencodex". When a Codex binary at or above 0.130.0 is found (runtime resolver: CODEX_CLI_PATH, pinned runtime, shim backups, PATH, ChatGPT.app bundle), Codex owns the native main refresh: OpenCodex calls app-server getAuthStatus with includeToken/refreshToken, uses the returned authToken, writes nothing and does not reread auth.json. A chatgpt method with a null token maps to reauth. A missing or older binary, or an explicit "opencodex", keeps the guarded writer plus the in-flight token from #7035. ocx doctor reports the active mode. Integrated by the repository owner's delegated agent under the dev maintainer-integration policy (MAINTAINERS.md); exact-head CI on ffed9fe was all green (35 pass, 7 skipped).
…a competing proxy (#6971) (#7032) * fix(startup): let the Codex shim run under OpenCodex Desktop without a competing proxy (#6971) The shim runs ocx ensure on every Codex launch, and ensure spawned a detached CLI proxy whenever nothing answered. During a Desktop restart gap, or after Desktop quit with its durable claim, that proxy took the port and Desktop came back unsupervised, so the dashboard disabled shim install/repair under Desktop. ensure now waits for a running Desktop, relaunches a claimed macOS Desktop hidden (one launch per cold start via a lease), and otherwise fails with guidance; it never falls back to a CLI proxy while Desktop owns or runs the runtime. The dashboard then enables shim install/repair under Desktop while keeping the service guard, gives the shim installer the login-shell PATH (bounded, process-group cleanup, cached), and shows the activation step instead of Repair for an intact overlay the dashboard PATH cannot see. * fix(startup): fail closed on unknown Desktop evidence and harden launch dedupe (#6971) Review follow-up: - Unreadable service ownership or process list now refuses instead of reaching the CLI spawn. - Desktop detection matches executable identity (/proc/*/exe on Linux, ps comm paths inside an app bundle on macOS, per-user tasklist on Windows), so arguments naming opencodex-desktop no longer count and pgrep is not needed. - The launch lease is held by a live pid; a dead holder's lease is reclaimed by rename so only one contender wins, and a live peer's moved lease is restored. - The login-shell probe parses after stdout closes and kills the process group only on timeout or when a background job holds the pipe after exit. * fix(startup): user-scoped Linux Desktop detection and generation leases (#6971) Review round 2: - Linux detection reads only this user's processes (by /proc/<pid> owner), skips exited ones, and reports unknown when one of this user's processes cannot be read, so an unreadable Desktop is never treated as absent. - The launch lease is a numbered generation published whole with link(2); only one contender can create generation N+1, and no caller ever moves or restores another holder's lease. - Real-host smoke test: the process scan must answer on Linux and macOS. * fix(startup): stand down when a higher Desktop launch generation exists (#6971) A contender whose directory read predates a winner's cleanup could publish a lower generation the winner had just removed. After publishing, a caller that sees a higher generation releases its lease and waits instead of launching. * fix(startup): rule out non-dumpable Linux processes by comm and require a visible scan (#6971) A same-user non-dumpable process such as ssh-agent hides /proc/<pid>/exe, which made every plain Linux cold start refuse. Its comm stays readable, so only a process named like Desktop is unverifiable now. The scan must also see this process itself; a filtered procfs (hidepid) proves no absence. * fix(startup): keep the newest launch generation and refuse on hidden Linux procfs (#6971) Review round 4: - Releasing a lease no longer deletes the newest generation, so numbering can never restart below a stale contender; a lease lapses when its holder exits. - hidepid=2/4 on /proc can hide a same-uid Desktop; where Desktop is installed (~/.opencodex-desktop or /usr/bin/opencodex-desktop) a filtered scan is unknown and ensure refuses. Hosts without Desktop keep the CLI cold start. * fix(startup): keep handleEnsure's live branch in place for the Desktop cold start (#6971) Source-structure tests (grok-lifecycle, sync-client-integrations) read the live branch of handleEnsure before const pinPort. Restore the dev shape and run the Desktop cold start first: a proxy Desktop brings up flows into the unchanged live tail, and the restart guard only rejects a proxy that was already live. * test(startup): order-free procfs fixture; colon-only login PATH merge (#6971) Linux readdir order is filesystem-defined, and the login-shell PATH is POSIX only, so merging must not use the Windows path delimiter.
macOS Background Task Management resubmits the OpenCodex LaunchAgent through smd, so launchctl print reports path = (submitted by smd.<pid>) with managed_by = com.apple.xpc.ServiceManagement. Startup Safety and the tray realpath'd that value, failed, and marked a valid login item unverified. Credit that shape only for this copy's program and an unchanged registration re-read, in both implementations, with shared fixture cases.
* fix(qoder): recover runTurn keys on scoped 401/429 failures * fix(qoder): keep generic rate limits from rotating keys * fix(qoder): scope runTurn recovery to account limits * docs(qoder): align runTurn recovery contract
) * fix(openai-chat): preserve Mistral typed text and thinking blocks * Preserve typed content in both response paths. * Add regression tests and update adapter documentation. * fix(openai-chat): reset inline tags at typed reasoning boundaries * Flush pending text before typed reasoning in both response paths. * Add four regression cases and document the boundary. Review: #7047 (comment)
…ss (#7038) * test(config): preserve generation child startup diagnostics Drain bounded stdout and stderr from generation-race children, identify exits before readiness, and report per-child missing files and import phases. Reap owned children in a finally block when readiness or outcome collection fails. Keep the 10-second readiness and child deadlines and the exact-one-callback generation assertions unchanged. Add real-child regressions for early exit, bounded capture, and cleanup. This records evidence for a startup timeout; it does not claim that timeout is fixed. Reconstruct the test-only follow-up from #7017 on current dev. Source-commit: 3e76357 Co-authored-by: Epinephrine <27862058+luvs01@users.noreply.github.com> * test(windows): align tray probe readiness with production startup Perform production initialization and its initial launch tick before measuring maintenance, then wait for the actual child PID readiness signal instead of a fixed sleep. Retain the 250 ms maintenance bound, process reaping assertions, and delayed Online readiness coverage. Reconstruct the test-only follow-up from #7017 on current dev. Native Windows validation of this new candidate is still required; prior source-commit CI is not evidence for this candidate. Source-commit: 23b4333 Co-authored-by: Epinephrine <27862058+luvs01@users.noreply.github.com> Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> --------- Co-authored-by: Epinephrine <27862058+luvs01@users.noreply.github.com> Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Co-authored-by: bitkyc08-arch <bitkyc08@gmail.com>
…#7030) * fix(responses): preserve tool catalog boundaries across inbound wires Honor deferred Chat and Messages catalogs while enforcing explicit empty declarations. Preserve deterministic refusal codes and normalize declared default names across streaming and JSON responses. Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * docs(responses): describe native-lane guard activation accurately * docs(responses): keep wire-shapes doc within line budget --------- Co-authored-by: Epinephrine <27862058+luvs01@users.noreply.github.com> Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Co-authored-by: jun <jun@juns-Mac-Studio.local>
…push to dev/main (#7052) Co-authored-by: jun <jun@juns-Mac-Studio.local>
* fix(claude): reject non-regular Desktop configuration reads Read library metadata and profiles through checked regular-file descriptors and preserve open error identity. Retain filtered OAuth child failure diagnostics used during validation. Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * docs(structure): split Desktop config-read contract under the doc budget --------- Co-authored-by: Epinephrine <27862058+luvs01@users.noreply.github.com> Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Co-authored-by: bitkyc08-arch <bitkyc08@gmail.com>
Use the shared integration reader for default ZCode bootstrap discovery. Preserve relocation and explicit data-root overrides, cover real-file boundaries, and document the bootstrap and fixture contracts. Co-authored-by: Epinephrine <27862058+luvs01@users.noreply.github.com> Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Co-authored-by: bitkyc08-arch <bitkyc08@gmail.com>
…eed picker (#7050) * fix(codex): offer Ultrafast for GPT-6 Astra and GPT-6.1 Sol in the speed picker With the Ultra Fast switch on, the generated model catalog now adds the documented Ultrafast service tier to native gpt-6-astra and gpt-6.1-sol rows (bare and account-bound), so Codex Desktop and the CLI offer it next to Fast. Codex builds its speed menu from model_catalog_json, which replaces ChatGPT's plan-aware live list, and our catalog only carried the bundled priority tier. Disabling the switch withdraws the exact generated descriptor and leaves operator-written entries alone. Co-authored-by: 정우철 <oocheol@naver.com> * fix(codex): track generated native Ultrafast tiers with an explicit marker Withdrawing the tier no longer infers ownership from matching text, so an operator-written native Ultrafast entry identical to the generated one survives turning the switch off. Addresses Codex review on #7050. --------- Co-authored-by: 정우철 <oocheol@naver.com>
Co-authored-by: jun <jun@juns-Mac-Studio.local>
Co-authored-by: jun <jun@juns-Mac-Studio.local>
Co-authored-by: jun <jun@juns-Mac-Studio.local>
Co-authored-by: jun <jun@juns-Mac-Studio.local>
#6990) (#7070) * fix(history): rebuild large request-history indexes on a worker thread (#6990) Split from #6999. A full rebuild of a ledger of at least 1 MiB runs on a Bun Worker that writes a private build file; the serving thread swaps it in once complete. Async readers wait without blocking the event loop; the routing-time sync entry throws RequestHistoryIndexBusyError, which health scoring already reads as unknown evidence. Ingest moves to ingest.ts so the worker and the inline path share it. * test(layout): place the rebuild-worker test by seed instead of explicit entries * fix(history): serve a successful rebuild at the async wait limit; map history in structure Addresses Codex review on #7070: the build that reaches the async wait limit is now refreshed and served instead of reported busy, and structure/manifest.json maps src/routing/history/ to dashboard-and-usage.md. * fix(history): rebuild inline for async readers after a worker failure Addresses CodeRabbit review on #7070: during the worker-failure cooldown, async readers and manual rebuilds fall back to the inline rebuild instead of reporting busy; routing-time reads still never rebuild inline. --------- Co-authored-by: jun <jun@juns-Mac-Studio.local>
…o pool recovery (#7046) (#7076) * fix(codex): answer the main hard lock as a usage limit and clamp retry to pool recovery (#7046) * fix(codex): recovery hint honors gated rosters and every routing hold (#7046 review) * fix(codex): reuse the request-fenced model denials for the recovery hint (#7046) --------- Co-authored-by: jun <jun@juns-Mac-Studio.local>
Rebased onto dev as a single commit for #5955. Resolved the src/server/chat-completions.ts import conflict by keeping both the advisor capability import and the UNDECLARED_TOOL_CALL_ERROR_CODE import from dev. Co-authored-by: leaf <leaf@users.noreply.github.com>
Rebased onto dev as a single commit for #6079. Regenerated structure/INDEX.md with bun run structure:index. Co-authored-by: luvs01 <27862058+luvs01@users.noreply.github.com> Co-authored-by: lcxhh521 <59329914+lcxhh521@users.noreply.github.com> Co-authored-by: JUN <jun@lidgeai.com>
…ettings (#6934) * feat(claude): configure CLI tier defaults and explicitly apply user settings Rebased onto dev as a single commit for #6934. Resolved structure/runtime.md by keeping both paragraphs and dropped one blank line in structure/clients/claude-desktop.md to stay within its 600-line doc budget. Co-authored-by: JUN <jun@lidgeai.com> * fix(claude): mark tier-default preview routes as interactive-preview exemptions Dev's capability/route parity gate requires every management route to be covered by a CLI capability or explicitly exempt. The preview/apply pair is a GUI-only fingerprint workflow, which is exactly the interactive-preview exemption. --------- Co-authored-by: GSL-R <174104911+GSL-R@users.noreply.github.com> Co-authored-by: JUN <jun@lidgeai.com> Co-authored-by: jun <jun@juns-Mac-Studio.local>
* feat(clients): add Qoder client integration and config export Rebased onto dev as a single commit for #5950. Kept every client that dev added (Command Code, Kilo, Factory Droid) and placed Qoder beside them in each list, raising the client counts to nineteen. Dev's new CLI integration-plan decoder now lists qoder and accepts its modelConfigs.customModels.* managed path, matching the GUI decoder. * docs(structure): move Qoder ownership notes to clients/qoder.md clients/integrations.md was already at its 600-line budget on dev, so the Qoder section now lives in its own registered doc and is linked from the existing introduction. * fix(gui): complete Qoder strings for the Portuguese locale Dev added a pt catalog after this branch was cut, so it lacked the three Qoder keys. Qoder joins the product-name allowlists for zh-TW and French alongside Kilo and Factory Droid. * fix(clients): honor QODER_CONFIG_DIR and keep Qoder in standard sync paths Addresses the remaining review findings on #5950: - qoderHomeDir resolves QODER_CONFIG_DIR (absolute or ~-relative; relative values are refused) and both the config path and integration detection use it. - Owned-catalog refresh in ocx sync, /api/sync and catalog refresh now includes qoder. - ocx export --client qoder asks the live /api/client-config route, like Raycast and Factory Droid, so the serving process's bind and unauthenticated loopback listener decide the exported URL. The split-port case is covered by the shared listener-policy test. * fix(gui): clarify the Qoder loopback requirement in French --------- Co-authored-by: jun <jun@juns-Mac-Studio.local>
…ses hop) (#7080) * feat(protocols): decode Chat straight into the IR on Antigravity routes Behind protocols.rollout.antigravityDirect (default off), a Chat request whose settled route is one concrete Google Antigravity provider no longer goes through the internal Responses body. The ingress validates and decodes the conversation with chatConversationToIr and hands the Responses core only the request settings (chatSettingsToResponsesBody, built by the same applyChatSettings as the bridge body). The decoded conversation replaces the settings-only parse at the parse seam; the answer uses the direct Chat encoder. The trace reads chat -> ir -> other both ways. The lane is held to the bridge it replaces: the parsed request equals parseRequest(chatCompletionsToResponsesBody(body)) apart from _rawBody and timestamps, refusals match, and the Google wire body is identical. A route that leaves Antigravity after the ingress decided gets the bridge conversation restored before any other reader sees the raw body. Refs #7079 * docs(protocols): describe the Antigravity direct lane Refs #7079 * fix(protocols): keep the Antigravity direct lane equal to the bridge under rewrites Address independent review of the first head: - decline when the core would rewrite conversation text on the bridge body (a skills catalog, a generated-image link) or the cache diagnostic recorder is observing; - restore the bridge conversation right after every route assignment, before sanitization, ciphertext stripping and injected guidance can touch the raw body; - judge ambiguous-resend replay on the body the bridge would have sent; - predict the lane only for standalone routes, not combo children; - skip an own __proto__ parameter key as the schema parse does; - rename the eligibility test so its seed domain matches its registration. Refs #7079 * fix(protocols): decline the direct lane only while cache diagnostics record The cache diagnostic hook is registered whenever its module loads; recording is gated by OPENCODEX_CACHE_DEBUG. Checking registration alone declined every request and made the lane unreachable. The hook now reports its enabled state. Refs #7079
PackyCode is no longer a sponsor. Drop the README sponsor rows, sponsor logo and marketing screenshots, the registry sponsor field, the affiliate dashboard link, the provider overview sponsor card and its localized copy. The packycode provider preset itself stays as an ordinary key preset. Co-authored-by: jun <jun@juns-Mac-Studio.local>
… an unsupervised fallback (#7043) (#7078) * fix(update): dashboard update restarts through launchd/systemd before an unsupervised fallback (#7043) Ports the #7074 manager-first recovery to the dashboard update worker in src/update/job.ts. * fix(update): report every managed fallback exit as unsupervised after a failed manager restart * fix(update): release the update lease before every dashboard manager restart * fix(update): keep service manager stderr out of the dashboard job log --------- Co-authored-by: jun <jun@juns-Mac-Studio.local>
…on, 4.6/5.5 by account roster) (#7071) * feat(google): add Gemini 4 Argon (gemini-4-argon) * feat(antigravity): serve Gemini 4 Argon with the CLI User-Agent Adds gemini-4-argon to the google-antigravity picker with low/medium/high mapped to the verified gemini-4-argon-{low,medium,high} wire ids. CCA serves those ids only to the Antigravity CLI User-Agent, so Argon inference and model discovery use antigravity/cli/1.3.4 while every other model keeps the IDE User-Agent. * feat(antigravity): trim the static lineup to 3.8 Flash, 4 Argon, Opus 5.5 and Sonnet 5.5 The static google-antigravity picker now lists gemini-3.8-flash, gemini-4-argon, claude-opus-5-5 and claude-sonnet-5-5. Claude 5.5 gets the same low/medium/high suffix-tier mapping as Argon and 3.8 Flash. Dropped bases (3.7 Flash, 3.1 Pro, 3.1 Flash Image, Claude 4.6, gpt-oss) stay known to routing, discovery collapse and usage identity, so saved selections route unchanged and discovered rows still appear. * fix(antigravity): keep migrations and discovery tests consistent with the trimmed lineup Retired 3.5/3.6 Flash selections now migrate to the live gemini-3.8-flash base (registrySeedsTarget refused 3.7 once it left the lineup). Discovery-only family tests use a hypothetical claude-opus-6-1 because Claude 5.5 now has a static ladder. The static catalog count is 4. * feat(antigravity): filter and route models by each account roster Antigravity gates models per account (Claude 4.6 on some accounts, Claude 5.5 suffix families on others, Gemini 4 Argon on Ultra/Enterprise). Discovery now records each account roster; account selection prefers an account whose roster lists the requested model, skips a known non-listing account, and treats a missing roster as unknown. The catalog keeps exposing only the active account discovery, and the static-lineup drop is no longer warned as drift.
…7081) * feat(protocols): decode Messages straight into the IR on Antigravity routes The Messages ingress plans the Antigravity direct lane before translating: the settings-only body carries the resolved model, prompt-cache key and reasoning settings, the route is previewed on that model, and the conversation is decoded into the IR (messages-ir.ts) only for an eligible route. Routing then settles on the same body; if it moves, the full bridge translation replaces it. Refs #7079. * feat(protocols): turn the Antigravity direct lane on by default protocols.rollout.antigravityDirect now defaults on for the Chat and Messages ingresses. An explicit false turns it off; a non-boolean value or a malformed protocols block fails closed. Requests the eligibility rule declines keep the bridge as before. * docs(protocols): describe the Messages direct lane and its default * fix(protocols): hand an abandoned Messages direct plan's budget back A plan the ingress abandons (an undecodable envelope the bridge retries, or a settled route that moved) released none of the reasoning copies its decode retained, so the bridge translation that followed could answer 413 where the bridge alone fits. The decode now records its retained charges and the plan releases them when it is left. * fix(protocols): release the settings-only body's charge when leaving the plan leaveDirectPlan charged the full translation without handing back the retained charge for the settings-only body it replaced, so a route that settled off the plan (a per-model wire override, say) could answer 413 where the bridge alone fits. It also dropped the stale replay map.
…(Windows file ids exceed 2^53) (#7087) Co-authored-by: jun <jun@juns-Mac-Studio.local>
…own (Windows EBUSY) (#7088) Co-authored-by: jun <jun@juns-Mac-Studio.local>
…pool block (Windows EBUSY) (#7091) Co-authored-by: jun <jun@juns-Mac-Studio.local>
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
|
✅ Deterministic PR hygiene checks passed. |
|
Important Review skippedToo many files! This PR contains 583 files, which is 283 over the limit of 300. To get a review, reduce the PR to 300 files or fewer by splitting it into smaller PRs or changing its base branch. Usage-priced reviews support at most 300 files. ⚙️ Run configuration
⛔ Files ignored due to path filters: 7
📒 Files selected for processing: 583
You can disable this status message by setting the
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. Comment |
⏳ DRAFT
What to do
Its title has been prefixed with |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: faa8572bce
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| options.directRequest = undefined; | ||
| if (body && typeof body === "object" && !Array.isArray(body)) Object.assign(body, direct.bridgeConversation()); |
There was a problem hiding this comment.
Release direct-decode charges before bridge fallback
When a large Anthropic Messages request initially takes the Antigravity direct lane and is later rerouted—for example by memory-model routing, a blocked-model redirect, or a combo—bridgeConversation() runs the full Messages translation against the same TranslatorBudget, while the direct decoder's retained reasoning charges and conversation remain live. Clearing options.directRequest does not release those charges, unlike the ingress-level leaveDirectPlan() path, so a request whose bridge representation fits under the 32 MiB limit can be rejected with translation_buffer_limit only because both representations are charged. Add a release hook to DirectRequestOption and invoke it when abandoning the direct lane before building the bridge conversation.
Useful? React with 👍 / 👎.
|
|
||
| function snapshotFingerprint(current: ReturnType<typeof readSettings>, models: ClaudeTierModels | undefined) { | ||
| const target = selectedEnv(models, current.env); | ||
| return createHash("sha256").update(JSON.stringify([current.exists, current.raw, target])).digest("hex"); |
| const serialized = JSON.stringify([nativeContext, owner.hostname, owner.port, owner.loopbackPort, projection], (_key, value) => | ||
| record(value) ? Object.fromEntries(Object.keys(value).sort().map(key => [key, value[key]])) : value); | ||
| if (Buffer.byteLength(serialized) > 1048576) throw new Error("Routing snapshot too large"); | ||
| return createHash("sha256").update(serialized).digest("hex"); |
There was a problem hiding this comment.
💡 Codex Review
opencodex/src/server/chat-completions.ts
Lines 341 to 342 in faa8572
When the default-on Antigravity direct lane receives a large Chat history, chatConversationToIr materializes uncharged copies such as parsed tool-argument objects and serialized reasoning signatures, while the later budget charge covers only the small settings-only internalBody. The bridge path instead charges the full translated body, so a near-limit reasoning_content or tool argument that would return translation_buffer_limit can bypass the 32 MiB translation cap and amplify memory across concurrent requests. Pass the request budget into the direct decoder and charge its retained allocations, with release semantics if the lane is abandoned.
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
Summary
Promote the frozen
devcandidateba865da7252e4476d77aa2f3cf373df15c0f7da9tomainas stable 2.85.0. The promotion headfaa8572bcemerges inmainancestry with theoursstrategy and has exactly the candidate tree (1609f11c01). The version is already 2.85.0 in package.json, desktop tauri.conf.json and Cargo.toml at the candidate. The dev pre-move is #7093 (dev → 2.86.0), merged before this promotion.Highlights since 2.84.0:
gemini-4-argon-low/medium/high) and a per-account Antigravity lineup (Claude 4.6 / 5.5 by account discovery).protocols.rollout.antigravityDirecton by default.Verification
lane=all(manual dispatch) on the candidateba865da725: https://github.com/lidge-jun/opencodex/actions/runs/38510591342, success on attempt 2. Attempt 1 failed onlywindows 7/9(cli-v2-runtime.test.tslive V2 refusal case), which passed on the same test in the previous run and on a failed-jobs rerun.ba865da7: PASS. typecheck, lint:gui, structure:check, privacy:scan exit 0;bun run test45,909 pass with 5 host-specific failures that reproduce identically on the pre-train commit and pass on CI; GUI 3,327 pass + 1 flake passing in isolation; targeted tests for feat: Gemini 4 Argon + per-account Antigravity lineup (CLI UA for Argon, 4.6/5.5 by account roster) #7071/chore(sponsors): remove PackyCode sponsorship #7072/fix(update): dashboard update restarts through launchd/systemd before an unsupervised fallback (#7043) #7078/feat(protocols): Antigravity direct lane for Messages, on by default #7081/test(history): stale-ledger build case fails on Windows (ino + 1 loses precision) #7087/test(compaction): shared-probe cases leak the native-main claim into teardown on Windows (EBUSY) #7088/test(compaction): stub the in-handler pre-route prime so Windows teardown can remove CODEX_HOME #7091 1,014 pass, 0 fail.release.ymldry-run and live withexpected-shaset to that SHA.Main-review disposition. Promotion from
devtomainand npm releases are maintainer-controlled (MAINTAINERS.md). The project owner delegated this release train, including merge decisions, to the coordinator, so this promotion merges with owner authority (--admin). The PR targetsmaindeliberately, so anenforce-targetwrong_base failure is expected (as in #7016).Checklist