Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
42 commits
Select commit Hold shift + click to select a range
8143cc0
build(deps): bump rustls from 0.23.45 to 0.23.46 in /desktop/src-taur…
dependabot[bot] Oct 30, 2026
88de376
fix(ci): distinguish install failures from owned deadlines (#7977)
luvs01 Oct 30, 2026
2c4e580
test(xai): cover encrypted Responses tool continuation (#7975)
Reedtrullz Oct 30, 2026
3a70dd4
fix(volcengine): keep Kimi K3.1 Pro tool continuations valid (#7944)
AaronZ345 Oct 30, 2026
4998194
perf(responses): count snapshot text bytes incrementally (#7957)
0disoft Oct 30, 2026
572467f
perf(history): move integrity scans off the serving thread (#7972)
luvs01 Oct 30, 2026
0cc5a59
fix(workflow-budget): make per-task ceilings configurable from config…
robin-bially Oct 30, 2026
899cc4f
docs(config): say when the workflow send ceiling is checked (#7987)
lidge-jun Oct 30, 2026
4fc8700
fix(kiro): exclude runtime callbacks from retry snapshot (#7981)
lidge-jun Oct 30, 2026
853508e
fix(windows): snapshot ACL failure diagnostics (#7970)
luvs01 Oct 30, 2026
db7bdc5
fix(cli): explain tracked runtime stop refusals (#7973)
luvs01 Oct 30, 2026
d82d7ee
fix(router): decode routed slugs via modelDisplayNames ids (#7979)
lidge-jun Oct 30, 2026
1e1620f
fix(responses): normalize Codex tool catalogs and include for Meta Mu…
lidge-jun Oct 30, 2026
ac0833b
fix(windows): bigint probe identity in runtime preflight; release CC-…
lidge-jun Oct 30, 2026
6218a9a
fix(combo): skip Meta Muse targets for mandatory tool_choice (#7982)
lidge-jun Oct 30, 2026
d42b9b1
fix(sidecars): accept CR-delimited Responses events (#7989)
lidge-jun Oct 30, 2026
d389699
fix(azure): omit unsupported Responses encrypted output include (#7988)
lidge-jun Oct 30, 2026
a2ae482
fix(codex): validate CLI and desktop launcher execution boundaries (#…
luvs01 Oct 30, 2026
eea1454
fix(credentials): stop Windows ancestor-watch feedback loops (#7976)
luvs01 Oct 30, 2026
1eca7a3
fix(discovery): name the invalid model row and the static-list workar…
lidge-jun Oct 30, 2026
0c74947
fix(codex): stop scoring an elapsed 5-hour window against a pool acco…
lidge-jun Oct 30, 2026
b692a8a
test(history): corrupt the index the health query plan actually reads…
lidge-jun Oct 30, 2026
ba0556d
fix(codex): retire a pool account's carried 5-hour window when WHAM s…
lidge-jun Oct 30, 2026
03d8bd0
fix(claude): keep web_search native when no sidecar backend can run (…
lidge-jun Oct 30, 2026
8063be2
fix(providers): keep the quota report cache when pool readings are on…
lidge-jun Oct 30, 2026
d9e0c05
fix(responses): promote additional_tools to top-level tools for xAI a…
lidge-jun Oct 30, 2026
a022a67
fix(claude): prune generated agents when the Claude integration is tu…
lidge-jun Oct 30, 2026
227811f
fix(history): bound the integrity check wait (#7997)
lidge-jun Oct 30, 2026
9922f81
test(history): corrupt the health index through a cold connection (#8…
lidge-jun Oct 30, 2026
cb48362
fix(codex): await recovery ACL checks in async parent admission (#7931)
luvs01 Oct 30, 2026
236a886
feat(codex): tier role auto-assign candidates by measured capability …
LilMGenius Oct 30, 2026
3bda3e5
test(codex): assert the cold keyring refusal kind and report its caus…
lidge-jun Oct 30, 2026
b53b5d2
test(cc-switch): finalize the F1/F2 fixture statements before cleanup…
lidge-jun Oct 30, 2026
261131d
fix(update): refuse dashboard restart under a systemd unit OpenCodex …
lidge-jun Oct 30, 2026
19ab113
fix(windows): admit config-root cache writes after the optional confi…
lidge-jun Oct 30, 2026
8e58c96
test(cli): name the pinned-port holder when a sibling misses its dead…
lidge-jun Oct 30, 2026
ed1cf08
fix(combo): exclude Meta for direct hosted tool choices
luvs01 Oct 30, 2026
bf6b1bc
fix(responses): accept recognized hosted choices in combo children
luvs01 Oct 30, 2026
1d216a7
fix(combos): preserve mandatory choices across Chat translation
luvs01 Oct 30, 2026
917ea05
fix(combos): honor auto-only policy for resolved Chat selectors
luvs01 Oct 30, 2026
2dd3cfb
fix(combos): resolve virtual wire policy before tool eligibility
luvs01 Oct 30, 2026
c486a73
docs(combos): link localized mandatory-tool routing guidance
luvs01 Oct 30, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions desktop/src-tauri/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,13 @@ declared `deferred-verb` in the route registry against this document, which is
what keeps them out of the undeclared-route ratchet without pretending the gap
does not exist.

The later configurable-ceilings change also defers the live CLI counterpart of
`PUT /api/workflow-budget/settings` against this document. Its management API
updates the running policy; local `ocx config set/unset workflowBudget...`
edits disk configuration and requires a proxy restart for live convergence.
`GET /api/workflow-budget/settings` is a `local-transport` exemption because
`ocx config get` can read the same configuration block locally.

## Verification posture

Local suite, typecheck, install and build: NOT RUN, by standing instruction.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -199,9 +199,9 @@ configuré sous [`claudeCode.authMode`](/fr/reference/configuration/server/#clau

### Ce qu'une sauvegarde de fournisseur conserve

`POST /api/providers` avec le nom d'un fournisseur existant remplace la ligne enregistrée par une ligne construite à partir de la requête. Le formulaire d'ajout/modification du tableau de bord ne peut pas envoyer tous les champs ; la sauvegarde conserve donc certains champs enregistrés que la requête omet. Dix d'entre eux décrivent le comportement d'un amont précis : `preserveReasoningContentModels`, `preserveResponsesReasoningContent`, `requiresReasoningPlaceholderModels`, `foldDeveloperRoleToSystem`, `singleLeadingSystemMessage`, `reasoningWireFormat`, `omitReasoningEffortWithToolsModels`, `retryOn429`, `transientRetryOn5xx`, `retryOnReset`.
`POST /api/providers` avec le nom d'un fournisseur existant remplace la ligne enregistrée par une ligne construite à partir de la requête. Le formulaire d'ajout/modification du tableau de bord ne peut pas envoyer tous les champs ; la sauvegarde conserve donc certains champs enregistrés que la requête omet. Onze d'entre eux décrivent le comportement d'un amont précis : `preserveReasoningContentModels`, `preserveResponsesReasoningContent`, `requiresReasoningPlaceholderModels`, `foldDeveloperRoleToSystem`, `singleLeadingSystemMessage`, `reasoningWireFormat`, `omitReasoningEffortWithToolsModels`, `promoteAdditionalTools`, `retryOn429`, `transientRetryOn5xx`, `retryOnReset`.

| Sauvegarde | Les dix réglages | `apiKeyPool` enregistré |
| Sauvegarde | Les onze réglages | `apiKeyPool` enregistré |
| --- | --- | --- |
| Même destination, champ omis | Valeur enregistrée conservée, y compris un `[]` ou un `false` explicite | Conservé |
| Nouvelle destination, champ omis | Non conservée ; les valeurs par défaut du registre pour la nouvelle destination peuvent s'appliquer | Non conservé |
Expand Down
14 changes: 8 additions & 6 deletions docs-site/src/content/docs/guides/chatgpt-desktop.md
Original file line number Diff line number Diff line change
Expand Up @@ -104,10 +104,11 @@ restart transaction.

## Failure behavior and known limits

When the platform is not macOS, the OpenCodex runtime is missing, or the filter
self-test fails, the launcher runs the original binary with untouched stdout. A
missing bundled app-server binary is the exception: there is nothing to fall back
to, so the launcher exits with an error (see below).
The launcher verifies the executable before every start, including Desktop respawns.
If stdout filtering is unavailable or its self-test fails, the verified executable
runs with untouched stdout. If executable verification fails or the OpenCodex
validator is unavailable, the launcher exits with an error without starting the
app-server. A missing bundled app-server binary also prevents startup (see below).
A filter that passes the self-test and then dies mid-session closes the pipe.
What the bundled app-server does after that has not been verified; it may get
SIGPIPE or a write error and be respawned by Desktop through the same launcher.
Expand All @@ -117,8 +118,9 @@ remaining stream to raw bytes.

The experiment depends on the bundled binary path, the app honoring
`CODEX_CLI_PATH`, and current RPC field shapes. Updates may change these. A moved
or removed OpenCodex installation fails the launcher preflight and runs the
original binary. Run `ocx chatgpt launch` again after relocating the installation.
or removed OpenCodex installation can leave the launcher unable to verify the
executable, so it refuses startup. Run `ocx chatgpt launch` again after relocating
the installation, or `ocx chatgpt restore` to remove the override.
If an app update moves or removes the bundled app-server binary itself, the
launcher cannot start it: it prints a message naming `ocx chatgpt launch` and
`ocx chatgpt restore` on stderr and exits, and Desktop cannot start its
Expand Down
5 changes: 5 additions & 0 deletions docs-site/src/content/docs/guides/claude-code.md
Original file line number Diff line number Diff line change
Expand Up @@ -856,6 +856,11 @@ Proxy startup/ensure, `ocx claude`, and relevant dashboard saves sync your featu
overwritten or pruned; your own agents are never touched.
- Files are atomically synced per file (write + rename).
- `enabled: false` or `injectAgents: false` prunes all verified-owned definitions.
- Turning Claude Code off with the dashboard's integration toggle also prunes them right away
(best effort), so a native `claude` session started afterwards stops seeing proxy-only agents.
A file that cannot be deleted stays, and while a sibling OpenCodex instance owns
`~/.claude/agents` nothing is touched; turning it off again retries and also removes
definitions an older version left behind.
- Successful CLI first-party saves and persisted Desktop first-party setup also attempt best-effort
roster sync, including repeated setup to repair missing definitions. Refused setup and rollback
do not sync agents. Turning first-party off alone does not disable agent registration.
Expand Down
7 changes: 7 additions & 0 deletions docs-site/src/content/docs/guides/combos.md
Original file line number Diff line number Diff line change
Expand Up @@ -152,6 +152,13 @@ native routing and catalog identity on the next sync.

### Failover: ordered primary and backups

For Responses requests that require a tool, Meta Responses targets are skipped before sending
because Meta does not support mandatory `tool_choice`. An eligible later target receives the
original choice, subject to its existing adapter compatibility rules. This includes hosted choices
such as `web_search`, `tool_search`, `computer_use` and `image_gen`, and MCP choices with a
nonempty `server_label` and an omitted, null or nonempty name, including inside required allowed-tools lists. Chat translation preserves a forced `tool_search` as the synthetic function choice. If every target is incompatible for this reason,
the combo reports the constraint. Chat targets that cannot preserve a mandatory selector, including models configured for auto-only tool choice, are also skipped before sending. Registered OpenAI API virtual models use the actual wire model's adapter and tool-choice policy for this decision. Malformed or unknown choices retain the provider's ordinary error path.

`failover` selects the first eligible target in configuration order. A target is eligible when its
provider exists, is enabled, is not cooling down, and can handle any special request constraint.
Weights and `stickyLimit` do not affect this strategy.
Expand Down
33 changes: 29 additions & 4 deletions docs-site/src/content/docs/guides/integrations.md
Original file line number Diff line number Diff line change
Expand Up @@ -987,15 +987,40 @@ exists only while LazyCodex is detected. Without it the dashboard shows neither,

Auto-assign proposes a model for every role at once. opencodex asks your
default Codex model (the root `model` in Codex `config.toml`) one question: for each role, given its
description and the start of its instructions, which capability tier (fast, standard or frontier)
and how much reasoning (glance, measured, thorough or exhaustive) does it need? That model never
picks a model. opencodex then picks the cheapest model from your picker list that reaches the tier:
description and the start of its instructions, which capability tier (fast, standard or frontier),
how much reasoning (glance, measured, thorough or exhaustive) and which task domain (coding, agentic,
reasoning, writing, knowledge or general) does it need? That model never picks a model. opencodex
then picks the cheapest model from your picker list that reaches the tier:

- Models listed under `codexRoleTiers` in the opencodex config (`{ "fast": [...], "standard": [...], "frontier": [...] }`)
have that tier.
- When two or more of the other models have a published score in the role's domain, those models are
tiered by distinct score values, without requiring a price; equal scores share a tier, and unscored models are left out. Scores come from
[Artificial Analysis](https://artificialanalysis.ai) when you add your own API key
(below). The response's `capability` block names the source it used.
- Other models with a known price are ranked by price and split evenly across the three tiers. With only
one or two priced models, the dearest is frontier and the other, if any, is standard.
- Models with no price and no listed tier are never proposed. List them to include them.
- When tiering falls back to price, models with no price and no listed tier are not proposed. List them to include them.

To use Artificial Analysis, create a free API key at [artificialanalysis.ai](https://artificialanalysis.ai/api-reference)
and set it as a literal, an `${ENV}` reference or a keychain reference:

```json
{
"codexRoleCapability": {
"artificialAnalysis": { "apiKey": "${ARTIFICIAL_ANALYSIS_API_KEY}" }
}
}
```

opencodex reads it once per day, which stays inside the free tier's daily request limit. Its terms allow
using the data for your own decisions and forbid passing it on, so auto-assign keeps the scores
internal: the response carries the tier each model got and the attribution, without the scores. If the
key is absent or the read fails, auto-assign uses configured tiers and prices; `capability.error` reports
why and the source attribution fields are null. A retired `huggingFace` setting is ignored.

Artificial Analysis refuses HTTP redirects and limits each response body to 16 MiB with a 30-second
request timeout. Credentials are sent only to its fixed API endpoint.

Each proposal shows the model, the tier, the reasoning effort, a one-line reason, and what would move
it up or down. A role the model could not size clearly is shown as not sized, with the reason, and
Expand Down
4 changes: 4 additions & 0 deletions docs-site/src/content/docs/guides/providers.md
Original file line number Diff line number Diff line change
Expand Up @@ -1082,6 +1082,10 @@ unchanged and were not probed in this update.
> models. Coding Plan defaults to `ark-code-latest`, while Agent Plan defaults to
> `deepseek-v4-flash`.

On the pay-as-you-go Ark route, Kimi K3.1 Pro (`kimi-k3-1-pro`, including dated versions)
replays tool-only assistant turns with an empty string. Its endpoint rejects the legacy
empty-text array with HTTP 400; other Ark models keep their existing continuation format.

> **Volcengine Plan usage restriction:** Volcengine documents Coding Plan and Agent Plan quota as
> valid only inside supported AI coding tools, and warns that using a plan key for general API
> calls may suspend the subscription or ban the account. Routing Codex or Claude Code through
Expand Down
2 changes: 1 addition & 1 deletion docs-site/src/content/docs/guides/sidecars.md
Original file line number Diff line number Diff line change
Expand Up @@ -286,7 +286,7 @@ See the [Configuration reference](/reference/configuration/server/#sidecars) for

Search responses with malformed optional fields retain valid answer text and citations. Invalid error-message values use a generic failure message.

The OpenAI search and vision sidecars read a final completion or failure event even when the server closes the body without a trailing newline. An unfinished response or one stopped by a size limit still reports an error.
The OpenAI search and vision sidecars accept CR, LF and CRLF line endings, including mixed endings and CRLF split across network chunks. They read a final completion or failure event even when the server closes the body without a trailing newline. An unfinished response or one stopped by a size limit still reports an error.

When a search answer ends with a Sources list, an unmatched list item stays in the answer instead of being removed as a citation. A title followed by its URL is still consumed as one citation. Non-HTTP URI-like text inside inline code, such as `mode:fast`, stays in the answer; code-formatted HTTP(S) URLs are still citations.

Expand Down
3 changes: 2 additions & 1 deletion docs-site/src/content/docs/guides/sub-agent-surface.md
Original file line number Diff line number Diff line change
Expand Up @@ -151,7 +151,8 @@ description of the work Codex usually hands off, sizes it with one call to your
and proposes the cheapest sufficient model and an effort from the list the picker offers, with the
reasoning and the signals that would move it up or down. Nothing changes until you choose
**Use this**, which saves exactly like picking the model and effort by hand. Tiers come from
`codexRoleTiers` or price, as in [role auto-assign](/guides/integrations/#auto-assign).
`codexRoleTiers` or price, as in [role auto-assign](/guides/integrations/#auto-assign), without the
measured scores role auto-assign can read from configured sources.

`multiAgentGuidanceEnabled` defaults to on and is the master switch for opencodex-authored guidance
on both surfaces. Turning it off suppresses both the v2 designation block and v1 proactive text.
Expand Down
2 changes: 1 addition & 1 deletion docs-site/src/content/docs/guides/web-dashboard.md
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,7 @@ is visible) and never forces an upstream refresh.
| **Providers** | Add, edit, set the default (enabled providers only), enable/disable, and remove providers; manage OAuth account pools and API-key pools where supported. Removing the current default switches to the first remaining enabled provider when one exists; otherwise deletion is refused and the current default is kept. Provider Settings can disable live model discovery for endpoints with missing, slow, or oversized `/models` catalogs. For Claude (Anthropic) OAuth pools, each logged-in account shows its own 5-hour and weekly rate-limit bars (usage is per credential); a failed probe keeps the last-known bars and marks them unavailable until the next successful refresh. Refreshing quota skips paused OAuth accounts and disabled API keys; skipped rows without a cached reading remain unavailable but do not affect the refresh result. Refreshing reports failure when an unpaused OAuth account or enabled API key that supports quota reads has an unavailable reading. The Provider Overview shown when no provider is selected carries a **Refresh all quotas** control that forces one server-side re-read of every configured provider; a provider whose upstream probe fails keeps its last-good row, so the status line reports that the check completed rather than claiming every value is fresh, and each row's own age stays the per-provider freshness signal. |
| **Add provider** | One search above the tabs reaches all four at once — Accounts, Free, Local, Paid. While a query is live the results are grouped by tab with a count each, and the selected tab stays put rather than jumping. Press ArrowDown in the search box to focus the first available result action, skipping disabled buttons; if no action is available, focus stays in the search box. Local runtimes (Ollama, vLLM, LM Studio, LiteLLM) have their own tab, and a long provider note clamps to two lines with the full text one click away. Claude Code CLI (subscription) sits under Paid with a Subscription CLI badge, and selecting it warns that it bills the signed-in Claude subscription through `claude -p` and never uses an API key (use `anthropic-apikey` for key billing). |
| **Codex Auth** | Add ChatGPT/Codex pool accounts, select the next-session account, refresh 5h / weekly / 30d quotas, enable or disable quota auto-switch, set its 1–100% threshold, and configure transient-failure failover. |
| **Subagents** | Feature up to five bare native or namespaced routed models in the `spawn_agent` override list. |
| **Subagents** | Feature up to five bare native or namespaced routed models in the `spawn_agent` override list. The **Workflow limits for subagents** panel sets how many turns one task may run in parallel and how many model requests and distinct subagents it may use per 10-minute window. See [workflow limits](/reference/configuration/server/#workflow-limits). |
| **Models** | Toggle native GPT and routed models, set provider allowlists and context caps, choose v1/base/v2, and configure the v2 thread limit. The page distinguishes a catalog saved on the hub, a catalog fetched by this client, and activation in a running client. A fetch timestamp does not prove it includes the latest hub save, and runtime activation is shown as unverified. Configured providers stay visible as zero-model groups when discovery is off or returns no rows. |
| **Logs** | Auto-refresh recent requests with tokens, requested effort and (when available) effective outbound effort, resolved model, provider, status, request id, duration, and error details. The detail view includes the exact reasoning wire field when the adapter emits one. Filter by opaque conversation/session id (when the client sends one) to total tokens and estimated list-price cost for the currently loaded Logs ring. |
| **Usage / Debug** | Inspect token-usage coverage and trends. The Usage page's Models table also breaks each model down into input tokens, output tokens, cache hits, cache writes, and cache hit rate; a dash means cache telemetry for that metric is unavailable. Or enable opt-in provider transport and usage-extraction diagnostics. |
Expand Down
2 changes: 2 additions & 0 deletions docs-site/src/content/docs/ja/guides/combos.md
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,8 @@ ocx combo show main

## 戦略を選択してください

必須の `tool_choice` を維持できないターゲットは送信前にスキップされ、すべて非対応の場合はその制約を示すエラーを返します。自動選択のみを許可する Chat モデルと、OpenAI 仮想モデルの実際の送信モデルのポリシーも判定対象です。直接の hosted/MCP 選択、`tool_search`、無効な選択値の扱いは[英語の基準説明](/guides/combos/#failover-ordered-primary-and-backups)を参照してください。

### フェイルオーバー: 順序付けされたプライマリとバックアップ

`failover` は、構成順序で最初の適格なターゲットを選択します。ターゲットは、プロバイダーが存在し、有効になっていて、クールダウン中でなく、特別なリクエスト制約を処理できる場合に適格となります。重みと `stickyLimit` はこの戦略に影響しません。
Expand Down
Loading
Loading