Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
53 commits
Select commit Hold shift + click to select a range
8ca9cab
feat(codex): add account picker lifecycle settings
chrisae9 Aug 4, 2026
18f6e49
fix(codex): harden account picker mutations
chrisae9 Aug 4, 2026
eae13eb
fix(codex): complete picker catalog refreshes
chrisae9 Aug 4, 2026
cbb6297
fix(codex): address lifecycle review follow-ups
chrisae9 Aug 4, 2026
300246d
fix(codex): surface pending catalog refreshes
chrisae9 Aug 4, 2026
a7af7c8
Merge remote-tracking branch 'upstream/dev' into split/426-04-account…
chrisae9 Aug 4, 2026
dc804e3
Merge remote-tracking branch 'upstream/dev' into split/426-04-account…
chrisae9 Aug 4, 2026
82571a1
Merge remote-tracking branch 'upstream/dev' into split/426-04-account…
chrisae9 Aug 4, 2026
f3b7fcf
Merge remote-tracking branch 'upstream/dev' into split/426-04-account…
chrisae9 Aug 5, 2026
ce6c50b
Merge remote-tracking branch 'upstream/dev' into split/426-04-account…
chrisae9 Aug 5, 2026
0ca6f8b
Merge remote-tracking branch 'upstream/dev' into split/426-04-account…
chrisae9 Aug 5, 2026
12c2c93
Merge remote-tracking branch 'upstream/dev' into split/426-04-account…
chrisae9 Aug 5, 2026
e947442
Merge remote-tracking branch 'upstream/dev' into split/426-04-account…
chrisae9 Aug 5, 2026
918cf26
Merge remote-tracking branch 'upstream/dev' into split/426-04-account…
chrisae9 Aug 5, 2026
ba5443d
Merge remote-tracking branch 'upstream/dev' into split/426-04-account…
chrisae9 Aug 5, 2026
a94b6b7
Merge remote-tracking branch 'upstream/dev' into split/426-04-account…
chrisae9 Aug 5, 2026
1466e35
Merge remote-tracking branch 'upstream/dev' into split/426-04-account…
chrisae9 Aug 5, 2026
2ecd189
Merge remote-tracking branch 'upstream/dev' into split/426-04-account…
chrisae9 Aug 5, 2026
71cf621
Merge remote-tracking branch 'upstream/dev' into split/426-04-account…
chrisae9 Aug 5, 2026
9a0f860
fix(codex): reserve routing profile namespaces
chrisae9 Aug 5, 2026
5cdda0b
Merge remote-tracking branch 'upstream/dev' into split/426-04-account…
chrisae9 Aug 5, 2026
a8fb1ce
Merge remote-tracking branch 'upstream/dev' into split/426-04-account…
chrisae9 Aug 5, 2026
1f98cb1
docs(codex): clarify exact account routing
chrisae9 Aug 5, 2026
6c67a86
docs(codex): add catalog sync recovery
chrisae9 Aug 5, 2026
27ce53f
Merge remote-tracking branch 'upstream/dev' into split/426-04-account…
chrisae9 Aug 5, 2026
bf07b1d
Merge remote-tracking branch 'upstream/dev' into split/426-04-account…
chrisae9 Aug 5, 2026
49d646b
fix(codex): harden picker config recovery
chrisae9 Aug 5, 2026
cfd42bc
fix(codex): redact physical account ids in errors
chrisae9 Aug 5, 2026
4dc0106
Merge remote-tracking branch 'upstream/dev' into split/426-04-account…
chrisae9 Aug 5, 2026
ebc39ba
Merge remote-tracking branch 'upstream/dev' into split/426-04-account…
chrisae9 Aug 5, 2026
9b1cdc4
Merge remote-tracking branch 'upstream/dev' into split/426-04-account…
chrisae9 Aug 5, 2026
1d1d60e
Merge remote-tracking branch 'upstream/dev' into split/426-04-account…
chrisae9 Aug 5, 2026
ff703f4
fix(redact): harden exact account id masking
chrisae9 Aug 5, 2026
9e5516f
Merge remote-tracking branch 'upstream/dev' into split/426-04-account…
chrisae9 Aug 5, 2026
565b252
Merge upstream dev into split/426-04-account-lifecycle-settings
chrisae9 Aug 5, 2026
550e2f4
Merge remote-tracking branch 'upstream/dev' into split/426-04-account…
chrisae9 Aug 5, 2026
7619b65
Merge remote-tracking branch 'upstream/dev' into split/426-04-account…
chrisae9 Aug 5, 2026
f0a7558
fix(codex): preserve catalog state during convergence
chrisae9 Aug 5, 2026
47fff65
fix(codex): redact pool credentials from diagnostics
chrisae9 Aug 5, 2026
112128e
Merge upstream dev into split/426-04-account-lifecycle-settings
chrisae9 Aug 5, 2026
adec496
test(codex): protect account identity in route explanations
chrisae9 Aug 5, 2026
a1473be
Merge upstream dev into split/426-04-account-lifecycle-settings
chrisae9 Aug 5, 2026
97e13be
fix(codex): seal catalog feature evidence
chrisae9 Aug 5, 2026
296514c
docs(codex): clarify account selector labels
chrisae9 Aug 5, 2026
fd332e7
Merge upstream dev into split/426-04-account-lifecycle-settings
chrisae9 Aug 5, 2026
d326707
Merge upstream dev into split/426-04-account-lifecycle-settings
chrisae9 Aug 5, 2026
dd2cd6d
fix(codex): unify catalog writer policy
chrisae9 Aug 5, 2026
dc9fe33
fix(codex): redact encoded credential echoes
chrisae9 Aug 5, 2026
a30b8e7
Merge upstream dev into split/426-04-account-lifecycle-settings
chrisae9 Aug 5, 2026
ea310c8
Merge upstream dev into split/426-04-account-lifecycle-settings
chrisae9 Aug 5, 2026
d1047c5
Merge upstream dev into split/426-04-account-lifecycle-settings
chrisae9 Aug 5, 2026
b593374
fix(codex): clarify account lifecycle contracts
chrisae9 Aug 5, 2026
75008c9
Merge upstream dev into split/426-04-account-lifecycle-settings
chrisae9 Aug 5, 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
24 changes: 14 additions & 10 deletions docs-site/src/content/docs/guides/codex-app-models.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,16 @@ App's model picker as normal Codex catalog entries.

