Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
e8a8ac7
feat(usage): return 503 for usage read failures
Aug 13, 2026
50a491e
feat(gui): harden usage response validation before caching
Aug 13, 2026
75210ad
style(gui): fix select-label spill, ID wrapping, and run-policy grid …
Aug 13, 2026
4e96b02
fix(gui): reconcile tests with Configured Roster copy and V1/V2 termi…
Aug 13, 2026
e16a3dd
chore(server): remove unused-import residue in management route modules
Aug 13, 2026
1e3d93d
chore(server): mark dead management routes deprecated
Aug 13, 2026
e183bf2
docs: standardize V1/V2 label capitalization in guides
Aug 13, 2026
234edd6
feat(gui): adopt zustand for usage reports (PR1)
Aug 13, 2026
bf2a6fa
feat(gui): provider-quota store for dashboard + workspace shell (PR2)
Aug 13, 2026
7cfe220
feat(gui): dashboard 30d cost + plan & quota section
Aug 13, 2026
8ee51cb
fix(gui): de-jargon subagents page subtitle and right-align policy sa…
Aug 13, 2026
ec89d45
docs: document usage 503 contract and dashboard cost/quota features
Aug 13, 2026
5e96f9d
fix(gui): review round — seed semantics, quota projection, dashboard …
Aug 13, 2026
bedacd7
a11y(gui): tooltips on ellipsized integration values + integrations t…
Aug 13, 2026
629630e
style(gui): token-consistency sweep for off-scale spacing values
Aug 13, 2026
35d03f3
docs: capitalize V1/V2 collaboration-protocol prose and align termino…
Aug 13, 2026
1590986
fix(gui,docs): review round — comment accuracy, doc V1/V2 consistency…
Aug 13, 2026
2e2a197
feat(gui): surface quota-unavailable providers in dashboard and provi…
Aug 13, 2026
c34d72d
fix(gui): review round — stable store fallbacks, status allowlist, re…
Aug 13, 2026
93f5c8a
fix(gui): assign quota attention to one owner and scope live regions
Aug 13, 2026
11eee31
fix(gui): review round — strip empty-state coexistence and manage-lin…
Aug 13, 2026
66c2d33
chore: ignore playwright-cli scratch artifacts
Aug 13, 2026
a096e19
fix(quota): prefer Grok weekly credits with graceful no-cap fallback
Aug 13, 2026
6653a1d
fix(anthropic): clamp unsupported reasoning efforts at the wire boundary
Aug 13, 2026
e998f86
fix(server): review round — credits no-cap reset, unknown-effort budg…
Aug 13, 2026
9c9e067
fix(anthropic): restore medium thinking budget (judge finding)
Aug 13, 2026
8276aad
fix(xai): clamp grok reasoning efforts to the real ladder
Aug 14, 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
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ dist/
**/.codexclaw/
.omo/
**/.omo/
.playwright-cli/

