@codexapi/codexclaude 2.0.41 → 2.0.46

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CUSTOMIZATIONS.md CHANGED
@@ -5,10 +5,10 @@
5
5
  ## Runtime
6
6
 
7
7
  - Customer-facing app name: `MagnetAPI.org Codex CLI`
8
- - Local launcher version: `2.0.41`
9
- - Bundled official runtime dependency: `@openai/codex@0.157.1`
8
+ - Local launcher version: `2.0.46`
9
+ - Bundled official runtime dependency: `@openai/codex@0.166.0`
10
10
  - Required install command: `npm install -g @codexapi/codexclaude@latest`
11
- - Hosted fallback archive: `https://codexapi.pro/downloads/codexapi-codexclaude-2.0.41.tgz`, with its SHA-256 sidecar. The updater installs a verified local copy, not an npm remote URL.
11
+ - Hosted fallback archive: `https://codexapi.pro/downloads/codexapi-codexclaude-2.0.46.tgz`, with its SHA-256 sidecar. The updater installs a verified local copy, not an npm remote URL.
12
12
  - Bundled runtime version is managed internally and must not be used for customer update prompts.
13
13
  - Launcher update checks may call the CodexAPI.pro version endpoint and `@codexapi/codexclaude` npm metadata only.
14
14
  - The launcher must never check `@openai/codex` npm metadata or OpenAI GitHub releases for update notices.
@@ -47,15 +47,16 @@ The launcher writes a model provider named `codexapi`:
47
47
 
48
48
  ## Runtime Defaults
49
49
 
50
- - Default model: `gpt-6-sol` displayed as `ChatGPT-6-SOL`; existing installations select it once on upgrade to 2.0.41, then later choices persist.
51
- - Picker order: `gpt-6-sol`, `gpt-6-astra`, `claude-fable-5` (Fable 5.1), `claude-opus-5`, followed by current GPT-5.6, Daybreak and Sonnet variants. GPT-5.5 is absent; Opus 4.8 remains a hidden compatibility entry. Numeric choices are derived from visible order, never stored as stale aliases.
50
+ - Default model: `gpt-6.1-sol` displayed as `ChatGPT 6.1 SOL`; existing installations selected it once on upgrade to 2.0.42, then later choices persist.
51
+ - Picker order: Opus 5.5, SOL 6.1, Argon, DeepSeek Flash, Sol 6, Astra, Fable 5.1, Daybreak, Sonnet 5.5. GPT-5 and 4.6 removed; Opus 4.8 hidden.
52
+ - Argon has Low, Medium and High reasoning, default Medium; context 1,048,576 tokens and maximum output 65,536 tokens. The customer ID is `gemini-4-argon`; `google/gemini-4-argon` normalizes to that public ID.
52
53
  - GPT-6 Sol lists the six officially supported efforts: `none`, `low`, `medium`, `high`, `xhigh`, and `max`. There is no verified GPT-6 Sol `ultra` effort.
53
54
  - Default reasoning effort displayed locally: `Extra High`, stored as `xhigh`; SOL Max and SOL Ultra retain their explicit premium labels.
54
55
  - Reasoning hint written to managed runtime config: model-specific
55
56
  - Approval policy: `never`
56
57
  - Sandbox mode: `danger-full-access`
57
58
  - Display wording for permissions: `Full Access` in launcher-owned copy
58
- - Local model catalog: `~/.codexclaude/model_catalog.json`; this keeps the native `/model` picker limited to the supported choices and prevents fallback metadata warnings for ChatGPT-6 Astra, ChatGPT Daybreak Blue, GPT-5.6 Terra, SOL, SOL Max, SOL Ultra, Opus 5, Opus 4.8, Sonnet 5, and Fable 5.
59
+ - Local model catalog: `~/.codexclaude/model_catalog.json`; descriptions include a timestamped public account snapshot on interactive launch.
59
60
  - Service tier: omitted by default; `/fast` remains user-controlled and billed server-side when active.
60
61
  - TUI status line: `model-with-reasoning`, `fast-mode`, `current-dir`
61
62
  - Fable 5 stays visible to the user while the backend applies its server-managed route and billing policy.
@@ -68,8 +69,8 @@ Before launching the runtime, the launcher calls `/api/v1/wallet/status`, then `
68
69
  Expected status line:
69
70
 
70
71
  ```text
71
- MagnetAPI.org Codex CLI v2.0.41 · ChatGPT-6-SOL Extra High · ~/project · Wallet balance $20.00
72
- Fable 5.1 and ChatGPT-6 Sol are selectable in codexclaude (Sol reasoning through Max). Actual model processing follows your service's routing. Save 10% on API coding usage with codexclaude.
72
+ MagnetAPI.org Codex CLI v2.0.46 · ChatGPT 6.1 SOL Extra High · ~/project · Wallet balance $20.00
73
+ ChatGPT 6.1 SOL and Google Argon 4 are selectable in codexclaude. SOL Extra High is the default. Actual model processing follows your service's routing. Save 15% on API coding usage with codexclaude.
73
74
  ```
74
75
 
75
76
  `bin/splash.js` owns the terminal-only binary graphic and launch classification. Preserve `codexclaude, powered by https://magnetapi.org`, own app version, responsive widths, NO_COLOR, TERM=dumb and explicit opt-outs. No sleeps, clearing, network calls or decorations in headless/JSON/server output. `test/frontier.test.js` checks ordering, legacy visibility, numeric selection and splash behavior. `test/update.test.js` covers local verified fallback and Windows npm resolution.
@@ -82,7 +83,7 @@ When updating the bundled runtime:
82
83
  2. Update `@openai/codex` in `package.json` and `package-lock.json`.
83
84
  3. Bump the launcher package version.
84
85
  4. Keep `APP_DISPLAY_NAME = "MagnetAPI.org Codex CLI"`.
85
- 5. Keep `DEFAULT_MODEL_ID = "gpt-6-sol"` unless product explicitly changes the first-run default.
86
+ 5. Keep `DEFAULT_MODEL_ID = "gpt-6.1-sol"` unless product explicitly changes the first-run default.
86
87
  6. Keep `reasoningEffortForModel()` and model-specific visible reasoning.
87
88
  7. Keep Full Access defaults: `approval_policy = "never"` and `sandbox_mode = "danger-full-access"`.
88
89
  8. Keep `check_for_update_on_startup = false`.
@@ -96,3 +97,5 @@ When updating the bundled runtime:
96
97
  16. Update `README.md`, `CUSTOMIZATIONS.md`, and `codexclaude.md`.
97
98
  17. Run syntax checks, temporary-home setup, alias-preservation tests, `npm pack --dry-run`, and endpoint validation before publishing.
98
99
  18. Keep CLI top-up payment-method collection on Stripe's hosted surface and preserve checkout/confirm polling plus wallet refresh tests.
100
+
101
+ Google Carbon 4 (`gemini-4-carbon`) is a **managed preview**, first in the picker. Native Google Carbon is not yet available through this service. The selection uses the service-selected route and your existing Google model rate card. Your saved model remains selected; new installations still default to ChatGPT 6.1 SOL / Extra High.
package/README.md CHANGED
@@ -1,102 +1,22 @@
1
- # codexclaude
1
+ # codexclaude 2.0.46
2
2
 
3
- `codexclaude` installs the MagnetAPI.org Codex CLI for customers who want one coding client for ChatGPT-6 Sol, ChatGPT-6 Astra, Fable 5.1, Opus 5, Sonnet 5, Daybreak Blue and GPT-5.6 models, using the same Token Wallet.
3
+ Bundles the exact official Codex runtime 0.166.0.
4
4
 
5
- Version `2.0.41` bundles the exact Codex runtime dependency `@openai/codex@0.157.1`. The model picker starts with ChatGPT-6 Sol, Astra, Fable 5.1 and Opus 5. The upgrade selects ChatGPT-6 Sol with Extra High reasoning once for existing installations; subsequent choices remain saved. The release retains four-site authentication, wallet integration, Full Access defaults, local tools, safe configuration merging and managed updates. Model execution follows the API service's Admin routing setting.
6
-
7
- ## Install Or Update
8
-
9
- ```bash
5
+ ```sh
10
6
  npm install -g @codexapi/codexclaude@latest
