Repository navigation
[WRONG BRANCH] release: promote frozen tip 2606f6f922 to main as 2.93.0 - #7805
Conversation
…opping dispatchers (#7527) * fix(coding-agent): launch native Windows CLIs and refuse empty-arg-dropping dispatchers On Windows, whichFromPath tried .cmd before .exe and resolveCodingAgentBinary returned the first candidate hit. The official Qoder CN layout puts the PowerShell dispatcher qodercn.cmd on PATH ahead of qoderclicn.exe, and the PowerShell hop drops empty argv entries, so --setting-sources "" swallowed --max-turns and every qoder-cn turn failed. - whichFromPath: a same-stem .exe beats the .cmd in the same PATH directory; PATH order still decides between directories. - resolveCodingAgentBinary: the first native hit among a profile's candidates wins over an earlier batch dispatcher; only native hits are cached. - turn preflight: a remaining .cmd/.bat that must carry an empty argument is read, and the turn is refused with cli_dispatcher_drops_empty_args before spawn when it forwards through powershell/pwsh or cannot be read. npm-style shims that forward %* directly keep working. Refs #7518 * fix(coding-agent): verify the whole batch dispatcher chain before trusting empty args Review follow-up for #7527: - a dispatcher larger than the 64 KiB inspection bound is refused as incomplete instead of approved on a truncated read; - a hop to another .cmd/.bat is followed only through a literal %~dp0 or absolute path, up to four files; a hop through a variable, a deeper chain, or an unreadable target is refused (CALL :label and native .exe targets stay allowed, so npm cmd-shims keep working); - the Windows native-receiver turns use only fixture PATH directories, so a Qoder CLI installed on the host cannot satisfy discovery. Refs #7518 * docs(structure): fold the Windows executable-discovery note into the Qoder paragraph to stay within the line budget
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
GHSA-mrhx-c7xc-m3w5 and GHSA-27r3-jxmh-p828 blocked the 2.92.0 publish. Leave the package version at 2.93.0 on dev. Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: lidge-jun <243035832+lidge-jun@users.noreply.github.com>
…deterministic (#7552) Make the codex-runtime, client-connect and loopback-listener tests deterministic: bounded child deadlines with process milestones, and a port-0 public listener in place of the free-port-then-bind race. No sleeps or timeout increases. Refs #7403 #7404 Co-authored-by: Shreyas652 <66720396+Shreyas652@users.noreply.github.com>
#7598) Keep the cold first-exec of a fresh Bun copy and the PowerShell start out of two timed cases: the PATH-fallback cases share one warmed Bun copy created in a budgeted beforeAll, and the CurrentUser Root certificate inspection is replayed once before its timed case. The 10s product deadline is unchanged; a new seam test drives a deadline breach to unknown on every platform. Refs #7578 #7569
…7657) * feat(usage): price and seed Kimi K3.1 Pro on Kimi Code and Moonshot Kimi Code's coding endpoint now lists k3.1-pro and k3.1-pro-highspeed (live GET /coding/v1/models, context_length 1048576). Seed both on the kimi, kimi-code and kimi-responses presets with a 1M window and the K3 low/high/max ladder (thinking-only, default max), and add expected-price rows from the official table (platform.kimi.ai/docs/pricing/chat, 2026-10-24): K3.1 Pro $2/$10, cache hit $0.20, 5m cache write $2; Highspeed $4/$20/$0.20/$4. The moonshot API preset gets price rows for kimi-k3.1-pro and kimi-k3.1-pro-highspeed. Re-verified K3, K2.7 Code (+highspeed) and K2.6 against the current table (unchanged) and moved their verifiedAt to 2026-10-24. kimi-k2.5 left the table (discontinued 2026-08-31), so its rows keep the 2026-07-20 snapshot with a source that says so. * docs(structure): name Kimi K3.1 Pro seeds and price rows in owning docs
…inputs change (#7658) * ci: run docker/keyring smoke and React Doctor on PRs only when their inputs change Every pull request the ci filter matched (about nine in ten) started docker-smoke and the ubuntu keyring-smoke leg, and every pull request started React Doctor, although React Doctor scans only gui/ and each smoke job proves a narrow contract. - ci.yml: new docker and keyring path filters in the changes job, validated with the other narrow outputs. On pull_request the two jobs also require their own filter; push (main/preview), workflow_dispatch and the nightly schedule still request both unconditionally. The aggregate ci gate mirrors the new conditions, so the ci check keeps reporting on every PR. - react-doctor.yml: pull_request trigger path-filtered to gui/** and the workflow itself; the main push trend scan is unchanged. - structure/ops/docs-and-release.md: workflow table updated. * ci: include the compatibility-version module closure in the docker filter
…ed status (#7545) Qoder: carry the replay-envelope guard, selector-status refusal and legacy catalog collision fixes onto current dev. - Assistant text passes through the vendor-scaffolding guard and the shared tool-envelope line/fence recognizer; a replayed envelope ends the turn with non-retryable vendor_scaffold_detected without publishing it. Held text is settled before tool and reasoning events, and the recognizer resets at thinking boundaries. - A contribution that raises UnrepresentableSelectorError reports unsafe / unresolvable-path for that client instead of failing the whole status collection. - An unowned legacy modelConfigs.customModels row (provider opencodex, exported model) is reported as a conflict before any write. Refs #7517 #7512 #7390 Co-authored-by: Ingwannu <186453546+Ingwannu@users.noreply.github.com> Co-authored-by: terrytan95 <10609214+terrytan95@users.noreply.github.com>
…slot identity metadata (#7551) Codex account list: keep each registered slotId and slotKind on account-list rows and add an optional upstreamAccountKey, a versioned HMAC of the ChatGPT account and user claims under the local administrator token. The native key requires one token that claims both the matching account and the user; missing or conflicting claims omit it. No raw identity or credential is serialized. Account listing and explicit refresh return stored pool accounts without creating a missing native CODEX_HOME (maintainer decision D2); non-directory, dangling and untraversable homes still fail closed. Co-authored-by: alexalok <5950085+alexalok@users.noreply.github.com> Co-authored-by: Plamyth <145187149+Plamyth@users.noreply.github.com>
Carry #7432 and fill all seven provider reference tables, preserving same-key versus replacement-key recovery boundaries. Co-authored-by: lidge-jun <243035832+lidge-jun@users.noreply.github.com> Co-authored-by: MannXo <17333793+MannXo@users.noreply.github.com>
* fix(command-code): rotate on insufficient-credit refusals Command Code reports exhausted credits as HTTP 400/BAD_REQUEST, which bypasses the generic OAuth 429 rotation path. Normalize only the exact refusal to 429 while preserving the original body and status in headers. * fix(command-code): require the literal credit refusal prefix CodeRabbit noted the regex also accepted near-miss messages. Require the exact upstream prefix and cover the near misses. * test(command-code): assert the retry response body and status Cover the normalized retry response's original 400 status and preserved JSON body, as requested in review. * fix(command-code): fail open on malformed UTF-8 refusals Review noted that non-fatal UTF-8 decoding could still classify a malformed 400 body as an insufficient-credit refusal. Decode fatally so the existing fail-open path preserves the original response. * fix(command-code): address review on credit-refusal handling - Re-throw the caller's abort reason from refusal inspection. - Register the new test in both layout maps and keep layout.json below the file-size ratchet. - Document the narrow 400-to-429 normalization in the adapter contract. - Cover the abort path with a focused test. * test(command-code): keep upstream 429 and 402 out of credit classification A genuine upstream 429 must keep its own Retry-After and reach rotation unlabelled, and a 402 stays a 402 even when its body repeats the credit wording. Pin both so the narrow 400 normalization cannot widen. Co-authored-by: Yushi Chen <chenyushi63@gmail.com> * test(command-code): drive the credit refusal through dispatch rotation With two stored Command Code accounts, the exact credit refusal on the first account now completes the same request on the sibling, while an ordinary BAD_REQUEST stays on the account and surfaces as a 400. The rotation case fails against the adapter without the normalization. Co-authored-by: Yushi Chen <chenyushi63@gmail.com> * fix(command-code): rewrite the credit refusal only on OAuth rows A canonical key-auth Command Code row gets a same-key 429 retry ladder from rateLimitRetryPolicyFor, so rewriting its permanent credit 400 into a 429 would replay a credential with no credits left before surfacing the error. Only OAuth rows have sibling accounts to rotate to, so key and forward rows now keep the original 400. Co-authored-by: Yushi Chen <chenyushi63@gmail.com> --------- Co-authored-by: Yushi Chen <chenyushi63@gmail.com>
* fix(codex): calibrate Business Premium display capacity Business Premium seats report the plan string self_serve_business_prolite, which missed the configured capacity map and counted at the baseline weight 1. OpenAI documents Premium as 5x Standard included usage, so calibrate it at 5 in the display-only pool capacity estimate. Refs #7440 Carries #7444 Co-authored-by: Ingwannu <ingwannu@users.noreply.github.com> * docs(codex): move capacity calibration rule to openai-tiers and correct unknown-plan wording --------- Co-authored-by: Ingwannu <ingwannu@users.noreply.github.com>
Apply fallback policy to the ranked profile selection before authentication or dispatch. Keep hard-lock pre-admission unchanged and cover refused and allowed selections with a synthetic caller-owned credential and strict fetch stub. Co-authored-by: JUN <jun@lidgeai.com>
* fix(service): bind ownership lease release to its acquisition * docs(runtime): distinguish takeover decline from stop or claim failure Align the runtime ownership contract with the desktop shell: declined consent attaches as a guest, while failed stop or claim does not continue as owner and a stopped runtime is reported as stopped and unclaimed. Co-authored-by: Epinephrine <luvs01@hanmail.net> --------- Co-authored-by: JUN <jun@lidgeai.com>
* feat(gui): add JEV session pin controls and preserve save intent * fix(gui): narrow the selected source for saved combo baselines * fix(gui): guard JEV session pin numeric input parsing
Co-authored-by: JUN <243035832+lidge-jun@users.noreply.github.com>
…7656) * fix(windows): resolve ACL identity natively with bounded async waits * test: release stalled spill runners after queue settlement --------- Co-authored-by: JUN <243035832+lidge-jun@users.noreply.github.com>
* fix(codex): keep user edits to config.toml across ocx sync Injection (run by ocx sync, start, and settings changes) removed every root model_context_window even though OpenCodex never writes that key, and it rewrote a marker-owned [agents] default_subagent_* value whenever the marker comment survived, including after the user edited the value. Root model_context_window is now left alone. The journal records the exact managed sub-agent default values each injection writes; a marked value that no longer matches that record is adopted as user-owned (its marker is dropped) on both sync and restore. Without a record the marker alone still decides. Refs #7425 * fix(codex): decode multiline managed-default edits; qualify context-window docs Review follow-up for #7553. Edit detection now decodes the whole assignment, so a marked value the user rewrote as a multiline string is adopted instead of refusing the sync. The docs note that Codex caps a root model_context_window at each model's maximum window. Refs #7425 * docs(structure): drop stale root context-window strip claim Review follow-up for #7553. Refs #7425 * test(codex): compare canonical sync sandbox paths Compare native realpaths and the exact expected config file while retaining separator-bounded containment and isolated child environments. Clarify that the parent-home fingerprint observes the test harness home. Register the carried test in the existing codex shard without growing layout.json. Supersedes #7553; carries its original three commits with authorship intact. Co-authored-by: chlwnsgurg <97290748+chlwnsgurg@users.noreply.github.com> * test: isolate Codex host state in config-sync validation Seed the existing runtime cache seam for the missing/null version equality case, and pin the Desktop process fixture's user-owned native catalog. An installed Codex must not select a real runtime or change model order while these fixtures exercise cache equality and remote authority. The unmodified dev sources reproduce both failures (59 pass, 2 fail). These nine fixture-only lines give 61 pass, 0 fail. A scratch mutation removing null normalization still fails the unchanged persisted-byte assertion, so the target regression remains effective. This is a minimal L5 write-scope exception needed for its required macOS gates; no production code, timeout or assertion was changed. * fix(codex): honor default ownership before journal snapshot restore The first injected hash must stay pinned to protect unrelated user edits. Before replaying that snapshot, compare native-default cleanup using the latest recorded values against marker-only cleanup. Conflicting ownership keeps restoration on the existing field-level path instead of deleting a user edit that happens to recreate earlier injected bytes. Reuse the same known-key parser on the already-read journal. Missing records retain legacy behavior; profile and hash policies are unchanged. Regression-first proof on unfixed sources: 9 pass, 4 fail. Model and effort edits are preserved by both native restore APIs after the fix; legitimate managed A-to-B-to-A cycles still restore the exact snapshot. The affected journal/default suite passes 89 tests. --------- Co-authored-by: chlwnsgurg <97290748+chlwnsgurg@users.noreply.github.com>
…atus names ocx sync --restart-codex (#7563) (#7564) * fix(link): keep a connected client's integrations across ocx stop and name ocx sync in status (#7563) * refactor(cli): move status routing hints into status.ts to keep cli/index.ts under the file-size threshold * fix(lifecycle): preserve connected client ownership on successful stop Keep server teardown behind persisted connection ownership and report connected stops as skipped. Align lifecycle contracts, CLI inventory and existing translations. Co-authored-by: JUN <jun@lidgeai.com> * test(lifecycle): align stop reporting guard with connected ownership * fix(lifecycle): verify connected shutdown preservation before stopping Require a PID-bound client identity or explicit shutdown preservation capability before manager mutation and recheck before POST or kill. Preserve fresh connection ownership in ordinary runtime exit cleanup, and correct stale-Link health guidance and remaining lifecycle prose. * fix(lifecycle): keep stop compatibility proofs off environment proxies * fix(lifecycle): keep connected stop POST on direct local transport * fix(lifecycle): keep proven stopped clients idempotent and updateable * fix(cli): declare connected-stop preservation discovery
…d tie (#7617) * fix(codex): keep a role's model when auto-assign finds an equal-priced tie - Break tier-and-price ties in favor of the model the role already uses, before the picker order that lists native models first - Note the tie rule in structure/subagents.md * docs(codex): say the current model wins a tie only when it is in it - Qualify the tie-break wording in role-auto-assign.ts and structure/subagents.md, with picker order as the fallback
Display the actual zero-child count for root-only V2 settings and preserve mode-specific units when editing. Reject unsafe child and converted backend limits before PUT or configuration mutations, with focused regressions and contract documentation.
…7504) * fix(chat): isolate Anthropic reasoning state * Protect legacy signed reasoning and verify Chat ingress isolation * test(chat): preserve opaque-state isolation across message roles * test(chat): verify tool-result opaque state at upstream boundary
* fix(i18n): complete Turkish dashboard copy and documentation * test(i18n): guard Turkish connection copy and pacing semantics --------- Co-authored-by: JUN <jun@lidgeai.com>
…#7621) * fix(codex): renew credit evidence for namespace-bound Direct accounts * fix(test): supply required port in native pool fixture * test(codex): isolate ACL setup and cold quota child work * test(codex): complete fetch and routing fixture types --------- Co-authored-by: JUN <243035832+lidge-jun@users.noreply.github.com>
#7531) * fix(reasoning): separate support, thinking toggles and effort controls * fix(reasoning): address capability and wire review findings * fix(reasoning): preserve custom overrides and native thinking budgets * fix(catalog): preserve retained model reasoning provenance * fix(providers): preserve case-varied capability overrides * fix(providers): attribute reasoning exclusions correctly * fix(reasoning): preserve legacy wires and independent capability projections Address six maintainer findings and preserve legacy Chat behavior across native and translated requests. Cover native effort recovery, Responses extension boundaries, tool omission, case-folded overrides, and Claude discovery. * docs(structure): keep integrations.md within its 600-line budget after merging dev The merge with dev put structure/clients/integrations.md at 601 lines; join the reasoning-projection sentence onto the preceding export-metadata line. * fix(reasoning): preserve legacy empty-ladder discovery signal --------- Co-authored-by: JUN <243035832+lidge-jun@users.noreply.github.com>
* fix(codex): preserve hardlink names in catalog heal paths * fix(codex): retain native catalog leaf aliases where safe * fix(codex): fence uncertain catalog entry identity * fix(codex): retain uncertainty after catalog hop exhaustion * fix(catalog): retain uncertainty after symlink lookup failures * fix(test): promote Bun 1.4.4 with independent runner role verification * docs: align Docker Bun comments with unified role defaults * test: use a draining TLS origin for early upload replies * test: confine draining origin to buffered HTTP/1 upload * fix(codex): resolve catalog link target parents with filesystem semantics A relative symlink target containing .. was normalized lexically, so a symlinked intermediate directory made the comparator follow the wrong parent. Walk each intermediate component within the existing read budget: resolve symlinked or missing directories with realpath, treat non-directories and failures as unknown, and keep the leaf for the next lstat hop. * fix(codex): match platform .. semantics in catalog link targets Measured OS behavior splits by platform: Windows normalizes .. lexically across junctions/reparse points and even past missing components, while POSIX resolves each directory and refuses a missing crossing. Keep lexical resolve on Windows; on POSIX walk each intermediate component inside the read budget, record intermediate symlinks in the revalidation snapshot, and treat missing or non-directory crossings as unknown. Regressions assert the independent readFileSync/realpathSync result before the comparator verdict, and the POSIX-only literal-backslash case is an explicit platform skip. * fix(codex): refuse non-directory crossings in POSIX link targets A symlinked intermediate that resolves to a regular file must fail the traversal with ENOTDIR on POSIX; dirname() after realpath would have accepted the wrong catalog. Stat the resolved intermediate inside the read budget, require a directory, and record the resolved identity in the link snapshot so revalidation also catches a target swap. * test(codex): reproduce catalog observation and reanchor regressions * fix(codex): revalidate catalog evidence and reanchor selected publications * fix(codex): retain recovery baseline when publication proof fails * fix(codex): bind heal baselines to published entry evidence * fix(codex): keep the validated heal publication selection * fix(codex): capture publication identity before comparisons --------- Co-authored-by: JUN <243035832+lidge-jun@users.noreply.github.com>
…ient cancellation (#7767) A live sideband join now keeps its turn admission until the upstream transport closes when the client cancels after the upstream dial has started; before the dial, cancellation still retires the turn at once.
…#7622) * fix(codex): renew credit evidence for namespace-bound Direct accounts * fix(codex): recover credit retry advice without weakening account boundaries * fix(test): supply required port in native pool fixture * test(codex): isolate ACL setup and cold quota child work * test(codex): complete fetch and routing fixture types * fix(codex): retain the latest applicable credit retry hold --------- Co-authored-by: JUN <243035832+lidge-jun@users.noreply.github.com>
* feat(providers): add AI Stupid Level API-key preset Adds AI Stupid Level's Smart Router as an ordinary API-key preset: openai-chat at https://aistupidlevel.info/v1, live discovery from the key-gated GET /v1/models (which also validates the key), and the 15 routing modes seeded with auto-coding as the default. Each routing mode declares a 262,144-token window, 64,000 output tokens and text-only input, limits that hold for any model the router picks. Every inbound stays on Chat: the router's /v1/messages is a passthrough to Anthropic without routing. Preset counts are recounted to 106 total and 85 key-based in all 8 guides, all 8 quickstarts and structure/ops/docs-and-release.md. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(providers): keep every AI Stupid Level model text-only, pinned ids included The preset declared text-only input for its 15 routing modes only. A pinned id from live discovery, such as claude-sonnet-4-6, had no modality evidence, so an attached image was forwarded to the router, which answers 400 unsupported_content. Add a provider-wide inputModalities declaration, the modality counterpart of contextWindow and supportsVerbosity. The registry seeds it, and enrichProviderFromRegistry and routedProviderConfig backfill it for rows saved earlier. isModelVisionSidecarConsumer, requiresVisionPreprocessing, modelAcceptsImageInput and the routing capability evidence fall back to it when no per-model entry lists the id; a per-model entry still wins. The AI Stupid Level preset declares ["text"]. Regression tests: a pinned live id needs vision preprocessing, also for a row saved before the declaration, and an image sent to aistupidlevel/claude-sonnet-4-6 through the proxy never reaches the router. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(providers): read provider-wide modalities only from the routed provider Review follow-up on the provider-wide inputModalities declaration: - Declare inputModalities on DerivedKeyLoginProvider, and copy it in providerConfigFromKeyLoginProvider, so a dashboard key login saves it like a CLI provider add does. - Drop the name-only registry fallback from the routing capability evidence. It applied the preset's ["text"] to a same-named custom destination; the routed provider already carries the declaration, backfilled for the preset destination only. Regression test: a same-named custom destination keeps its own modality evidence and needs no vision preprocessing. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * docs(providers): record the 2026-10-26 re-verification of the AI Stupid Level preset The contract (router docs, terms, key-gated GET /v1/models) was checked again on 2026-10-26: the 15 routing modes are unchanged. The pool of pinnable models has changed since 2026-10-23 (Kimi K2.7 Code is no longer listed), so the limits comment now calls 262,144 a conservative window rather than the current pool minimum. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(providers): keep provider-wide modalities registry-only Review follow-up: a row seeded from the AI Stupid Level preset kept inputModalities: ["text"] after its baseUrl was pointed elsewhere, so a custom image-capable endpoint would have had its images stripped. The declaration is now registry-only, like other destination-bound registry defaults: it is no longer seeded into saved config (CLI add or key login), and enrichProviderFromRegistry and routedProviderConfig fill it only while the provider points at the preset destination. This also drops the src/oauth/login-cli.ts change. The custom-destination test now covers a seeded row moved to another URL as well as a hand-written custom row. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(providers): apply provider-wide modalities at runtime only Review follow-up: enrichProviderFromRegistry copied the preset's inputModalities onto the provider object, and init and management writes persist that object, so a saved copy could still follow a row to another URL. Enrichment no longer copies it. registryInputModalitiesForDestination() returns the registry value only while the row points at the preset destination; vision eligibility applies it to its private copy, and routedProviderConfig applies it to the routed provider. Regression test: enrichment leaves the saved provider without the field, while the runtime classification still holds at the preset destination and not at another URL. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(providers): validate runtime modality overrides for AI Stupid Level Reject malformed provider-wide modalities at schema and management boundaries, repair tolerant loads to text, and preserve exact model declaration precedence. Cover destination-bound runtime backfill without persisting registry defaults; derive the active key-login test roster from the registry. Co-authored-by: Studio Platforms <ionutvisan@studioplatforms.eu> * fix(providers): retain text-only fallback for renamed presets --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: JUN <243035832+lidge-jun@users.noreply.github.com>
…7777) * fix(claude): drain parent ACL flights before intercept secret writes * fix(claude): bound ACL admission and guard picker cleanup steps * test(claude): yield a macrotask before barrier ordering assertions A single microtask yield depended on the current await count; draining queued microtasks with setImmediate keeps the assertions meaningful if later code adds awaits (CodeRabbit review on #7777). * fix(claude): admit nested Claude settings rewrites after the bind await Review r2 F3: startup migration and Desktop first-party removals rewrite the credential-bearing Claude settings file synchronously after an await. A CLAUDE_CONFIG_DIR nested in the opencodex home shares the config-root ACL flight, so gate the migration and every removal through withConfigDirHardeningSettled on the Claude settings home (removeDesktopFirstPartySettled maps a settle timeout to the existing unreadable refusal without writing). Regressions: nested-home migration and settled removal, red without the barrier, green with it. * fix(claude): admit model-default rewrites of a nested Claude home Review r3 F4: POST /api/claude-code/model-defaults rewrites Claude settings, its staged file and recovery backups synchronously after the body await; gate the whole operation through withConfigDirHardeningSettled(claudeConfigDir()) inside the existing failure mapping. N1: the gateway-apply cleanup refusal no longer claims a JSON parse failure. Also asserts that the startup migration actually rewrites the stale proxy URL (CodeRabbit). Regression: model-defaults POST with a held parent flight, red without the barrier. --------- Co-authored-by: JUN <243035832+lidge-jun@users.noreply.github.com>
* fix(codex): preserve hardlink names in catalog heal paths * fix(codex): retain native catalog leaf aliases where safe * fix(codex): fence uncertain catalog entry identity * fix(codex): retain uncertainty after catalog hop exhaustion * fix(catalog): retain uncertainty after symlink lookup failures * fix(test): promote Bun 1.4.4 with independent runner role verification * docs: align Docker Bun comments with unified role defaults * test: use a draining TLS origin for early upload replies * test: confine draining origin to buffered HTTP/1 upload * fix(codex): resolve catalog link target parents with filesystem semantics A relative symlink target containing .. was normalized lexically, so a symlinked intermediate directory made the comparator follow the wrong parent. Walk each intermediate component within the existing read budget: resolve symlinked or missing directories with realpath, treat non-directories and failures as unknown, and keep the leaf for the next lstat hop. * fix(codex): match platform .. semantics in catalog link targets Measured OS behavior splits by platform: Windows normalizes .. lexically across junctions/reparse points and even past missing components, while POSIX resolves each directory and refuses a missing crossing. Keep lexical resolve on Windows; on POSIX walk each intermediate component inside the read budget, record intermediate symlinks in the revalidation snapshot, and treat missing or non-directory crossings as unknown. Regressions assert the independent readFileSync/realpathSync result before the comparator verdict, and the POSIX-only literal-backslash case is an explicit platform skip. * fix(codex): refuse non-directory crossings in POSIX link targets A symlinked intermediate that resolves to a regular file must fail the traversal with ENOTDIR on POSIX; dirname() after realpath would have accepted the wrong catalog. Stat the resolved intermediate inside the read budget, require a directory, and record the resolved identity in the link snapshot so revalidation also catches a target swap. * fix(test): drain account fixture config ACL work before removal * fix(config): skip optional directory hardening for non-directories * test(codex): reproduce catalog observation and reanchor regressions * fix(codex): revalidate catalog evidence and reanchor selected publications * fix(codex): retain recovery baseline when publication proof fails --------- Co-authored-by: JUN <243035832+lidge-jun@users.noreply.github.com>
…roviders, catalog, pricing, docs) (#7779) * feat(providers): add GPT-6.1 Terra alongside existing models * docs(models): document GPT-6.1 Terra across locales * docs(models): drop repeated Terra cross-link paragraphs and source comments * feat(codex): add GPT-6.1 Terra alongside existing native models Pin the supplied upstream row verbatim and register its native 500k/872k context, low-through-ultra ladder, Fast-only tiers and multi-agent v2. Keep GPT-5.6 Terra, defaults, configured-native template and roster version. Apply Terra's client minimum only to per-model absence evidence so unrelated roster success TTLs stay unchanged. Verify native, account-qualified and OpenAI-forward rows, Claude context and labels, and ultra-to-max wire folding. Keep Cursor and other lanes untouched. Validation: 613 affected tests and 38 layout/ratchet tests pass on Bun 1.4.4; typecheck, structure:check and privacy:scan pass. * fix(codex): keep GPT-6.1 Terra entitlement handling on the GPT-6.1 Sol rule * test(providers): give the Terra provider regression a unique layout name * feat(usage): add GPT-6.1 Terra pricing and metadata * fix(usage): price confirmed GPT-6.1 Terra Fast at the documented 2x * test(service): expect OpenRouter GPT-6.1 Terra service-tier capability --------- Co-authored-by: JUN <243035832+lidge-jun@users.noreply.github.com>
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. |
|
Important Review skippedToo many files! This PR contains 691 files, which is 391 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.
|
|
⏳ DRAFT
What to do
Its title has been prefixed with |
|
Release captain: HOLD: this PR is not merged until the CodeQL alerts at .github/workflows/ci.yml:733-738 (test-changed job from #7782) get an independent security verdict. |
|
Release-captain disposition for CodeQL alerts 345, 346, 347 (actions/cache-poisoning/poisonable-step, .github/workflows/ci.yml:733/736/738, test-changed job from #7782): dismissed as false positive after an independent security review (PASS, zero blocking).
|
|
Release-captain promotion record (v2.93.0 step 6), merged on the owner's instruction. Head 6a87fea: tree = frozen candidate 2606f6f (ours merge of main). Candidate gates: lane=all 40434756491 + Service lifecycle 40434760151 green; same tree shipped as 2.93.0-preview.20261027 (release 40452751461) and passed the preview smoke. CodeQL alerts 345-347 dismissed as false positive after independent security review (see comment above). enforce-target fails only on promotion exceptions. PR CI 40455723510 was still running at merge; push-event Cross-platform CI + Service lifecycle on the merged SHA gate release.yml. Merge commit (not squash) keeps dev history reachable for the changelog builder. |
|
Release-captain record (v2.93.0, owner delegated the decision): main push-event Cross-platform CI 40457212804 on 88aaa75 failed only Classification: test port race, not a product regression. The test picks a random free port pair by bind-probe-and-release (freePortPair), squats the picker port, then releases it and expects the next start to rebind the same port; the port was taken in between. The test has existed since #6072 (2026-09-27, in v2.92.0). The identical tree passed every test shard in candidate lane=all 40434756491, preview push CI 40448022930 and PR CI 40455723510. Action: one rerun of the failed job only. A follow-up will remove the predetermined-port pattern from this test (same class as #7740). |
Summary
Promotes the frozen
devcandidate2606f6f922d6c897836f4aafc0910f46293e5786tomainas stable 2.93.0. The promotion head merges inmainancestry with theoursstrategy, so its tree is exactly the candidate tree (git diff 2606f6f922 HEADis empty). Candidate version sources already say 2.93.0, anddevalready outranks it (#7795, 736fa50, moveddevto 2.94.0).The main-only 2.92.0 dependency fixes (#7643 zod 4.6.6 and body-parser 2.4.0, #7645 gui happy-dom 21.0.4) are already present in the candidate, so the
oursmerge drops nothing.The same candidate shipped as 2.93.0-preview.20261027 (#7796, release run 40452751461) and passed the preview smoke on the release host (isolated install of the published package:
ocx --version,start,/healthzok,stop).Known issue carried into this release: on a Remote Link Child,
ocx stopleaves Codex pointed at the stopped Child untilocx startorocx sync --restart-codex(from #7564; the native-restore fix #7736 is deferred).Verification
2606f6f922d6c897836f4aafc0910f46293e5786: workflow_dispatch Cross-platform CI lane=all 40434756491 success and Service lifecycle 40434760151 success, without reruns.previewdist-tag = 2.93.0-preview.20261027.bun scripts/release-version-sources.ts check 2.93.0: all 4 version sources carry 2.93.0;origin/mainis an ancestor of this head.release.yml.Checklist