# Local development worktrees
.worktrees/
Expand Down
2 changes: 1 addition & 1 deletion docs-site/src/components/Landing.astro
Original file line number Diff line number Diff line change
Expand Up @@ -214,7 +214,7 @@ const docsMap = [
</article>
<article class="lp-cell">
<h3><svg class="lp-ico" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d={icons.bot} /></svg>{'Sub-agents'}</h3>
<p>{'Pin up to five routed or native models for Codex spawn_agent, and switch the v1 / base / v2 surface globally.'}</p>
<p>{'Pin up to five routed or native models for Codex spawn_agent, and switch the V1 / base / V2 surface globally.'}</p>
</article>
<article class="lp-cell lp-cell-claude">
<h3><svg class="lp-ico" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d={icons.terminal} /></svg>Claude Code</h3>
Expand Down
6 changes: 3 additions & 3 deletions docs-site/src/content/docs/guides/codex-app-models.md
Original file line number Diff line number Diff line change
Expand Up @@ -122,14 +122,14 @@ forces Codex's model cache stale after a toggle.

## Multi-agent surface mode

The Models page labels the three collaboration choices **Reliable v1**, **Codex native** (the
base/upstream behavior), and **Concurrent v2**. This control changes which Codex collaboration surface each picker
The Models page labels the three collaboration choices **Reliable V1**, **Codex native** (the
base/upstream behavior), and **Concurrent V2**. This control changes which Codex collaboration surface each picker
entry uses; see [Sub-agent Surface](/guides/sub-agent-surface/) for the canonical mode, delegation,
inheritance, fallback, and encrypted-task behavior.

## Reasoning top tiers

Reasoning-tier visibility is independent of the v1/base/v2 surface mode. Generated reasoning-capable
Reasoning-tier visibility is independent of the V1/base/V2 surface mode. Generated reasoning-capable
entries advertise `max` so direct sub-agent effort overrides validate; current generated routed
entries and older native GPT entries also advertise `ultra`. Exact upstream GPT-5.6 ladders are
preserved, so Luna has `max` but no `ultra`.
Expand Down
2 changes: 1 addition & 1 deletion docs-site/src/content/docs/guides/codex-integration.md
Original file line number Diff line number Diff line change
Expand Up @@ -293,7 +293,7 @@ it is not; `ccx doctor` reports restart safety (service/shim coverage).

## The subagent picker

Catalog sync makes the selected sub-agent models available to Codex; see [Codex App model picker](/guides/codex-app-models/#subagent-selection) for picker ordering and [Sub-agent Surface](/guides/sub-agent-surface/) for v1/base/v2 delegation and fallback behavior.
Catalog sync makes the selected sub-agent models available to Codex; see [Codex App model picker](/guides/codex-app-models/#subagent-selection) for picker ordering and [Sub-agent Surface](/guides/sub-agent-surface/) for V1/base/V2 delegation and fallback behavior.

## Codex account warmup

Expand Down
10 changes: 5 additions & 5 deletions docs-site/src/content/docs/guides/combos.md
Original file line number Diff line number Diff line change
Expand Up @@ -213,9 +213,9 @@ default and leaves the target's own behavior unchanged. Supported values are `lo
`high`, `xhigh`, `max`, and `ultra`; omit the field or set it to `null` to leave effort entirely to
the caller and target.

## Encrypted v2 sub-agent tasks
## Encrypted V2 sub-agent tasks

There is one important limitation for Codex v2 sub-agents ([issue #92](https://github.com/pavelhov/CodexCommander/issues/92)).
There is one important limitation for Codex V2 sub-agents ([issue #92](https://github.com/pavelhov/CodexCommander/issues/92)).
A native parent can send a newly spawned worker's task only as ciphertext minted for the native
ChatGPT backend. An external provider cannot read that payload.

Expand All @@ -239,10 +239,10 @@ You have four recovery options:

1. Select a native ChatGPT model for the child.
2. Add a canonical native ChatGPT target to the combo.
3. Use the v1 surface for delegation across different providers.
3. Use the V1 surface for delegation across different providers.
4. Enable **Plaintext compatibility** under **Subagents → Run Policy**, then start a new session.

See [Sub-agent Surface](/guides/sub-agent-surface/) for the v1/base/v2 modes and the full encrypted
See [Sub-agent Surface](/guides/sub-agent-surface/) for the V1/base/V2 modes and the full encrypted
task workflow.

## Manage combos
Expand Down Expand Up @@ -321,7 +321,7 @@ running CodexCommander instance that receives model requests.
### Why do I get `combo_unavailable`?

Every target is currently ineligible: for example, its provider is disabled, it is cooling down,
it has already been attempted for this request, or an encrypted v2 task excludes it. Check target
it has already been attempted for this request, or an encrypted V2 task excludes it. Check target
provider state and recent upstream errors. For cooldowns, wait for the 60-second default or the
upstream `Retry-After` period (never more than 10 minutes), then retry.

Expand Down
48 changes: 24 additions & 24 deletions docs-site/src/content/docs/guides/sub-agent-surface.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
---
title: Sub-agent Surface (v1 / base / v2)
title: Sub-agent Surface (V1 / base / V2)
description: Control how Codex spawns and manages sub-agents across all models.
---

Expand All @@ -16,12 +16,12 @@ Choose the mode for **new sessions**. Existing sessions keep the surface they st

| Mode | What Codex gets | Who should pick it |
| --- | --- | --- |
| **v1** | Classic namespaced `spawn_agent`, `send_input`, `resume_agent`, and `close_agent` tools. A spawn can select another model directly. | Beginners who need reliable delegation across different providers, especially native-to-routed children. |
| **base** (default; **Codex native** in the GUI) | Upstream model pins: GPT-5.6 Sol/Terra use v2, Luna uses v1, and unpinned models follow Codex's `multi_agent_v2` feature flag. | Most users. It follows Codex's intended surface for each model without forcing one globally. |
| **v2** | Flat `spawn_agent`, `send_message`, `followup_task`, `interrupt_agent`, and agent-list tools, with concurrent sessions. | Users who want the newer concurrent workflow. Mixed-provider parents must also choose the plaintext compatibility delivery policy described below. |
| **V1** | Classic namespaced `spawn_agent`, `send_input`, `resume_agent`, and `close_agent` tools. A spawn can select another model directly. | Beginners who need reliable delegation across different providers, especially native-to-routed children. |
| **base** (default; **Codex native** in the GUI) | Upstream model pins: GPT-5.6 Sol/Terra use V2, Luna uses V1, and unpinned models follow Codex's `multi_agent_v2` feature flag. | Most users. It follows Codex's intended surface for each model without forcing one globally. |
| **V2** | Flat `spawn_agent`, `send_message`, `followup_task`, `interrupt_agent`, and agent-list tools, with concurrent sessions. | Users who want the newer concurrent workflow. Mixed-provider parents must also choose the plaintext compatibility delivery policy described below. |

:::tip[Not sure?]
Start with **base**. Choose **v1** for the established cross-provider path. Force **v2** only when
Start with **base**. Choose **V1** for the established cross-provider path. Force **V2** only when
you specifically want its newer session model; enable plaintext compatibility when that V2 parent
must delegate to Kimi, Grok, DeepSeek, or another external provider.
:::
Expand All @@ -30,16 +30,16 @@ must delegate to Kimi, Grok, DeepSeek, or another external provider.

The selected mode controls the `multi_agent_version` field in every catalog entry Codex reads:

- **v1** stamps `multi_agent_version = "v1"` on every model.
- **V1** stamps `multi_agent_version = "v1"` on every model.
- **base** restores upstream pins. Unpinned entries follow the native `multi_agent_v2` feature flag.
- **v2** stamps `multi_agent_version = "v2"` on every model.
- **V2** stamps `multi_agent_version = "v2"` on every model.

CodexCommander applies this as the final pass to both the live `/v1/models` catalog and the catalog synced
to disk. That is why a mode change affects newly created App, CLI, and TUI sessions consistently.

### A mode is not a worker reload

Changing to **v2** makes Luna *eligible for the V2 collaboration surface* because the generated
Changing to **V2** makes Luna *eligible for the V2 collaboration surface* because the generated
catalog stamps it as V2. It does not, by itself, make Luna (or any other model) available to a
currently running Codex worker. For a model to be usable by `spawn_agent`, all of these must hold:

Expand All @@ -52,7 +52,7 @@ This separation is deliberate: protocol selection controls catalog semantics; ca
controls what an already-running Codex worker has loaded. In particular, opening a **new task** or
forking a task does **not** reload an existing app-server's model catalog.

For a v2 roster, eligibility has three states: an entry stamped `"v2"`, explicitly set to `null`, or
For a V2 roster, eligibility has three states: an entry stamped `"v2"`, explicitly set to `null`, or
with no `multi_agent_version` field is eligible. A genuine `"v1"` pin is excluded because it states
that the model belongs to the other collaboration surface.

Expand All @@ -62,12 +62,12 @@ The dashboard's **Sub-agent delegation** controls three related settings:

- `injectionModel` is the preferred worker model named in CodexCommander guidance.
- `injectionEffort` is the optional `reasoning_effort` to request for that model.
- `injectionPrompt` replaces the built-in v2 guidance text.
- `injectionPrompt` replaces the built-in V2 guidance text.

`multiAgentGuidanceEnabled` defaults to on and is the master switch for CodexCommander-authored guidance
on both surfaces. Turning it off suppresses both the v2 designation block and v1 proactive text.
on both surfaces. Turning it off suppresses both the V2 designation block and V1 proactive text.

These are instructions to the main agent, not a proxy-side spawn router. On v2, a full-history fork
These are instructions to the main agent, not a proxy-side spawn router. On V2, a full-history fork
inherits the parent model and rejects model or effort overrides. Guidance therefore tells Codex to
use `fork_turns: "none"` (or a positive partial turn count such as `"3"`) when passing `model` or
`reasoning_effort`, and to make the task message self-contained.
Expand All @@ -81,14 +81,14 @@ Custom `injectionPrompt` text can use all four placeholders:
| `{{roster}}` | The resolved picker-visible, surface-compatible roster |
| `{{fallback}}` | The configured global fallback guidance |

The built-in v2 guidance has a 700-character budget. If it would exceed the budget, CodexCommander drops
The built-in V2 guidance has a 700-character budget. If it would exceed the budget, CodexCommander drops
the roster first rather than truncating the core spawn instructions. Built-in guidance fires only
when a preferred model, eligible roster, or fallback chain resolves. A configured `injectionModel`
is sufficient to render a custom prompt; if a bare value cannot resolve uniquely, `{{model}}`
expands to an empty string.

On v1, CodexCommander injects only the upstream-style proactive delegation guidance at `max` or `ultra`
effort. It does not add a preferred model, roster, fallback list, or custom prompt on v1.
On V1, CodexCommander injects only the upstream-style proactive delegation guidance at `max` or `ultra`
effort. It does not add a preferred model, roster, fallback list, or custom prompt on V1.

The default-off `syncCodexSubagentDefaults` option is separate from guidance. When CodexCommander owns
active Codex routing, sync or restart can write the selected values as marker-owned
Expand Down Expand Up @@ -117,7 +117,7 @@ normal heterogeneous fallback chain.

## V2 task delivery

Codex may send a v2 native-to-routed child task only as backend-encrypted `encrypted_content`. That
Codex may send a V2 native-to-routed child task only as backend-encrypted `encrypted_content`. That
payload can be read by the native ChatGPT backend, but not by an external provider. This is the
known [#92 limitation](https://github.com/pavelhov/CodexCommander/issues/92).

Expand All @@ -133,7 +133,7 @@ CodexCommander fails safely instead of forwarding an empty or unreadable task:

| Policy | Behavior |
| --- | --- |
| `"encrypted"` (default) | Preserves ChatGPT's reserved encrypted collaboration schema and the fail-closed behavior above. Use native ChatGPT workers or v1 for external workers. |
| `"encrypted"` (default) | Preserves ChatGPT's reserved encrypted collaboration schema and the fail-closed behavior above. Use native ChatGPT workers or V1 for external workers. |
| `"plaintext"` | Experimental mixed-provider V2 compatibility. It changes only V2 **task-message delivery** so a routed provider can read the delegated task; it is not a general key or credential setting. For ChatGPT parents, CodexCommander presents a non-reserved plaintext collaboration namespace and restores the canonical namespace on the client-facing response. For routed parents, it marks only completed V2 message calls as plaintext. Both paths activate Codex's plaintext V2 handler, while its graph, mailbox, wait, follow-up, and completion lifecycle remain native. |

The plaintext decision is made when the parent tool schema is created, before the worker model is
Expand All @@ -153,8 +153,8 @@ switching an active conversation in place.

### GUI

- **Dashboard** → first stat cell: choose **v1**, **base**, or **v2**.
- **Models** → **Current behavior** → **Collaboration**: choose **Reliable v1**, **Codex native** (base/default semantics), or **Concurrent v2**.
- **Dashboard** → first stat cell: choose **V1**, **base**, or **V2**.
- **Models** → **Current behavior** → **Collaboration**: choose **Reliable V1**, **Codex native** (base/default semantics), or **Concurrent V2**.
- **Subagents** → **Agent Command Center**:
- **Configured Roster** chooses and orders the five model overrides advertised first to `spawn_agent`.
Drag rows, use the arrow buttons, or press <kbd>Alt</kbd> + <kbd>↑</kbd>/<kbd>↓</kbd>. The card
Expand Down Expand Up @@ -237,15 +237,15 @@ curl -X PUT http://localhost:10100/api/injection-model \
No. Guidance can recommend a model, and native-default sync can provide a Codex default, but the
main agent still decides whether to delegate.

### Why did my v2 child use the parent model?
### Why did my V2 child use the parent model?

A full-history v2 fork inherits the parent model. Use a spawn that sets `fork_turns` to `"none"` or
A full-history V2 fork inherits the parent model. Use a spawn that sets `fork_turns` to `"none"` or
a positive partial count before passing a model or effort override.

### Why is a configured model missing from the v2 roster?
### Why is a configured model missing from the V2 roster?

It may be picker-hidden, outside the five-model display limit, missing from the catalog, or pinned
to v1. A `"v2"`, `null`, or absent surface value is eligible; a real `"v1"` pin is not.
to V1. A `"v2"`, `null`, or absent surface value is eligible; a real `"v1"` pin is not.

### Does V2 make Luna available immediately?

Expand All @@ -271,7 +271,7 @@ make ChatGPT show **stopped unexpectedly**. A pending catalog or uninjected mana

Yes, with **V2 message delivery → Plaintext compatibility** and a fresh session. The policy keeps
the V2 lifecycle but makes that parent's delegated messages plaintext. Leave delivery encrypted for
the native-only confidentiality contract, or use Reliable v1 for the established cross-provider surface.
the native-only confidentiality contract, or use Reliable V1 for the established cross-provider surface.

### Reasoning effort

Expand Down
Loading
Loading