11
- ```
12
-
13
- This does not delete local session history. The update replaces the `codexclaude` launcher package, refreshes the bundled runtime dependency, and rewrites the managed provider config the next time `codexclaude setup`, `codexclaude login`, or `codexclaude start` runs.
14
-
15
- ## Update Notices
16
-
17
- The launcher checks CodexAPI.pro's managed version endpoint and the `@codexapi/codexclaude` npm package metadata only. It must never check `@openai/codex` npm metadata or OpenAI GitHub releases for customer update prompts.
18
-
19
- The service's release metadata determines the minimum supported version. When an update is required, pressing Enter at `Upgrade Now` installs the exact managed release and restarts the requested action. If npm is unavailable or stale, this release downloads and verifies the hosted package before installing it as a local file. Native `codex` and `claude` commands are never overwritten. Non-interactive commands fail clearly rather than waiting for input.
20
-
21
- ## First Login
22
-
23
- ```bash
24
7
  codexclaude login
25
- ```
26
-
27
- Enter the Dashboard Username or Email Address and password. The launcher can log in to CodexAPI.pro, ChatPlus.chat, MyAPI.world, or MagnetAPI.org, then saves the correct System Token locally, writes `~/.codex/config.toml`, sets Full Access defaults, and lets the customer choose the coding model. If the customer presses Enter at the model prompt, ChatGPT-6 Sol with Extra High reasoning is selected by default.
28
-
29
- ## Start Coding
30
-
31
- ```bash
32
- codexclaude start
33
- ```
34
-
35
- Resume the latest project:
36
-
37
- ```bash
38
- codexclaude resume
39
- ```
40
-
41
- Switch model:
42
-
43
- ```bash
44
8
  codexclaude model
45
- ```
46
-
47
- The first four choices are `ChatGPT-6-SOL`, `ChatGPT-6-Astra`, `Fable 5.1` and `Opus 5`, followed by GPT-5.6, Daybreak Blue, SOL Max, SOL Ultra, SOL, Sonnet 5 and Terra. `codexclaude model`, `models`, `/model` and `/models` open the same launcher selector; the native in-session command remains `/model`. GPT-5.5 is removed from the picker. ChatGPT-6 Sol supports None, Low, Medium, High, Extra High and Max. Opus 4.8 remains hidden as a compatibility entry. Fable 5.1 uses the compatible API id `claude-fable-5`; billing remains server-managed.
48
-
49
- ## Launch Commands
50
-
51
- The npm package owns only the collision-free `codexclaude` command. During a global install, its postinstall step creates optional `codex` and `claude` aliases only when those command names are unused. Native Codex CLI and Claude Code commands are always preserved. This avoids npm `EEXIST` failures and never requires `--force`.
52
-
53
- ```bash
54
9
  codexclaude