OpenAI entries use two credential routes: native Codex login and the namespaced
`openai-apikey/<model>` API-key transport. Changing `codexAccountMode` between Pool and Direct by
itself does not change picker ids. When `codexAccountNamespaces` has eligible selectors whose
mapped accounts still exist, however,
opencodex adds separate `<selector>/<native-openai-model>` rows for the mapped accounts and hides
the bare native rows from the Codex picker. Selector labels are user-chosen public names with no
built-in account-role meaning. Selecting a qualified row uses only its mapped account, does not
change the active Pool account, and fails closed instead of switching accounts when the target is
unavailable. See [Exact Codex account selectors](/reference/configuration/routing/#exact-codex-account-selectors).
itself does not change picker ids. When account-picker visibility is enabled
(`codexAccountPickerEnabled` is not `false`) and `codexAccountNamespaces` has eligible selectors
whose mapped accounts still exist, opencodex adds separate `<selector>/<native-openai-model>` rows
for the mapped accounts and hides the bare native rows from the Codex picker. Setting
`codexAccountPickerEnabled: false` hides only those generated rows; configured qualified ids remain
exact routes and still fail closed instead of switching accounts. Selector labels are configurable
public names. Initialization creates privacy-safe defaults, and labels have no built-in account-role
meaning. Selecting a qualified row uses only its mapped
account and does not change the active Pool account. See
[Exact Codex account selectors](/reference/configuration/routing/#exact-codex-account-selectors).
API GPT-5.6 entries use
1,050,000 context / 922,000 max input, and `*-pro` picker ids resolve to the base wire model with
`reasoning.mode: "pro"` while logs, usage, and picker state keep the virtual id.
Expand All @@ -24,7 +27,8 @@ three Pro virtual ids; there is no generic `gpt-5.6-pro` alias.
Compact requests keep the selected tier but send the base model without a reasoning object.

Select the credential route represented by the picker id. Change Pool/Direct on the Providers page;
`<selector>` below is a user-chosen public label mapped through `codexAccountNamespaces`:
`<selector>` below is a configurable public label mapped through `codexAccountNamespaces`;
initialized bindings may use an automatically generated value:

```text
gpt-5.6-sol # bare Codex-login route via Pool or Direct
Expand Down Expand Up @@ -72,8 +76,8 @@ metadata instead of an older-template approximation.

| Route | Picker ids and catalog metadata |
| --- | --- |
| Codex login (no eligible account selectors) | Bare native ids such as `gpt-5.6-sol`, `gpt-5.6-terra`, and `gpt-5.6-luna`; Pool or Direct is selected through `codexAccountMode`. GPT-5.6 rows use a 372,000-token catalog window. |
| Codex login (eligible account selectors) | One `<selector>/<native-openai-model>` row per eligible selector and supported native model; each row uses only its mapped account, and bare native rows are hidden from the picker. Native metadata and context windows are preserved. |
| Codex login (picker hidden or no eligible account selectors) | Bare native ids such as `gpt-5.6-sol`, `gpt-5.6-terra`, and `gpt-5.6-luna`; Pool or Direct is selected through `codexAccountMode`. GPT-5.6 rows use a 372,000-token catalog window. Configured exact selector routes remain callable while hidden. |
| Codex login (picker enabled with eligible account selectors) | One `<selector>/<native-openai-model>` row per eligible selector and supported native model; each row uses only its mapped account, and bare native rows are hidden from the picker. Native metadata and context windows are preserved. |
| OpenAI (API key) | Exactly eight namespaced rows: `gpt-5.5`, `gpt-5.6`, Sol/Terra/Luna, and the three `*-pro` virtual ids (1,050,000 context; 922,000 max input for all eight) |
| OpenRouter | `openrouter/openai/gpt-5.6-sol`, `openrouter/openai/gpt-5.6-terra`, `openrouter/openai/gpt-5.6-luna` (1,050,000) |
| Cursor | Static fallback includes `cursor/gpt-5.6-sol`, `cursor/gpt-5.6-terra`, and `cursor/gpt-5.6-luna` (1,000,000), plus `cursor/grok-4.5` and `cursor/grok-4.5-fast` (500,000); live account discovery decides which remain visible. |
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 @@ -153,7 +153,7 @@ The GUI is a thin client over the proxy's JSON management API. Useful endpoints

| Endpoint | Purpose |
| --- | --- |
| `GET` / `PUT /api/settings` | Read settings or toggle Codex autostart. |
| `GET` / `PUT /api/settings` | Read settings or update Codex autostart, stream mode, app-owned memory budget, and account-qualified picker visibility. A persisted picker change can return `catalogRefreshPending: true`; retry with `ocx sync`. |
| `GET` / `POST /api/github/star` | Read the `gh`-derived star state, or star the repository. The POST is refused with `403` `agent_consent_required` for agent-driven callers without a dashboard session. |
| `GET /api/startup-health` | Read secret-free routing, service, shim, and restart-safety diagnostics. |
| `POST /api/startup-action` | Install the background service or Codex launcher shim through fixed, allowlisted actions. |
Expand Down
8 changes: 4 additions & 4 deletions docs-site/src/content/docs/ja/guides/codex-app-models.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@ description: opencodex モデルが、共有 Codex カタログを通じて Code

opencodex は Codex アプリにパッチを適用しません。 Codex CLI/TUI が既に使用しているのと同じ Codex 設定とモデル カタログを書き込みます。 Codex アプリはその共有状態を読み取るため、ルーティングされたモデルは通常の Codex カタログ エントリとしてアプリのモデル ピッカーに表示されます。

OpenAI エントリには、ネイティブ Codex ログインと、名前空間付きの `openai-apikey/<model>` API キーという 2 つの資格情報ルートがあります。`codexAccountMode` だけを Pool と Direct の間で変更しても、ピッカー ID は変わりません。ただし、`codexAccountNamespaces` に対象アカウントが存在する selector がある場合、opencodex は対応するアカウントごとに `<selector>/<native-openai-model>` 行を追加し、ピッカーでは bare native 行を非表示にします。Selector 名はユーザーが決める公開ラベルであり、組み込みのアカウント role の意味はありません。`selector` 付きの行を選択すると、対応付けられたアカウントだけが使用され、アクティブな Pool アカウントは変更されません。対象を利用できない場合、別のアカウントへ切り替えずにリクエストが失敗します。詳しくは [Codex アカウントの明示的な selector](/reference/configuration/routing/#exact-codex-account-selectors) を参照してください。API GPT-5.6 エントリは 1,050,000 コンテキスト / 922,000 最大入力を使用し、`*-pro` ピッカー ID は `reasoning.mode: "pro"` のベース ワイヤ モデルに解決されますが、ログ、使用状況、およびピッカー状態は仮想 ID を保持します。 API カタログは、`gpt-5.5`、`gpt-5.6`、Sol/Terra/Luna、およびそれらの 3 つの Pro 仮想 ID の 8 つの ID に固定されています。汎用の `gpt-5.6-pro` エイリアスはありません。コンパクト リクエストは、選択された層を保持しますが、推論オブジェクトなしで基本モデルを送信します。
OpenAI エントリには、ネイティブ Codex ログインと、名前空間付きの `openai-apikey/<model>` API キーという 2 つの資格情報ルートがあります。`codexAccountMode` だけを Pool と Direct の間で変更しても、ピッカー ID は変わりません。`codexAccountPickerEnabled` が `false` ではなく、`codexAccountNamespaces` に対象アカウントが存在する selector がある場合、opencodex は対応するアカウントごとに `<selector>/<native-openai-model>` 行を追加し、ピッカーでは bare native 行を非表示にします。`false` は生成 row だけを非表示にし、設定済みの exact selector route は引き続き利用でき、対象が利用できなければ別のアカウントへ切り替えず失敗します。Selector 名は設定可能な公開ラベルです。初期化時にはプライバシーに配慮した既定値が自動生成され、組み込みのアカウント role の意味はありません。`selector` 付きの行を選択すると、対応付けられたアカウントだけが使用され、アクティブな Pool アカウントは変更されません。詳しくは [Codex アカウントの明示的な selector](/reference/configuration/routing/#exact-codex-account-selectors) を参照してください。API GPT-5.6 エントリは 1,050,000 コンテキスト / 922,000 最大入力を使用し、`*-pro` ピッカー ID は `reasoning.mode: "pro"` のベース ワイヤ モデルに解決されますが、ログ、使用状況、およびピッカー状態は仮想 ID を保持します。 API カタログは、`gpt-5.5`、`gpt-5.6`、Sol/Terra/Luna、およびそれらの 3 つの Pro 仮想 ID の 8 つの ID に固定されています。汎用の `gpt-5.6-pro` エイリアスはありません。コンパクト リクエストは、選択された層を保持しますが、推論オブジェクトなしで基本モデルを送信します。

ピッカー ID で資格情報ルートを明示的に選択します。Pool/Direct は Providers ページで変更します。以下の `<selector>` は、`codexAccountNamespaces` で対応付けたユーザー定義の公開ラベルです
ピッカー ID で資格情報ルートを明示的に選択します。Pool/Direct は Providers ページで変更します。以下の `<selector>` は、`codexAccountNamespaces` で対応付ける設定可能な公開ラベルであり、初期化された binding では自動生成値になる場合があります

```text
gpt-5.6-sol # Pool または Direct による bare Codex ログイン ルート
Expand Down Expand Up @@ -45,8 +45,8 @@ visibility = "list"

|ルート |ピッカー ID とカタログのメタデータ |
| --- | --- |
| Codex ログイン (有効な account selector なし) | `gpt-5.6-sol`、`gpt-5.6-terra`、`gpt-5.6-luna` などの bare native id を表示し、`codexAccountMode` に従って Pool または Direct を使用します。GPT-5.6 行のカタログ ウィンドウは 372,000 トークンです。 |
| Codex ログイン (有効な account selector あり) | 有効な selector とサポート対象 native model の各組み合わせに `<selector>/<native-openai-model>` 行を表示します。各行は対応付けられたアカウントだけを使用し、bare native 行はピッカーで非表示になります。Native metadata と context window は保持されます。 |
| Codex ログイン (picker 非表示または有効な account selector なし) | `gpt-5.6-sol`、`gpt-5.6-terra`、`gpt-5.6-luna` などの bare native id を表示し、`codexAccountMode` に従って Pool または Direct を使用します。GPT-5.6 行のカタログ ウィンドウは 372,000 トークンです。非表示中も設定済み exact selector route は呼び出せます。 |
| Codex ログイン (picker 表示が有効で account selector あり) | 有効な selector とサポート対象 native model の各組み合わせに `<selector>/<native-openai-model>` 行を表示します。各行は対応付けられたアカウントだけを使用し、bare native 行はピッカーで非表示になります。Native metadata と context window は保持されます。 |
| OpenAI (API キー) |正確に 8 つの名前空間行: `gpt-5.5`、`gpt-5.6`、Sol/Terra/Luna、および 3 つの `*-pro` 仮想 ID (コンテキスト 1,050,000、8 つすべての最大入力 922,000) |
|オープンルーター | `openrouter/openai/gpt-5.6-sol`、`openrouter/openai/gpt-5.6-terra`、`openrouter/openai/gpt-5.6-luna` (1,050,000) |
|カーソル |静的フォールバックには、`cursor/gpt-5.6-sol`、`cursor/gpt-5.6-terra`、および `cursor/gpt-5.6-luna` (1,000,000)、さらに `cursor/grok-4.5` および `cursor/grok-4.5-fast` (500,000) が含まれます。ライブアカウントの検出により、どれが表示されたままになるかが決まります。 |
Expand Down
2 changes: 1 addition & 1 deletion docs-site/src/content/docs/ja/guides/web-dashboard.md
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ GUI はプロキシの JSON 管理 API を使うシンクライアントです

| エンドポイント | 用途 |
--- | --- |
| `GET` / `PUT /api/settings` | 設定を読むか Codex 自動起動をオン/オフします。 |
| `GET` / `PUT /api/settings` | 設定を読むかCodex 自動起動、ストリームモード、アプリ管理のメモリ予算、account-qualified picker の表示を更新します。picker の変更が保存されても catalog refresh が保留の場合は `catalogRefreshPending: true` を返すため、`ocx sync` で再試行してください。 |
| `GET /api/startup-health` | 秘密情報を含まないルーティング、サービス、shim、再起動安全性診断を読み取ります。 |
| `GET` / `POST /api/windows-tray` | Windows トレイの導入・表示状態を読み取り、`install`、`start`、`stop`、`uninstall` を実行します。 |
| `POST /api/sync` | 共有モデルカタログを再構築し Codex モデルキャッシュを古い状態としてマークします。 |
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -156,16 +156,23 @@ OAuth プロバイダーと API キー プロバイダーの場合、これに
### `ocx account login|reauth|code|cancel ...`

ヘッドレス シェルからブラウザベースまたは手動コードのアカウント認証を実行します。プロバイダー固有のコマンド形式には `ocx account --help` を使用します。
Codex ログインは catalog refresh が保留中でも保存済みです。通常出力では `ocx sync` で再試行するよう警告し、
`--json` の login-status object には代わりに `catalogRefreshPending: true` が含まれる場合があります。

### `ocx account remove <provider> <id|main> --yes [--json]`

この保護された非対話型削除には `--yes` が必要です。削除する前に、ID が存在することが確認されます。 ID が欠落している場合は、DELETE を送信せずに 1 が終了します。メインの Codex App ログインは削除できないため、`remove openai main --yes` は拒否されます。削除後、ファミリーは再度読み取られます。固定された Codex アカウントを削除すると、ピンがクリアされ、自動選択に戻ります。 OAuth は最初に残ったアカウントを昇格させるか、何も報告しません。 API キー プールは、最初に残っているキーを昇格するか、何も報告しません。 `--json` の成功と失敗の形状は次のとおりです。

```text
{ ok: true, provider, id, removedActive: boolean, promotedActiveId: string | null }
{ ok: true, provider, id, removedActive: boolean, promotedActiveId: string | null, catalogRefreshPending?: boolean }
{ error: string } // stderr, exit 1
```

Codex の削除結果には、`false` の場合も `catalogRefreshPending` が必ず含まれます。OAuth と
API-key の削除結果では省略されます。`true` でも削除自体は保存済みで、通常出力では
`ocx sync` で catalog update を再試行するよう警告します。完了した Codex login-status response は
別の形式を使用し、`catalogRefreshPending` は `true` の場合にのみ含まれます。

### `ocx account add-key <provider> [--label <label>] [--json]`

API キー プロバイダーのキーを追加してアクティブ化します。キーは、非 TTY パイプ/リダイレクトされた標準入力からの読み取り専用です。インタラクティブ TTY 入力、空の入力、OAuth/Codex プロバイダー、および API エラー終了 1。キーがラベル内に表示される場合も含め、キーがエコーされることはありません。シークレット マネージャーまたはヒア文字列を使用することをお勧めします。
Expand Down
Loading
Loading