55
- codex
56
- claude
57
10
  ```
58
11
 
59
- Show current launcher changes:
60
-
61
- ```bash
62
- codexclaude changelog
63
- ```
12
+ Models in order: Claude Opus 5.5, ChatGPT 6.1 SOL, Google Argon 4, DeepSeek V4.1 Flash, ChatGPT-6 Sol, Astra, Fable 5.1, Daybreak Blue and Sonnet 5.5. GPT-5 and 4.6 options are removed. Removed GPT-5 saved choices migrate to SOL 6.1 and Sonnet 4.6 to Sonnet 5.5; other supported selections and history survive. Opus 4.8 stays hidden solely for compatibility. The default is SOL 6.1/Extra High.
64
13
 
65
- ## Top Up From The CLI
14
+ The model selector refreshes your public Credit Wallet, subscriber five-hour usage, any configured 24-hour limit and real monthly usage. Missing limits show “not configured”; monthly and three-day windows are never mislabeled. Private Token Credit dollar budgets remain hidden.
66
15
 
67
- Start the package selector with either command:
68
-
69
- ```bash
70
- codexclaude topup
71
- codexclaude /topup
72
- ```
73
-
74
- You can also choose a package directly, for example `codexclaude topup 25`. The launcher authenticates with the saved System Token, shows the current wallet, creates a server-authoritative Stripe Checkout session, waits for confirmed payment, and then prints the API Coding Credit added and the refreshed wallet balance.
75
-
76
- Card numbers, CVCs, and bank authentication challenges are entered only on Stripe's secure payment form. They are never read, logged, or stored by `codexclaude`. The terminal can be left waiting while payment is completed; webhook fulfillment still credits a successful purchase if the terminal is closed.
77
-
78
- ## Startup Status
79
-
80
- Before launching the coding runtime, the app prints a compact status line like:
81
-
82
- ```text
83
- codexclaude, powered by https://magnetapi.org
84
- MagnetAPI.org Codex CLI v2.0.41 · ChatGPT-6-SOL Extra High · ~/project · Wallet balance $20.00
85
- Fable 5.1 and ChatGPT-6 Sol are selectable in codexclaude (Sol reasoning through Max). Actual model processing follows your service's routing. Save 10% on API coding usage with codexclaude.
86
- ```
16
+ Unlimited shows Claude only or All Models, minutes:seconds remaining and active, paused, ready-to-start or queued status. These GET-only checks cannot submit a coding pass or activate unused time. A failed lookup shows unavailable rather than a fabricated zero. Billing follows your account’s current routing and rates, including the existing 15% managed-client usage reduction.
87
17
 
88
- Interactive startup includes a gold-and-cyan binary graphic. Narrow terminals use a compact design. `NO_COLOR` and `TERM=dumb` disable color; `CODEXCLAUDE_NO_SPLASH=1` hides the graphic, and `CODEXCLAUDE_QUIET_STATUS=1` hides all launcher startup decoration. Exec/JSON, completion, server protocols, pipes and version/help output never receive splash or wallet text.
18
+ At interactive startup, the native Codex model picker receives a timestamped account snapshot in its model descriptions. Codex 0.166.0 has no model-switch hook or custom status-line command: descriptions are snapshots, not a live countdown. Run `codexclaude model` for a fresh check before a session. Headless protocol output stays clean.
89
19
 
90
- ## Preserved Customizations
20
+ Four-site authentication supports CodexAPI.pro, ChatPlus.chat, MagnetAPI.org and MyAPI.world. Native tools, MCP, skills, hooks, project files and session history remain local. The package owns only its own command and preserves unrelated native configuration. Mandatory managed updates verify the actual installed version, support a checksum-verified hosted fallback, and never require --force.
91
21
 
92
- - Dashboard Username or Email Address plus password login for CodexAPI.pro, ChatPlus.chat, MyAPI.world, and MagnetAPI.org.
93
- - Frontier-first model selection, with ChatGPT-6 Sol/Extra High as the default and one-time upgrade selection.
94
- - Service-specific Responses-compatible provider for the dashboard account that logged in.
95
- - Full Access defaults: approval policy `never` and sandbox mode `danger-full-access`.
96
- - Model-specific visible reasoning in the local UI while the API server keeps upstream runtime effort server-managed.
97
- - A local `~/.codexclaude/model_catalog.json` file so the native `/model` picker lists only the supported MagnetAPI.org Codex CLI choices, including Astra, Terra, SOL Max, and SOL Ultra.
98
- - No default fast service tier. Fast mode is billed only when the user enables it inside the client.
99
- - Token Wallet balance lookup before launch without exposing separate `status` or `usage` launcher commands.
100
- - Authenticated `topup` and `/topup` commands using fixed server-authoritative packages, idempotent Stripe fulfillment, and post-payment wallet refresh.
101
- - Backend-identifying request headers so the API can enforce account and plan rules server-side.
102
- - Direct platform binary launch so the upstream npm wrapper cannot emit OpenAI update prompts.
22
+ Google Carbon 4 (`gemini-4-carbon`) is a **managed preview**, first in the picker. Native Google Carbon is not yet available through this service. The selection uses the service-selected route and your existing Google model rate card. Your saved model remains selected; new installations still default to ChatGPT 6.1 SOL / Extra High.
@@ -0,0 +1,103 @@
1
+ // Customer-visible snapshots only. GET requests never submit coding or activate time.
2
+ import { readFileSync } from 'node:fs';
3
+ import { fileURLToPath } from 'node:url';
4
+ import { homedir } from 'node:os';
5
+ import path from 'node:path';
6
+
7
+ async function readStatus(config, pathname, fetcher) {
8
+ try {
9
+ const response = await fetcher(`${String(config.apiOrigin).replace(/\/+$/, '')}${pathname}`, {
10
+ headers: { authorization: `Bearer ${config.username}`, accept: 'application/json' },
11
+ signal: AbortSignal.timeout(4000), redirect: 'error',
12
+ });
13
+ return response.ok ? await response.json() : null;
14
+ } catch { return null; }
15
+ }
16
+ export async function accountSnapshot(config, fetcher = fetch) {
17
+ const checkedAt = new Date().toISOString();
18
+ const [wallet, subscription, legacy] = await Promise.all([
19
+ readStatus(config, `/api/v1/wallet/status?model=${encodeURIComponent(config.model || '')}`, fetcher),
20
+ readStatus(config, ['magnetapi', 'myapi'].includes(config.serviceId) ? '/api/subscriptions/status' : '/api/v1/subscriptions/status', fetcher),
21
+ readStatus(config, '/api/v1/me', fetcher),
22
+ ]);
23
+ return { wallet, subscription, legacy, checkedAt };
24
+ }
25
+ function numeric(value) {
26
+ if (value === null || value === undefined || value === '' || typeof value === 'boolean') return null;
27
+ const n = Number(value); return Number.isFinite(n) ? n : null;
28
+ }
29
+ function clean(value) { return String(value || '').replace(/[\x00-\x1f\x7f-\x9f]/g, '').slice(0, 160); }
30
+ export function duration(seconds) {
31
+ const value = Math.max(0, Math.floor(numeric(seconds) || 0));
32
+ return `${Math.floor(value / 60)}:${String(value % 60).padStart(2, '0')}`;
33
+ }
34
+ function windowText(label, window) {
35
+ if (!window || window.enabled === false) return `${label}: not configured`;
36
+ const used = numeric(window.usedPercent ?? window.percentUsed);
37
+ const remaining = numeric(window.remainingPercent);
38
+ const percent = used ?? (remaining === null ? null : 100 - remaining);
39
+ return `${label}: ${percent === null ? 'usage unavailable' : `${Math.max(0, Math.min(100, percent)).toFixed(1)}% used`}${window.inFlight ? ' (pass in progress)' : ''}`;
40
+ }
41
+ export function accountLines(snapshot, { model = '', now = Date.now() } = {}) {
42
+ if (!snapshot) return ['Account status unavailable; check your dashboard.'];
43
+ const { wallet, subscription: rawSubscription, legacy } = snapshot;
44
+ const subscription = rawSubscription?.subscription || rawSubscription;
45
+ const user = legacy?.user || {};
46
+ // Credit Wallet is public. Never display private Token Credit dollar budgets.
47
+ const credit = numeric(subscription?.creditWalletBalanceUsd ?? wallet?.walletBalancePreciseUsd ?? wallet?.walletBalanceUsd ?? user.walletBalancePreciseUsd ?? user.walletBalanceUsd);
48
+ const lines = [`Credit Wallet: ${credit === null ? 'unavailable' : `$${credit.toFixed(2)}`}`];
49
+ const fup = legacy?.subscription?.fupMonitor;
50
+ const member = subscription?.active || legacy?.subscription?.isUnlimited;
51
+ if (member) {
52
+ lines.push(windowText('5-hour limit', subscription?.active ? subscription.fiveHourWindow : fup?.fiveHour));
53
+ // Never relabel a monthly or three-day window as a 24-hour allowance.
54
+ const secondary = fup?.secondary;
55
+ const daily = subscription?.twentyFourHourWindow || subscription?.dailyWindow ||
56
+ (/^(24[- ]?(hour|h)|1[- ]?day)$/i.test(secondary?.label || '') ? secondary : null);
57
+ lines.push(windowText('24-hour limit', daily));
58
+ if (subscription?.monthlyWindow?.enabled) lines.push(windowText('Monthly allowance', subscription.monthlyWindow));
59
+ else if (secondary && !daily) lines.push(windowText(`${clean(secondary.label)} limit`, secondary));
60
+ } else if (!subscription && !legacy) lines.push('Subscription limits: unavailable');
61
+ const plans = subscription?.timePlans || [];
62
+ const timers = [];
63
+ for (const plan of plans) {
64
+ const remaining = numeric(plan.remainingSeconds);
65
+ if (plan.available === false || remaining === null || remaining <= 0) continue;
66
+ if (plan.expiresAt && Date.parse(plan.expiresAt) <= now) continue;
67
+ const scope = plan.scope === 'all' ? 'All Models' : plan.scope === 'claude' ? 'Claude only' : clean(plan.scope || 'Unspecified scope');
68
+ const pending = plan.isPending === true || !plan.activatedAt;
69
+ let seconds = remaining;
70
+ if (!plan.paused && !pending) {
71
+ seconds = Math.max(0, remaining - Math.max(0, (now - Date.parse(snapshot.checkedAt)) / 1000));
72
+ if (plan.expiresAt) seconds = Math.min(seconds, Math.max(0, (Date.parse(plan.expiresAt) - now) / 1000));
73
+ }
74
+ const state = plan.paused ? 'paused' : pending ? (plan.queuePosition > 1 ? `queued #${plan.queuePosition}` : 'ready; starts on first pass') : 'active';
75
+ const uncovered = scope === 'Claude only' && model && !/claude|opus|fable|sonnet/i.test(model) ? '; does not cover selected model' : '';
76
+ timers.push(`Unlimited · ${scope} · ${duration(seconds)} remaining · ${state}${uncovered}`);
77
+ }
78
+ // Include existing legacy timers, but never count a membership itself as timed Unlimited.
79
+ for (const timer of wallet?.billingStatus?.unlimited || []) {
80
+ if (timer.scope === 'subscription' || !['running', 'pending', 'paused'].includes(timer.status)) continue;
81
+ const scope = timer.scope === 'global' ? 'All Models' : timer.scope === 'claude' ? 'Claude only' : clean(timer.scope);
82
+ const seconds = timer.status === 'running' && timer.expiresAt ? Math.max(0, (Date.parse(timer.expiresAt) - now) / 1000) : timer.secondsRemaining || timer.pendingSeconds;
83
+ if (!(seconds > 0)) continue;
84
+ const state = timer.status === 'pending' ? 'ready; starts on first pass' : timer.status === 'running' ? 'active' : 'paused';
85
+ timers.push(`Unlimited · ${scope} · ${duration(seconds)} remaining · ${state}`);
86
+ }
87
+ lines.push(...timers);
88
+ if (!timers.length) lines.push(wallet && subscription ? 'Unlimited: no usable timed session' : 'Unlimited status unavailable');
89
+ return lines;
90
+ }
91
+ export function accountHookSettings() {
92
+ const file = fileURLToPath(new URL('./account-hook.js', import.meta.url));
93
+ // Claude's hook runner uses a shell. Quote executable paths without credentials.
94
+ const quote = value => process.platform === 'win32' ? `"${value.replaceAll('"', '')}"` : `'${value.replaceAll("'", "'\\''")}'`;
95
+ return { hooks: { PreModelSwitch: [{ hooks: [{ type: 'command', command: `${quote(process.execPath)} ${quote(file)}`, timeout: 10 }] }] } };
96
+ }
97
+ export async function modelSwitchMessage(event) {
98
+ try {
99
+ const config = JSON.parse(readFileSync(path.join(homedir(), '.claudecodex', 'config.json'), 'utf8'));
100
+ config.model = event.to_model || event.new_model || event.model || config.model;
101
+ return { systemMessage: accountLines(await accountSnapshot(config), { model: config.model }).join('\n') };
102
+ } catch { return { systemMessage: 'Account status unavailable; check your dashboard.' }; }
103
+ }
@@ -11,14 +11,15 @@ import { stdin as input, stdout as output } from "node:process";
11
11
  import { fileURLToPath } from "node:url";
12
12
  import { installSafeCommandAliases } from "../scripts/install-safe-aliases.js";
13
13
  import { renderSplash, isInteractiveLaunch } from "./splash.js";
14
+ import { accountSnapshot, accountLines } from "./account-status.js";
14
15
  import { installedPackage, npmInvocation, performUpdate, releaseTarget } from "./update.js";
15
16
 
16
17
  const require = createRequire(import.meta.url);
17
18
 
18
- const APP_VERSION = "2.0.41";
19
- const CODEX_VERSION = "0.157.1";
19
+ const APP_VERSION = "2.0.46";
20
+ const CODEX_VERSION = "0.166.0";
20
21
  const APP_DISPLAY_NAME = "MagnetAPI.org Codex CLI";
21
- const DEFAULT_MODEL_ID = "gpt-6-sol";
22
+ const DEFAULT_MODEL_ID = "gpt-6.1-sol";
22
23
  const DEFAULT_DISPLAY_REASONING_EFFORT = "xhigh";
23
24
  const DEFAULT_SERVER_REASONING_EFFORT = "xhigh";
24
25
  const API_ORIGIN = (process.env.CODEXCLAUDE_API_ORIGIN || "https://codexapi.pro").replace(/\/+$/, "");
@@ -39,7 +40,7 @@ const CODEX_CONFIG_FILE = path.join(CODEX_DIR, "config.toml");
39
40
  const CODEX_UPDATE_CACHE_FILE = path.join(CODEX_DIR, "version.json");
40
41
  const PROVIDER_ID = "codexapi";
41
42
  const MODEL_CATALOG_CONTEXT_WINDOW = 272000;
42
- const FABLE_ANNOUNCEMENT = "Fable 5.1 and ChatGPT-6 Sol are selectable in codexclaude (Sol reasoning through Max). Actual model processing follows your service's routing. Save 10% on API coding usage with codexclaude.";
43
+ const FABLE_ANNOUNCEMENT = "Google Carbon 4 (Managed preview) is first in the model picker. Native Google Carbon is not yet available through this service; the preview follows the service-selected route and existing Google rate card. ChatGPT 6.1 SOL, Google Argon 4 and DeepSeek V4.1 Flash are selectable in codexclaude. SOL Extra High is the default. Actual model processing follows your service's routing. Save 15% on API coding usage with codexclaude.";
43
44
  const ANSI_GREEN = "\x1b[32m";
44
45
  const ANSI_RESET = "\x1b[0m";
45
46
  const SERVICE_CATALOG = [
@@ -98,6 +99,52 @@ const TOPUP_POLL_INTERVAL_MS = positiveInteger(process.env.CODEXCLAUDE_TOPUP_POL
98
99
  const TOPUP_TIMEOUT_MS = positiveInteger(process.env.CODEXCLAUDE_TOPUP_TIMEOUT_MS, 30 * 60 * 1000);
99
100
 
100
101
  const MODELS = {
102
+ "gemini-4-carbon": {
103
+ id: "gemini-4-carbon",
104
+ label: "Google Carbon 4 (Managed preview)",
105
+ aliases: ["gemini-4-carbon", "google-carbon-4", "gemini-carbon-4", "carbon", "carbon-4"],
106
+ reasoningEffort: "medium",
107
+ contextWindow: 1048576,
108
+ maxOutputTokens: 65536,
109
+ supportedReasoningLevels: SUPPORTED_REASONING_LEVELS.filter(({ effort }) => ["low", "medium", "high"].includes(effort)),
110
+ },
111
+ "claude-opus-5-5": {
112
+ id: "claude-opus-5-5",
113
+ label: "Claude Opus 5.5",
114
+ aliases: ["opus", "opus-5", "opus-5.5", "opus-5-5", "claude", "claude-opus-5", "claude-opus-5.5", "claude-opus-5-5"],
115
+ },
116
+ "gpt-6.1-sol": {
117
+ id: "gpt-6.1-sol",
118
+ label: "ChatGPT 6.1 SOL",
119
+ aliases: ["gpt-6.1-sol", "gpt6.1-sol", "chatgpt-6.1-sol", "sol-6.1"],
120
+ reasoningEffort: "xhigh",
121
+ contextWindow: 1050000,
122
+ maxOutputTokens: 128000,
123
+ supportedReasoningLevels: SOL_REASONING_LEVELS,
124
+ },
125
+ "gemini-4-argon": {
126
+ id: "gemini-4-argon",
127
+ label: "Google Argon 4",
128
+ aliases: ["gemini-4-argon", "google/gemini-4-argon", "google-argon-4", "argon", "argon-4"],
129
+ reasoningEffort: "medium",
130
+ contextWindow: 1048576,
131
+ maxOutputTokens: 65536,
132
+ supportedReasoningLevels: SUPPORTED_REASONING_LEVELS.filter(({ effort }) => ["low", "medium", "high"].includes(effort)),
133
+ },
134
+ "deepseek-flash": {
135
+ id: "deepseek-flash",
136
+ label: "DeepSeek V4.1 Flash",
137
+ aliases: ["deepseek-flash", "deepseek-v4.1-flash", "deepseek-v4.1-flash-1017", "deepseek/deepseek-v4.1-flash", "deepseek-4.1", "deepseek-flash-4.1"],
138
+ reasoningEffort: "high",
139
+ contextWindow: 1048576,
140
+ maxOutputTokens: 393216,
141
+ supportedReasoningLevels: [
142
+ { effort: "none", description: "Disable extended reasoning" },
143
+ { effort: "low", description: "Light reasoning for quick tasks" },
144
+ { effort: "high", description: "DeepSeek default reasoning for coding" },
145
+ { effort: "max", description: "Maximum DeepSeek reasoning effort" },
146
+ ],
147
+ },
101
148
  "gpt-6-sol": {
102
149
  id: "gpt-6-sol",
103
150
  label: "ChatGPT-6-SOL",
@@ -123,40 +170,16 @@ const MODELS = {
123
170
  aliases: ["fable", "fable-5.1", "claude-fable-5.1", "fable-5", "fabel", "fabel-5", "claude-fable-5", "claude-fabel-5"],
124
171
  premium: true,
125
172
  },
126
- "claude-opus-5": {
127
- id: "claude-opus-5",
128
- label: "Opus 5",
129
- aliases: ["opus", "opus-5", "claude", "claude-opus-5"],
130
- },
131
- "gpt-5.6": {
132
- id: "gpt-5.6",
133
- label: "GPT-5.6",
134
- aliases: ["gpt", "gpt-5.6", "chatgpt", "chatgpt-5.6", "gpt56"],
135
- reasoningEffort: "xhigh",
136
- },
137
173
  "gpt-daybreak-blue-latest": {
138
174
  id: "gpt-daybreak-blue-latest",
139
175
  label: "Daybreak Blue - Advanced Security",
140
176
  aliases: ["daybreak", "daybreak-blue", "chatgpt-daybreak-blue", "gpt-daybreak-blue-latest"],
141
177
  reasoningEffort: "xhigh",
142
178
  },
143
- "gpt-5.6-sol-max": {
144
- id: "gpt-5.6-sol-max",
145
- label: "GPT-5.6 SOL Max",
146
- aliases: ["gpt-5.6-sol-max", "gpt-5.6-max", "gpt56-max", "sol-max", "max"],
147
- reasoningEffort: "max",
148
- },
149
- "gpt-5.6-sol-ultra": {
150
- id: "gpt-5.6-sol-ultra",
151
- label: "GPT-5.6 SOL Ultra",
152
- aliases: ["gpt-5.6-sol-ultra", "gpt-5.6-ultra", "gpt56-ultra", "sol-ultra", "ultra"],
153
- reasoningEffort: "ultra",
154
- },
155
- "gpt-5.6-sol": {
156
- id: "gpt-5.6-sol",
157
- label: "GPT-5.6 SOL",
158
- aliases: ["gpt-5.6-sol", "sol"],
159
- reasoningEffort: "xhigh",
179
+ "claude-sonnet-5-5": {
180
+ id: "claude-sonnet-5-5",
181
+ label: "Sonnet 5.5",
182
+ aliases: ["sonnet", "sonnet-5.5", "sonnet-5-5", "claude-sonnet-5-5", "claude-sonnet-5.5"],
160
183
  },
161
184
  "claude-opus-4-8": {
162
185
  id: "claude-opus-4-8",
@@ -164,17 +187,6 @@ const MODELS = {
164
187
  aliases: ["opus-4.8", "opus-4.7", "claude-opus-4-8", "claude-opus-4-7"],
165
188
  legacy: true,
166
189
  },
167
- "claude-sonnet-5": {
168
- id: "claude-sonnet-5",
169
- label: "Sonnet 5",
170
- aliases: ["sonnet", "sonnet-5", "sonnet-4.6", "sonnet-4-6", "claude-sonnet-5", "claude-sonnet-4-6", "claude-sonnet-4.6"],
171
- },
172
- "gpt-5.6-terra": {
173
- id: "gpt-5.6-terra",
174
- label: "GPT-5.6 Terra",
175
- aliases: ["terra", "gpt-5.6-terra", "gpt56-terra"],
176
- reasoningEffort: "xhigh",
177
- },
178
190
  };
179
191
 
180
192
  const PICKER_MODELS = Object.values(MODELS).filter((model) => !model.legacy);
@@ -240,7 +252,7 @@ ${APP_DISPLAY_NAME} v${APP_VERSION}
240
252
 
241
253
  Commands:
242
254
  codexclaude login Login with dashboard username/email and password
243
- codexclaude models Select ChatGPT-6-SOL, Astra, Fable 5.1, Opus 5, or another current model
255
+ codexclaude models Select ChatGPT 6.1 SOL, Google Argon 4, DeepSeek V4.1 Flash, Astra, Fable 5.1, Opus 5, or another current model
244
256
  codexclaude changelog Show the latest CodexAPI.pro launcher changes
245
257
  codexclaude setup Rewrite ~/.codex/config.toml with Full Access defaults
246
258
  codexclaude topup Select an API Coding Credit package and securely complete payment
@@ -305,7 +317,8 @@ async function loginFlow() {
305
317
  };
306
318
  saveConfig(config);
307
319
  writeCodexConfig(config);
308
- console.log(`\nLogged in to ${service.label} as ${apiUsername}. Model: ${MODELS[selectedModel].label}.`);
320
+ console.log(`\nLogged in to ${service.label}. Model: ${MODELS[selectedModel].label}.`);
321
+ console.log(accountLines(await accountSnapshot(config), { model: config.model }).join("\n"));
309
322
  console.log("Full Access permissions, model-specific visible reasoning, and service-specific provider config were written.");
310
323
  } finally {
311
324
  rl.close();
@@ -415,6 +428,9 @@ async function modelFlow() {
415
428
  saveConfig(config);
416
429
  writeCodexConfig(config);
417
430
  console.log(`Model set to ${MODELS[config.model].label}.`);
431
+ const account = await accountSnapshot(config);
432
+ console.log(accountLines(account, { model: config.model }).join("\n"));
433
+ writeModelCatalog(account);
418
434
  } finally {
419
435
  rl.close();
420
436
  }
@@ -993,11 +1009,12 @@ function clearUpstreamUpdateCache() {
993
1009
  }
994
1010
  }
995
1011
 
996
- function writeModelCatalog() {
1012
+ function writeModelCatalog(account = null) {
997
1013
  mkdirSync(CONFIG_DIR, { recursive: true });
998
1014
  const catalog = {
999
1015
  models: [...PICKER_MODELS, ...Object.values(MODELS).filter((model) => model.legacy)]
1000
- .map((model, index) => modelCatalogEntry(model, index)),
1016
+ .map((model, index) => ({ ...modelCatalogEntry(model, index),
1017
+ description: account ? `${accountLines(account, { model: model.id }).join(" · ")} (snapshot ${account.checkedAt}). ${modelCatalogDescription(model.id)}` : modelCatalogDescription(model.id) })),
1001
1018
  };
1002
1019
  writeFileSync(MODEL_CATALOG_FILE, `${JSON.stringify(catalog, null, 2)}\n`, { encoding: "utf8", mode: 0o600 });
1003
1020
  return MODEL_CATALOG_FILE;
@@ -1043,6 +1060,18 @@ function modelCatalogEntry(model, index) {
1043
1060
  }
1044
1061
 
1045
1062
  function modelCatalogDescription(modelId) {
1063
+ if (modelId === "gemini-4-carbon") {
1064
+ return "Managed preview with local coding tools and image input. Native Google Carbon is not yet available through this service. Execution follows your service routing and existing Google rate card.";
1065
+ }
1066
+ if (modelId === "gpt-6.1-sol") {
1067
+ return "ChatGPT 6.1 SOL: coding tools, image input, and Extra High reasoning by default.";
1068
+ }
1069
+ if (modelId === "gemini-4-argon") {
1070
+ return "Google Argon 4 coding route with local coding tools, image input, and Low, Medium or High reasoning.";
1071
+ }
1072
+ if (modelId === "deepseek-flash") {
1073
+ return "DeepSeek V4.1 Flash: local coding tools, image input, and None, Low, High or Max reasoning. Execution follows your service routing.";
1074
+ }
1046
1075
  if (modelId === "gpt-6-sol") {
1047
1076
  return "ChatGPT-6-SOL: coding tools, image input, and reasoning from None through Max.";
1048
1077
  }
@@ -1067,14 +1096,17 @@ function modelCatalogDescription(modelId) {
1067
1096
  if (modelId === "gpt-5.6-terra") {
1068
1097
  return "GPT-5.6 Terra coding route with local coding tools and wallet billing.";
1069
1098
  }
1070
- if (modelId === "claude-opus-5") {
1071
- return "Opus 5 coding route with local coding tools and wallet billing.";
1099
+ if (modelId === "claude-opus-5-5") {
1100
+ return "Claude Opus 5.5 coding route with local coding tools and wallet billing.";
1072
1101
  }
1073
1102
  if (modelId === "claude-opus-4-8") {
1074
1103
  return "Opus 4.8 coding route with local coding tools and wallet billing.";
1075
1104
  }
1076
- if (modelId === "claude-sonnet-5") {
1077
- return "Sonnet 5 coding route with local coding tools and wallet billing.";
1105
+ if (modelId === "claude-sonnet-4-6") {
1106
+ return "Sonnet 4.6 coding route with local coding tools and wallet billing.";
1107
+ }
1108
+ if (modelId === "claude-sonnet-5-5") {
1109
+ return "Sonnet 5.5 coding route with local coding tools and wallet billing.";
1078
1110
  }
1079
1111
  if (modelId === "claude-fable-5") {
1080
1112
  return "Fable 5.1: coding tools and image input, using the compatible Fable 5 API id.";
@@ -1127,6 +1159,9 @@ async function runCodex(args) {
1127
1159
  // Wallet lookup should never block the user from starting a local coding session.
1128
1160
  }
1129
1161
  if (interactive) {
1162
+ const account = await accountSnapshot(config);
1163
+ writeModelCatalog(account);
1164
+ console.log(accountLines(account, { model: config.model }).join("\n"));
1130
1165
  console.log(formatStatusLine(config, wallet, process.cwd()));
1131
1166
  const color = process.env.NO_COLOR === undefined && process.env.TERM !== "dumb";
1132
1167
  console.log(color ? `${ANSI_GREEN}${FABLE_ANNOUNCEMENT}${ANSI_RESET}` : FABLE_ANNOUNCEMENT);
@@ -1291,11 +1326,24 @@ function numericWalletValue(value) {
1291
1326
 
1292
1327
  function formatStatusLine(config, wallet, cwd) {
1293
1328
  const model = modelStatusName(config.model);
1294
- const walletText = wallet ? `Wallet balance ${formatUsd(wallet.balance)}` : "Wallet balance unavailable";
1329
+ const publicBalance = wallet?.raw?.walletBalancePreciseUsd ?? wallet?.raw?.walletBalanceUsd ?? wallet?.raw?.user?.walletBalancePreciseUsd ?? wallet?.raw?.user?.walletBalanceUsd;
1330
+ const walletText = publicBalance !== undefined ? `Credit Wallet ${formatUsd(publicBalance)}` : "Credit Wallet unavailable";
1295
1331
  return `${APP_DISPLAY_NAME} v${APP_VERSION} · ${model} ${displayReasoningEffortForModel(config.model)} · ${formatCwd(cwd)} · ${walletText}`;
1296
1332
  }
1297
1333
 
1298
1334
  function modelStatusName(model) {
1335
+ if (model === "gemini-4-carbon") {
1336
+ return "Google Carbon 4 (Managed preview)";
1337
+ }
1338
+ if (model === "gpt-6.1-sol") {
1339
+ return "ChatGPT 6.1 SOL";
1340
+ }
1341
+ if (model === "gemini-4-argon") {
1342
+ return "Google Argon 4";
1343
+ }
1344
+ if (model === "deepseek-flash") {
1345
+ return "DeepSeek V4.1 Flash";
1346
+ }
1299
1347
  if (model === "gpt-6-sol") {
1300
1348
  return "ChatGPT-6-SOL";
1301
1349
  }
@@ -1320,14 +1368,17 @@ function modelStatusName(model) {
1320
1368
  if (model === "gpt-5.6-terra") {
1321
1369
  return "gpt-5.6-terra";
1322
1370
  }
1323
- if (model === "claude-opus-5") {
1324
- return "Opus 5";
1371
+ if (model === "claude-opus-5-5") {
1372
+ return "Claude Opus 5.5";
1325
1373
  }
1326
1374
  if (model === "claude-opus-4-8") {
1327
1375
  return "opus-4.8";
1328
1376
  }
1329
- if (model === "claude-sonnet-5") {
1330
- return "sonnet-5";
1377
+ if (model === "claude-sonnet-4-6") {
1378
+ return "Sonnet 4.6";
1379
+ }
1380
+ if (model === "claude-sonnet-5-5") {
1381
+ return "Sonnet 5.5";
1331
1382
  }
1332
1383
  if (model === "claude-fable-5") {
1333
1384
  return "fable-5";
@@ -1358,19 +1409,34 @@ function normalizeConfig(config) {
1358
1409
  return config;
1359
1410
  }
1360
1411
  const normalized = { ...config };
1361
- // Apply the 2.0.41 default once for existing installations. A later /model
1412
+ // Apply the 2.0.42 default once for existing installations. A later /model
1362
1413
  // choice remains the customer's explicit selection.
1363
- if (isOlderVersion(config.version || "0.0.0", APP_VERSION)) {
1414
+ if (isOlderVersion(config.version || "0.0.0", "2.0.42")) {
1364
1415
  normalized.model = DEFAULT_MODEL_ID;
1365
1416
  }
1366
- if (["opus", "opus-5", "claude"].includes(normalized.model)) {
1367
- normalized.model = "claude-opus-5";
1417
+ if (["opus", "opus-5", "opus-5.5", "opus-5-5", "claude", "claude-opus-5", "claude-opus-5.5"].includes(normalized.model)) {
1418
+ normalized.model = "claude-opus-5-5";
1368
1419
  }
1369
1420
  if (normalized.model === "claude-opus-4-7") {
1370
1421
  normalized.model = "claude-opus-4-8";
1371
1422
  }
1372
- if (["claude-sonnet-4.6", "claude-sonnet-4-6", "sonnet-4.6", "sonnet-4-6", "sonnet-5"].includes(normalized.model)) {
1373
- normalized.model = "claude-sonnet-5";
1423
+ if (["claude-sonnet-4.6", "sonnet-4.6", "sonnet-4-6"].includes(normalized.model)) {
1424
+ normalized.model = "claude-sonnet-5-5";
1425
+ }
1426
+ if (["claude-sonnet-5.5", "sonnet-5.5", "sonnet-5-5", "sonnet"].includes(normalized.model)) {
1427
+ normalized.model = "claude-sonnet-5-5";
1428
+ }
1429
+ if (["gpt6.1-sol", "chatgpt-6.1-sol", "sol-6.1"].includes(normalized.model)) {
1430
+ normalized.model = "gpt-6.1-sol";
1431
+ }
1432
+ if (["deepseek-v4.1-flash", "deepseek-v4.1-flash-1017", "deepseek/deepseek-v4.1-flash", "deepseek-4.1", "deepseek-flash-4.1"].includes(normalized.model)) {
1433
+ normalized.model = "deepseek-flash";
1434
+ }
1435
+ if (["google-carbon-4", "gemini-carbon-4", "carbon", "carbon-4"].includes(normalized.model)) {
1436
+ normalized.model = "gemini-4-carbon";
1437
+ }
1438
+ if (["google/gemini-4-argon", "google-argon-4", "argon", "argon-4"].includes(normalized.model)) {
1439
+ normalized.model = "gemini-4-argon";
1374
1440
  }
1375
1441
  if (["claude-fabel-5", "fable-5", "fabel-5", "fable-5.1", "claude-fable-5.1"].includes(normalized.model)) {
1376
1442
  normalized.model = "claude-fable-5";
@@ -1407,6 +1473,8 @@ function normalizeConfig(config) {
1407
1473
  ) {
1408
1474
  normalized.model = DEFAULT_MODEL_ID;
1409
1475
  }
1476
+ if (/^gpt-5(?:[.\-]|$)/.test(normalized.model || "")) normalized.model = DEFAULT_MODEL_ID;
1477
+ if (normalized.model === "claude-sonnet-4-6") normalized.model = "claude-sonnet-5-5";
1410
1478
  if (!MODELS[normalized.model]) {
1411
1479
  normalized.model = DEFAULT_MODEL_ID;
1412
1480
  }
package/codexclaude.md CHANGED
@@ -1,9 +1,72 @@
1
+ # Current source: codexclaude 2.0.46 / native Codex 0.166.0
2
+
3
+ Google Carbon 4 (`gemini-4-carbon`) is a managed preview placed first in the picker. It is not native Google Carbon execution. Initial routing is the operator-approved OpenInference destination; admins can change Carbon independently or follow global routing. Existing Google service rates apply. New defaults stay SOL 6.1 / XHigh; saved selections and headless output are preserved. Publication and mandatory-update status must be verified independently.
4
+
5
+ ## Previous source handoff
6
+
7
+ # Current source: 2.0.45 / runtime 0.166.0
8
+
9
+ 31 October: bundles exact official Codex0.166.0. Existing model order,
10
+ SOL6.1/XHigh defaults, saved choices, native tools/MCP/history, four-site login,
11
+ account snapshots and verified updater fallback remain. Google Carbon4 is not
12
+ advertised as available: Google announced restricted partner rollout, its public
13
+ API catalogue and live OpenRouter catalogue do not provide a verified route. Add
14
+ it only after approved real access, capabilities, pricing and useful tool probes.
15
+ This runtime upgrade changes no provider routing or pricing. Publication and
16
+ latest/minimum activation require actual receipts under
17
+ /root/codexapi/output/google-carbon4-20261031; source version alone proves neither.
18
+
19
+ ## Previous release: 2.0.44 / runtime 0.164.0
20
+
21
+ October24: Opus5.5 first, retired GPT5/4.6 picker cleanup and public account status.
22
+ Historical publication evidence: /root/codexapi/output/launchers-20261024/REPORT.md.
23
+
1
24
  # codexclaude Customization Ledger
2
25
 
3
26
  This file is the durable handoff for the `@codexapi/codexclaude` package in `/root/codexclaude`. Read it before updating the bundled coding runtime. The package is a managed launcher around the official runtime dependency, but customer-facing startup, update, model, auth, and setup behavior must stay under MagnetAPI control.
4
27
 
5
28
  ## Current Release
6
29
 
30
+ ### 2026-10-17 DeepSeek V4.1 Flash And Official Codex0.163.0: 2.0.43
31
+
32
+ The exact official runtime dependency is now0.163.0. Picker order starts SOL6.1,
33
+ Argon4, DeepSeekV4.1Flash1017. SOL/Xhigh remains the fresh-install default. The
34
+ one-time default migration threshold stays2.0.42, preserving supported explicit
35
+ choices on this upgrade. DeepSeek uses publicID deepseek-flash, effort high by
36
+ default, none/low/high/max choices. All local permissions, config backups, native
37
+ tools, history/MCP, site authentication and verified hosted fallback remain.
38
+ 39 launcher checks passed before packaging. Npm publication is not claimed;
39
+ immutable hosted archive/checksum is the supported release channel until separately
40
+ verified. Production routing, rates and useful generation must be checked against
41
+ STATE, not inferred from launcher metadata.
42
+
43
+ ### 2026-10-14 Argon And SOL 6.1 Selection: 2.0.42
44
+
45
+ Version 2.0.42 retains exact `@openai/codex@0.157.1`; this is a launcher-only
46
+ release. The first selection is ChatGPT 6.1 SOL (`gpt-6.1-sol`) with Extra High
47
+ (`xhigh`) reasoning, followed by Google Argon 4 (`gemini-4-argon`). The previous
48
+ `gpt-6-sol` choice and all other existing non-Sonnet-5 entries remain selectable.
49
+ Exact Sonnet 5 is removed; Sonnet 4.6 and Sonnet 5.5 have separate choices and
50
+ aliases. Do not collapse their client IDs into Sonnet 5.
51
+
52
+ Argon defaults to Medium, lists Low/Medium/High efforts, and advertises the
53
+ verified 1,048,576-token context and 65,536 maximum response output. Do not
54
+ advertise long-decode support. `google/gemini-4-argon` is accepted as a user-input
55
+ alias, while generated client requests retain public ID `gemini-4-argon`.
56
+ Execution and billing stay server-managed. The launcher does not select a provider.
57
+ The first upgrade to 2.0.42 applies SOL/Xhigh once; subsequent explicit supported
58
+ selections persist. Existing exact Sonnet 5 selections fall back to the new default.
59
+
60
+ Startup copy now accurately says 15% managed coding savings. Full Access, native
61
+ tools, four-site authentication, wallets/top-up, safe TOML merges, model headers,
62
+ headless clean output, native-safe aliases and verified updater fallback remain.
63
+ Release publication and endpoint promotion must be established by fresh receipts,
64
+ not inferred from this source version. Do not repack earlier published archives.
65
+ See `/root/codexapi/output/codexclaude-argon-2042-20261014/REPORT.md` for the exact
66
+ new archive hash, hosting receipt, test evidence and rollback.
67
+
68
+ ## Historical Release Snapshots
69
+
7
70
  ### 2026-09-26 Sol And Runtime Update: 2.0.41
8
71
 
9
72
  Version 2.0.41 bundles exact `@openai/codex@0.157.1`. The local and API
@@ -15,8 +78,9 @@ from the picker. The server executes according to saved Admin global routing;
15
78
  the launcher never chooses a provider. Fable 5.1 and Sol are announced as
16
79
  selectable models, with execution determined by that routing.
17
80
  Official GPT-6 Sol documentation does not list Ultra; do not advertise an Ultra
18
- effort until a distinct, verified route exists. Version metadata, hosted archive,
19
- registry publication and mandatory minimum must be verified in that order.
81
+ effort until a distinct, verified route exists. Npm, hosted archive, three-region metadata and mandatory minimum were
82
+ verified live September 26. The isolated 2.0.40-to-2.0.41 upgrade relaunched
83
+ successfully. No saved routing or rate changed.
20
84
 
21
85
  ## Previous Releases
22
86
 
@@ -131,55 +195,28 @@ Run `npm test`, including the real-launcher configuration-preservation tests.
131
195
  - Generated model catalog: `~/.codexclaude/model_catalog.json`
132
196
  - Upstream update cache removed before setup: `~/.codex/version.json`
133
197
 
134
- ## Current Customer Behavior (2.0.41)
198
+ ## Current Customer Behavior (2.0.43)
135
199
 
136
- The launcher must present itself as:
200
+ The launcher identifies itself as `MagnetAPI.org Codex CLI v2.0.43`.
201
+ Normal interactive startup shows:
137
202
 
138
203
  ```text
139
- MagnetAPI.org Codex CLI v2.0.41
204
+ MagnetAPI.org Codex CLI v2.0.43 · ChatGPT 6.1 SOL Extra High · ~/project · Wallet balance $20.00
205
+ ChatGPT 6.1 SOL and Google Argon 4 are selectable in codexclaude. SOL Extra High is the default. Actual model processing follows your service's routing. Save 15% on API coding usage with codexclaude.
140
206
  ```
141
207
 
142
- Normal pre-launch status should look like:
143
-
144
- ```text
145
- MagnetAPI.org Codex CLI v2.0.41 · ChatGPT-6-SOL Extra High · ~/project · Wallet balance $20.00
146
- Fable 5.1 and ChatGPT-6 Sol are selectable in codexclaude (Sol reasoning through Max). Actual model processing follows your service's routing. Save 10% on API coding usage with codexclaude.
147
- ```
208
+ The generated local native model catalogue places `gpt-6.1-sol` first and
209
+ `gemini-4-argon` second. Retained visible IDs: `gpt-6-sol`, `gpt-6-astra`,
210
+ `claude-fable-5`, `claude-opus-5`, `gpt-5.6`, `gpt-daybreak-blue-latest`,
211
+ `gpt-5.6-sol-max`, `gpt-5.6-sol-ultra`, `gpt-5.6-sol`, `claude-sonnet-4-6`,
212
+ `claude-sonnet-5-5` and `gpt-5.6-terra`. `claude-opus-4-8` stays hidden for
213
+ compatibility. There is no `claude-sonnet-5` local catalogue entry or picker alias.
148
214
 
149
- Do not show OpenAI update notices, OpenAI npm install commands, OpenAI release links, or the upstream runtime version in launcher-owned output. The package still depends on the official runtime internally, but the customer update surface is ours.
150
-
151
- The launcher command `codexclaude model` must list these customer-visible models:
152
-
153
- - `gpt-6-sol` displayed as `ChatGPT-6-SOL`, selected by default for new configurations and once on upgrade from an older launcher
154
- - `gpt-6-astra` displayed as `ChatGPT-6-Astra`
155
- - `claude-fable-5` displayed as `Fable 5.1`
156
- - `claude-opus-5` displayed as `Opus 5`
157
- - `gpt-5.6` displayed as `GPT-5.6`
158
- - `gpt-daybreak-blue-latest` displayed as `Daybreak Blue - Advanced Security`
159
- - `gpt-5.6-sol-max` displayed as `GPT-5.6 SOL Max`
160
- - `gpt-5.6-sol-ultra` displayed as `GPT-5.6 SOL Ultra`
161
- - `gpt-5.6-sol` displayed as `GPT-5.6 SOL`
162
- - `claude-sonnet-5` displayed as `Sonnet 5`
163
- - `gpt-5.6-terra` displayed as `GPT-5.6 Terra`
164
-
165
- `gpt-5.5` is absent from the picker. `claude-opus-4-8` remains hidden for
166
- compatibility with older saved sessions.
167
-
168
- ChatGPT-6 Sol supports `none`, `low`, `medium`, `high`, `xhigh`, and `max`
169
- reasoning. Astra supports `low`, `medium`, `high`, `xhigh`, and `max`.
170
- Both have a 1,050,000-token context window and 128,000 maximum output tokens
171
- in the managed catalog. The launcher displays a billing notice when Astra is
172
- selected. Native signed-in Astra usage is charged at 2x the normal Codex rate;
173
- when its dedicated route follows Global Cross-Model Routing, normal billing
174
- for that route applies.
175
-
176
- ChatGPT-6 Sol is the default for new and invalid configurations. On the first
177
- 2.0.41 launch, an older saved configuration selects Sol/Extra High once;
178
- subsequent explicit customer selections persist. The generated runtime config
179
- stores `xhigh` for Extra High. Keep the selected model slug in
180
- `~/.codex/config.toml`; do not silently substitute a provider locally.
181
- `gpt-5.6-sol-max` and `gpt-5.6-sol-ultra` remain distinct customer choices
182
- with their own usage display and wallet billing.
215
+ New/invalid configuration defaults to SOL/Xhigh. First upgrade applies it once;
216
+ subsequent model choices remain saved. Argon selection writes Medium reasoning.
217
+ Local client tools remain local; the service controls execution routes and accurate
218
+ billing. Native Astra retains its dedicated 2x billing notice. The runtime stays
219
+ 0.163.0. Do not modify real SDK/package/license identifiers or native binary text.
183
220
 
184
221
  ## Update Policy
185
222
 
@@ -188,7 +225,7 @@ with their own usage display and wallet billing.
188
225
  - `https://codexapi.pro/api/v1/codexclaude/version`
189
226
  - `https://registry.npmjs.org/@codexapi%2Fcodexclaude/latest`
190
227
 
191
- It must not check `@openai/codex` npm metadata, OpenAI GitHub releases, or any upstream OpenAI update endpoint. Raise the latest and enforced minimum to `2.0.41` only after the exact npm archive and hosted fallback are published and verified. Compatible older launchers offer an interactive `Upgrade Now` action; pressing Enter invokes `npm install -g @codexapi/codexclaude@latest` without shell interpolation. If that registry install fails, the launcher automatically tries the hosted tarball. Non-interactive terminals print the exact update command and exit instead of waiting for input. After a successful interactive update, the launcher starts the requested action again automatically.
228
+ It must not check `@openai/codex` npm metadata, OpenAI GitHub releases, or any upstream OpenAI update endpoint. Raise the latest and enforced minimum to `2.0.43` only after the exact npm archive and hosted fallback are published and verified. Compatible older launchers offer an interactive `Upgrade Now` action; pressing Enter invokes `npm install -g @codexapi/codexclaude@latest` without shell interpolation. If that registry install fails, the launcher automatically tries the hosted tarball. Non-interactive terminals print the exact update command and exit instead of waiting for input. After a successful interactive update, the launcher starts the requested action again automatically.
192
229
 
193
230
  The npm package manifest owns only `codexclaude`. This is deliberate: npm creates manifest binaries before postinstall, so claiming `codex` there causes an `EEXIST` upgrade failure on machines with native Codex CLI. During a global installation, postinstall may create optional `codex` and `claude` aliases only when neither the target npm prefix nor any directory on `PATH` already contains the command. Existing native clients are preserved and no install path requires `--force`.
194
231
 
@@ -207,7 +244,7 @@ Never work around a Homebrew lock by deleting files under `Cellar`, removing Hom
207
244
  `bin/codexclaude.js` must rewrite `~/.codex/config.toml` before every coding session. Preserve this top-level shape:
208
245
 
209
246
  ```toml
210
- model = "gpt-6-sol"
247
+ model = "gpt-6.1-sol"
211
248
  model_catalog_json = "<absolute path to ~/.codexclaude/model_catalog.json>"
212
249
  preferred_auth_method = "apikey"
213
250
  model_provider = "codexapi"
@@ -224,7 +261,7 @@ base_url = "<service Responses URL>"
224
261
  experimental_bearer_token = "<customer System Token/API username>"
225
262
  wire_api = "responses"
226
263
  supports_websockets = false
227
- http_headers = { "X-CodexAPI-Client" = "codexclaude", "X-CodexAPI-Client-Version" = "2.0.41", "X-CodexAPI-Selected-Model" = "<selected model>" }
264
+ http_headers = { "X-CodexAPI-Client" = "codexclaude", "X-CodexAPI-Client-Version" = "2.0.43", "X-CodexAPI-Selected-Model" = "<selected model>" }
228
265
 
229
266
  [tui]
230
267
  status_line = ["model-with-reasoning", "fast-mode", "current-dir"]
@@ -233,7 +270,7 @@ terminal_title = ["project-name", "model-with-reasoning", "run-state"]
233
270
  ```
234
271
 
235
272
  The generated model catalog must contain full metadata for every supported slug,
236
- including `gpt-6-sol`, `gpt-6-astra`, `gpt-daybreak-blue-latest`, `gpt-5.6`,
273
+ including `gpt-6.1-sol`, `gemini-4-argon`, `gpt-6-sol`, `gpt-6-astra`, `gpt-daybreak-blue-latest`, `gpt-5.6`,
237
274
  `gpt-5.6-terra`, `gpt-5.6-sol-max`, and `gpt-5.6-sol-ultra`. This prevents
238
275
  fallback metadata warnings such as:
239
276
 
@@ -289,7 +326,7 @@ When updating the bundled runtime dependency:
289
326
  3. Bump `package.json` and `package-lock.json` to a new `@codexapi/codexclaude` version.
290
327
  4. Update `APP_VERSION` and `CODEX_VERSION` in `bin/codexclaude.js`.
291
328
  5. Preserve `APP_DISPLAY_NAME = "MagnetAPI.org Codex CLI"`.
292
- 6. Preserve `DEFAULT_MODEL_ID = "gpt-6-sol"` unless product explicitly changes the first-run default.
329
+ 6. Preserve `DEFAULT_MODEL_ID = "gpt-6.1-sol"` unless product explicitly changes the first-run default.
293
330
  7. Preserve `DEFAULT_DISPLAY_REASONING_EFFORT = "xhigh"` and `DEFAULT_SERVER_REASONING_EFFORT = "xhigh"` unless operations explicitly changes the launcher-visible contract.
294
331
  8. Preserve Full Access defaults and the local model catalog.
295
332
  9. Preserve direct platform-native binary launch.
@@ -333,7 +370,7 @@ HOME="$tmp_home" CODEXCLAUDE_DISABLE_UPDATE_CHECK=1 CODEXCLAUDE_QUIET_STATUS=1 n
333
370
 
334
371
  Verify the generated config contains:
335
372
 
336
- - `model = "gpt-6-sol"` after the one-time 2.0.41 migration
373
+ - `model = "gpt-6.1-sol"` after the one-time 2.0.42 migration
337
374
  - `model_reasoning_effort = "xhigh"`
338
375
  - `check_for_update_on_startup = false`
339
376
  - `approval_policy = "never"`
@@ -343,6 +380,8 @@ Verify the generated config contains:
343
380
  Verify the generated model catalog contains these visible choices in launcher
344
381
  order (and the hidden Opus 4.8 compatibility entry):
345
382
 
383
+ - `gpt-6.1-sol`
384
+ - `gemini-4-argon`
346
385
  - `gpt-6-sol`
347
386
  - `gpt-6-astra`
348
387
  - `claude-fable-5`
@@ -352,19 +391,21 @@ order (and the hidden Opus 4.8 compatibility entry):
352
391
  - `gpt-5.6-sol-max`
353
392
  - `gpt-5.6-sol-ultra`
354
393
  - `gpt-5.6-sol`
355
- - `claude-sonnet-5`
394
+ - `claude-sonnet-4-6`
395
+ - `claude-sonnet-5-5`
356
396
  - `gpt-5.6-terra`
357
397
 
358
- After npm publication and hosted-archive verification, promote the release
398
+ After immutable hosted-archive verification (and npm publication when authorized
399
+ and available), promote the release
359
400
  metadata and mandatory minimum one region at a time, then verify:
360
401
 
361
402
  ```bash
362
403
  curl -fsS "https://codexapi.pro/api/v1/codexclaude/version?current=2.0.17"
363
- curl -fsSI "https://codexapi.pro/downloads/codexapi-codexclaude-2.0.41.tgz"
404
+ curl -fsSI "https://codexapi.pro/downloads/codexapi-codexclaude-2.0.43.tgz"
364
405
  ```
365
406
 
366
- Once promoted, the version endpoint must report `latestVersion = 2.0.41`,
367
- `minimumVersion = 2.0.41`, and `updateRequired = true` for every older client.
407
+ Once promoted, the version endpoint must report `latestVersion = 2.0.43`,
408
+ `minimumVersion = 2.0.43`, and `updateRequired = true` for every older client.
368
409
 
369
410
  ## Version 2.0.37 Changes
370
411
 
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@codexapi/codexclaude",
3
- "version": "2.0.41",
4
- "description": "MagnetAPI.org Codex CLI for ChatGPT-6 Sol, Astra, Fable 5.1, Opus 5, Sonnet 5 and Daybreak Blue.",
3
+ "version": "2.0.46",
4
+ "description": "MagnetAPI.org Codex CLI for ChatGPT 6.1 SOL, Google Argon 4, DeepSeek V4.1 Flash, Astra, Fable 5.1, Opus 5, Sonnet and Daybreak Blue.",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",
7
7
  "bin": {
@@ -23,7 +23,7 @@
23
23
  },
24
24
  "dependencies": {
25
25
  "@iarna/toml": "2.2.5",
26
- "@openai/codex": "0.157.1"
26
+ "@openai/codex": "0.166.0"
27
27
  },
28
28
  "publishConfig": {
29
29
  "access": "public"