@codexapi/codexclaude 2.0.41 → 2.0.44

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.44`
9
+ - Bundled official runtime dependency: `@openai/codex@0.164.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.44.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.44 · 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`.
package/README.md CHANGED
@@ -1,102 +1,20 @@
1
- # codexclaude
1
+ # codexclaude 2.0.44
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.164.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
- ```
58
-
59
- Show current launcher changes:
60
-
61
- ```bash
62
- codexclaude changelog
63
10
  ```
64
11
 
65
- ## Top Up From The CLI
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.
66
13
 
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
- ```
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.
87
15
 
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.
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.
89
17
 
90
- ## Preserved Customizations
18
+ At interactive startup, the native Codex model picker receives a timestamped account snapshot in its model descriptions. Codex 0.164.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.
91
19
 
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.
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.
@@ -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.44";
20
+ const CODEX_VERSION = "0.164.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 = "Claude Opus 5.5 is first in the model picker. 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,43 @@ 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
+ "claude-opus-5-5": {
103
+ id: "claude-opus-5-5",
104
+ label: "Claude Opus 5.5",
105
+ aliases: ["opus", "opus-5", "opus-5.5", "opus-5-5", "claude", "claude-opus-5", "claude-opus-5.5", "claude-opus-5-5"],
106
+ },
107
+ "gpt-6.1-sol": {
108
+ id: "gpt-6.1-sol",
109
+ label: "ChatGPT 6.1 SOL",
110
+ aliases: ["gpt-6.1-sol", "gpt6.1-sol", "chatgpt-6.1-sol", "sol-6.1"],
111
+ reasoningEffort: "xhigh",
112
+ contextWindow: 1050000,
113
+ maxOutputTokens: 128000,
114
+ supportedReasoningLevels: SOL_REASONING_LEVELS,
115
+ },
116
+ "gemini-4-argon": {
117
+ id: "gemini-4-argon",
118
+ label: "Google Argon 4",
119
+ aliases: ["gemini-4-argon", "google/gemini-4-argon", "google-argon-4", "argon", "argon-4"],
120
+ reasoningEffort: "medium",
121
+ contextWindow: 1048576,
122
+ maxOutputTokens: 65536,
123
+ supportedReasoningLevels: SUPPORTED_REASONING_LEVELS.filter(({ effort }) => ["low", "medium", "high"].includes(effort)),
124
+ },
125
+ "deepseek-flash": {
126
+ id: "deepseek-flash",
127
+ label: "DeepSeek V4.1 Flash",
128
+ aliases: ["deepseek-flash", "deepseek-v4.1-flash", "deepseek-v4.1-flash-1017", "deepseek/deepseek-v4.1-flash", "deepseek-4.1", "deepseek-flash-4.1"],
129
+ reasoningEffort: "high",
130
+ contextWindow: 1048576,
131
+ maxOutputTokens: 393216,
132
+ supportedReasoningLevels: [
133
+ { effort: "none", description: "Disable extended reasoning" },
134
+ { effort: "low", description: "Light reasoning for quick tasks" },
135
+ { effort: "high", description: "DeepSeek default reasoning for coding" },
136
+ { effort: "max", description: "Maximum DeepSeek reasoning effort" },
137
+ ],
138
+ },
101
139
  "gpt-6-sol": {
102
140
  id: "gpt-6-sol",
103
141
  label: "ChatGPT-6-SOL",
@@ -123,40 +161,16 @@ const MODELS = {
123
161
  aliases: ["fable", "fable-5.1", "claude-fable-5.1", "fable-5", "fabel", "fabel-5", "claude-fable-5", "claude-fabel-5"],
124
162
  premium: true,
125
163
  },
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
164
  "gpt-daybreak-blue-latest": {
138
165
  id: "gpt-daybreak-blue-latest",
139
166
  label: "Daybreak Blue - Advanced Security",
140
167
  aliases: ["daybreak", "daybreak-blue", "chatgpt-daybreak-blue", "gpt-daybreak-blue-latest"],
141
168
  reasoningEffort: "xhigh",
142
169
  },
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",
170
+ "claude-sonnet-5-5": {
171
+ id: "claude-sonnet-5-5",
172
+ label: "Sonnet 5.5",
173
+ aliases: ["sonnet", "sonnet-5.5", "sonnet-5-5", "claude-sonnet-5-5", "claude-sonnet-5.5"],
160
174
  },
161
175
  "claude-opus-4-8": {
162
176
  id: "claude-opus-4-8",
@@ -164,17 +178,6 @@ const MODELS = {
164
178
  aliases: ["opus-4.8", "opus-4.7", "claude-opus-4-8", "claude-opus-4-7"],
165
179
  legacy: true,
166
180
  },
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
181
  };
179
182
 
180
183
  const PICKER_MODELS = Object.values(MODELS).filter((model) => !model.legacy);
@@ -240,7 +243,7 @@ ${APP_DISPLAY_NAME} v${APP_VERSION}
240
243
 
241
244
  Commands:
242
245
  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
246
+ 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
247
  codexclaude changelog Show the latest CodexAPI.pro launcher changes
245
248
  codexclaude setup Rewrite ~/.codex/config.toml with Full Access defaults
246
249
  codexclaude topup Select an API Coding Credit package and securely complete payment
@@ -305,7 +308,8 @@ async function loginFlow() {
305
308
  };
306
309
  saveConfig(config);
307
310
  writeCodexConfig(config);
308
- console.log(`\nLogged in to ${service.label} as ${apiUsername}. Model: ${MODELS[selectedModel].label}.`);
311
+ console.log(`\nLogged in to ${service.label}. Model: ${MODELS[selectedModel].label}.`);
312
+ console.log(accountLines(await accountSnapshot(config), { model: config.model }).join("\n"));
309
313
  console.log("Full Access permissions, model-specific visible reasoning, and service-specific provider config were written.");
310
314
  } finally {
311
315
  rl.close();
@@ -415,6 +419,9 @@ async function modelFlow() {
415
419
  saveConfig(config);
416
420
  writeCodexConfig(config);
417
421
  console.log(`Model set to ${MODELS[config.model].label}.`);
422
+ const account = await accountSnapshot(config);
423
+ console.log(accountLines(account, { model: config.model }).join("\n"));
424
+ writeModelCatalog(account);
418
425
  } finally {
419
426
  rl.close();
420
427
  }
@@ -993,11 +1000,12 @@ function clearUpstreamUpdateCache() {
993
1000
  }
994
1001
  }
995
1002
 
996
- function writeModelCatalog() {
1003
+ function writeModelCatalog(account = null) {
997
1004
  mkdirSync(CONFIG_DIR, { recursive: true });
998
1005
  const catalog = {
999
1006
  models: [...PICKER_MODELS, ...Object.values(MODELS).filter((model) => model.legacy)]
1000
- .map((model, index) => modelCatalogEntry(model, index)),
1007
+ .map((model, index) => ({ ...modelCatalogEntry(model, index),
1008
+ description: account ? `${accountLines(account, { model: model.id }).join(" · ")} (snapshot ${account.checkedAt}). ${modelCatalogDescription(model.id)}` : modelCatalogDescription(model.id) })),
1001
1009
  };
1002
1010
  writeFileSync(MODEL_CATALOG_FILE, `${JSON.stringify(catalog, null, 2)}\n`, { encoding: "utf8", mode: 0o600 });
1003
1011
  return MODEL_CATALOG_FILE;
@@ -1043,6 +1051,15 @@ function modelCatalogEntry(model, index) {
1043
1051
  }
1044
1052
 
1045
1053
  function modelCatalogDescription(modelId) {
1054
+ if (modelId === "gpt-6.1-sol") {
1055
+ return "ChatGPT 6.1 SOL: coding tools, image input, and Extra High reasoning by default.";
1056
+ }
1057
+ if (modelId === "gemini-4-argon") {
1058
+ return "Google Argon 4 coding route with local coding tools, image input, and Low, Medium or High reasoning.";
1059
+ }
1060
+ if (modelId === "deepseek-flash") {
1061
+ return "DeepSeek V4.1 Flash: local coding tools, image input, and None, Low, High or Max reasoning. Execution follows your service routing.";
1062
+ }
1046
1063
  if (modelId === "gpt-6-sol") {
1047
1064
  return "ChatGPT-6-SOL: coding tools, image input, and reasoning from None through Max.";
1048
1065
  }
@@ -1067,14 +1084,17 @@ function modelCatalogDescription(modelId) {
1067
1084
  if (modelId === "gpt-5.6-terra") {
1068
1085
  return "GPT-5.6 Terra coding route with local coding tools and wallet billing.";
1069
1086
  }
1070
- if (modelId === "claude-opus-5") {
1071
- return "Opus 5 coding route with local coding tools and wallet billing.";
1087
+ if (modelId === "claude-opus-5-5") {
1088
+ return "Claude Opus 5.5 coding route with local coding tools and wallet billing.";
1072
1089
  }
1073
1090
  if (modelId === "claude-opus-4-8") {
1074
1091
  return "Opus 4.8 coding route with local coding tools and wallet billing.";
1075
1092
  }
1076
- if (modelId === "claude-sonnet-5") {
1077
- return "Sonnet 5 coding route with local coding tools and wallet billing.";
1093
+ if (modelId === "claude-sonnet-4-6") {
1094
+ return "Sonnet 4.6 coding route with local coding tools and wallet billing.";
1095
+ }
1096
+ if (modelId === "claude-sonnet-5-5") {
1097
+ return "Sonnet 5.5 coding route with local coding tools and wallet billing.";
1078
1098
  }
1079
1099
  if (modelId === "claude-fable-5") {
1080
1100
  return "Fable 5.1: coding tools and image input, using the compatible Fable 5 API id.";
@@ -1127,6 +1147,9 @@ async function runCodex(args) {
1127
1147
  // Wallet lookup should never block the user from starting a local coding session.
1128
1148
  }
1129
1149
  if (interactive) {
1150
+ const account = await accountSnapshot(config);
1151
+ writeModelCatalog(account);
1152
+ console.log(accountLines(account, { model: config.model }).join("\n"));
1130
1153
  console.log(formatStatusLine(config, wallet, process.cwd()));
1131
1154
  const color = process.env.NO_COLOR === undefined && process.env.TERM !== "dumb";
1132
1155
  console.log(color ? `${ANSI_GREEN}${FABLE_ANNOUNCEMENT}${ANSI_RESET}` : FABLE_ANNOUNCEMENT);
@@ -1291,11 +1314,21 @@ function numericWalletValue(value) {
1291
1314
 
1292
1315
  function formatStatusLine(config, wallet, cwd) {
1293
1316
  const model = modelStatusName(config.model);
1294
- const walletText = wallet ? `Wallet balance ${formatUsd(wallet.balance)}` : "Wallet balance unavailable";
1317
+ const publicBalance = wallet?.raw?.walletBalancePreciseUsd ?? wallet?.raw?.walletBalanceUsd ?? wallet?.raw?.user?.walletBalancePreciseUsd ?? wallet?.raw?.user?.walletBalanceUsd;
1318
+ const walletText = publicBalance !== undefined ? `Credit Wallet ${formatUsd(publicBalance)}` : "Credit Wallet unavailable";
1295
1319
  return `${APP_DISPLAY_NAME} v${APP_VERSION} · ${model} ${displayReasoningEffortForModel(config.model)} · ${formatCwd(cwd)} · ${walletText}`;
1296
1320
  }
1297
1321
 
1298
1322
  function modelStatusName(model) {
1323
+ if (model === "gpt-6.1-sol") {
1324
+ return "ChatGPT 6.1 SOL";
1325
+ }
1326
+ if (model === "gemini-4-argon") {
1327
+ return "Google Argon 4";
1328
+ }
1329
+ if (model === "deepseek-flash") {
1330
+ return "DeepSeek V4.1 Flash";
1331
+ }
1299
1332
  if (model === "gpt-6-sol") {
1300
1333
  return "ChatGPT-6-SOL";
1301
1334
  }
@@ -1320,14 +1353,17 @@ function modelStatusName(model) {
1320
1353
  if (model === "gpt-5.6-terra") {
1321
1354
  return "gpt-5.6-terra";
1322
1355
  }
1323
- if (model === "claude-opus-5") {
1324
- return "Opus 5";
1356
+ if (model === "claude-opus-5-5") {
1357
+ return "Claude Opus 5.5";
1325
1358
  }
1326
1359
  if (model === "claude-opus-4-8") {
1327
1360
  return "opus-4.8";
1328
1361
  }
1329
- if (model === "claude-sonnet-5") {
1330
- return "sonnet-5";
1362
+ if (model === "claude-sonnet-4-6") {
1363
+ return "Sonnet 4.6";
1364
+ }
1365
+ if (model === "claude-sonnet-5-5") {
1366
+ return "Sonnet 5.5";
1331
1367
  }
1332
1368
  if (model === "claude-fable-5") {
1333
1369
  return "fable-5";
@@ -1358,19 +1394,31 @@ function normalizeConfig(config) {
1358
1394
  return config;
1359
1395
  }
1360
1396
  const normalized = { ...config };
1361
- // Apply the 2.0.41 default once for existing installations. A later /model
1397
+ // Apply the 2.0.42 default once for existing installations. A later /model
1362
1398
  // choice remains the customer's explicit selection.
1363
- if (isOlderVersion(config.version || "0.0.0", APP_VERSION)) {
1399
+ if (isOlderVersion(config.version || "0.0.0", "2.0.42")) {
1364
1400
  normalized.model = DEFAULT_MODEL_ID;
1365
1401
  }
1366
- if (["opus", "opus-5", "claude"].includes(normalized.model)) {
1367
- normalized.model = "claude-opus-5";
1402
+ if (["opus", "opus-5", "opus-5.5", "opus-5-5", "claude", "claude-opus-5", "claude-opus-5.5"].includes(normalized.model)) {
1403
+ normalized.model = "claude-opus-5-5";
1368
1404
  }
1369
1405
  if (normalized.model === "claude-opus-4-7") {
1370
1406
  normalized.model = "claude-opus-4-8";
1371
1407
  }
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";
1408
+ if (["claude-sonnet-4.6", "sonnet-4.6", "sonnet-4-6"].includes(normalized.model)) {
1409
+ normalized.model = "claude-sonnet-5-5";
1410
+ }
1411
+ if (["claude-sonnet-5.5", "sonnet-5.5", "sonnet-5-5", "sonnet"].includes(normalized.model)) {
1412
+ normalized.model = "claude-sonnet-5-5";
1413
+ }
1414
+ if (["gpt6.1-sol", "chatgpt-6.1-sol", "sol-6.1"].includes(normalized.model)) {
1415
+ normalized.model = "gpt-6.1-sol";
1416
+ }
1417
+ 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)) {
1418
+ normalized.model = "deepseek-flash";
1419
+ }
1420
+ if (["google/gemini-4-argon", "google-argon-4", "argon", "argon-4"].includes(normalized.model)) {
1421
+ normalized.model = "gemini-4-argon";
1374
1422
  }
1375
1423
  if (["claude-fabel-5", "fable-5", "fabel-5", "fable-5.1", "claude-fable-5.1"].includes(normalized.model)) {
1376
1424
  normalized.model = "claude-fable-5";
@@ -1407,6 +1455,8 @@ function normalizeConfig(config) {
1407
1455
  ) {
1408
1456
  normalized.model = DEFAULT_MODEL_ID;
1409
1457
  }
1458
+ if (/^gpt-5(?:[.\-]|$)/.test(normalized.model || "")) normalized.model = DEFAULT_MODEL_ID;
1459
+ if (normalized.model === "claude-sonnet-4-6") normalized.model = "claude-sonnet-5-5";
1410
1460
  if (!MODELS[normalized.model]) {
1411
1461
  normalized.model = DEFAULT_MODEL_ID;
1412
1462
  }
package/codexclaude.md CHANGED
@@ -1,9 +1,53 @@
1
+ # Current release: 2.0.44 / runtime 0.164.0
2
+
3
+ October 24: Opus 5.5 first; GPT-5 and 4.6 removed from pickers; public balance, actual allowance percentages and scoped Unlimited time shown during model selection. Preserve routing, native tools and customer configuration. Publication and deployment evidence: /root/codexapi/output/launchers-20261024/REPORT.md. Older release claims below are historical.
4
+
1
5
  # codexclaude Customization Ledger
2
6
 
3
7
  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
8
 
5
9
  ## Current Release
6
10
 
11
+ ### 2026-10-17 DeepSeek V4.1 Flash And Official Codex0.163.0: 2.0.43
12
+
13
+ The exact official runtime dependency is now0.163.0. Picker order starts SOL6.1,
14
+ Argon4, DeepSeekV4.1Flash1017. SOL/Xhigh remains the fresh-install default. The
15
+ one-time default migration threshold stays2.0.42, preserving supported explicit
16
+ choices on this upgrade. DeepSeek uses publicID deepseek-flash, effort high by
17
+ default, none/low/high/max choices. All local permissions, config backups, native
18
+ tools, history/MCP, site authentication and verified hosted fallback remain.
19
+ 39 launcher checks passed before packaging. Npm publication is not claimed;
20
+ immutable hosted archive/checksum is the supported release channel until separately
21
+ verified. Production routing, rates and useful generation must be checked against
22
+ STATE, not inferred from launcher metadata.
23
+
24
+ ### 2026-10-14 Argon And SOL 6.1 Selection: 2.0.42
25
+
26
+ Version 2.0.42 retains exact `@openai/codex@0.157.1`; this is a launcher-only
27
+ release. The first selection is ChatGPT 6.1 SOL (`gpt-6.1-sol`) with Extra High
28
+ (`xhigh`) reasoning, followed by Google Argon 4 (`gemini-4-argon`). The previous
29
+ `gpt-6-sol` choice and all other existing non-Sonnet-5 entries remain selectable.
30
+ Exact Sonnet 5 is removed; Sonnet 4.6 and Sonnet 5.5 have separate choices and
31
+ aliases. Do not collapse their client IDs into Sonnet 5.
32
+
33
+ Argon defaults to Medium, lists Low/Medium/High efforts, and advertises the
34
+ verified 1,048,576-token context and 65,536 maximum response output. Do not
35
+ advertise long-decode support. `google/gemini-4-argon` is accepted as a user-input
36
+ alias, while generated client requests retain public ID `gemini-4-argon`.
37
+ Execution and billing stay server-managed. The launcher does not select a provider.
38
+ The first upgrade to 2.0.42 applies SOL/Xhigh once; subsequent explicit supported
39
+ selections persist. Existing exact Sonnet 5 selections fall back to the new default.
40
+
41
+ Startup copy now accurately says 15% managed coding savings. Full Access, native
42
+ tools, four-site authentication, wallets/top-up, safe TOML merges, model headers,
43
+ headless clean output, native-safe aliases and verified updater fallback remain.
44
+ Release publication and endpoint promotion must be established by fresh receipts,
45
+ not inferred from this source version. Do not repack earlier published archives.
46
+ See `/root/codexapi/output/codexclaude-argon-2042-20261014/REPORT.md` for the exact
47
+ new archive hash, hosting receipt, test evidence and rollback.
48
+
49
+ ## Historical Release Snapshots
50
+
7
51
  ### 2026-09-26 Sol And Runtime Update: 2.0.41
8
52
 
9
53
  Version 2.0.41 bundles exact `@openai/codex@0.157.1`. The local and API
@@ -15,8 +59,9 @@ from the picker. The server executes according to saved Admin global routing;
15
59
  the launcher never chooses a provider. Fable 5.1 and Sol are announced as
16
60
  selectable models, with execution determined by that routing.
17
61
  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.
62
+ effort until a distinct, verified route exists. Npm, hosted archive, three-region metadata and mandatory minimum were
63
+ verified live September 26. The isolated 2.0.40-to-2.0.41 upgrade relaunched
64
+ successfully. No saved routing or rate changed.
20
65
 
21
66
  ## Previous Releases
22
67
 
@@ -131,55 +176,28 @@ Run `npm test`, including the real-launcher configuration-preservation tests.
131
176
  - Generated model catalog: `~/.codexclaude/model_catalog.json`
132
177
  - Upstream update cache removed before setup: `~/.codex/version.json`
133
178
 
134
- ## Current Customer Behavior (2.0.41)
179
+ ## Current Customer Behavior (2.0.43)
135
180
 
136
- The launcher must present itself as:
181
+ The launcher identifies itself as `MagnetAPI.org Codex CLI v2.0.43`.
182
+ Normal interactive startup shows:
137
183
 
138
184
  ```text
139
- MagnetAPI.org Codex CLI v2.0.41
185
+ MagnetAPI.org Codex CLI v2.0.43 · ChatGPT 6.1 SOL Extra High · ~/project · Wallet balance $20.00
186
+ 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
187
  ```
141
188
 
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
- ```
189
+ The generated local native model catalogue places `gpt-6.1-sol` first and
190
+ `gemini-4-argon` second. Retained visible IDs: `gpt-6-sol`, `gpt-6-astra`,
191
+ `claude-fable-5`, `claude-opus-5`, `gpt-5.6`, `gpt-daybreak-blue-latest`,
192
+ `gpt-5.6-sol-max`, `gpt-5.6-sol-ultra`, `gpt-5.6-sol`, `claude-sonnet-4-6`,
193
+ `claude-sonnet-5-5` and `gpt-5.6-terra`. `claude-opus-4-8` stays hidden for
194
+ compatibility. There is no `claude-sonnet-5` local catalogue entry or picker alias.
148
195
 
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.
196
+ New/invalid configuration defaults to SOL/Xhigh. First upgrade applies it once;
197
+ subsequent model choices remain saved. Argon selection writes Medium reasoning.
198
+ Local client tools remain local; the service controls execution routes and accurate
199
+ billing. Native Astra retains its dedicated 2x billing notice. The runtime stays
200
+ 0.163.0. Do not modify real SDK/package/license identifiers or native binary text.
183
201
 
184
202
  ## Update Policy
185
203
 
@@ -188,7 +206,7 @@ with their own usage display and wallet billing.
188
206
  - `https://codexapi.pro/api/v1/codexclaude/version`
189
207
  - `https://registry.npmjs.org/@codexapi%2Fcodexclaude/latest`
190
208
 
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.
209
+ 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
210
 
193
211
  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
212
 
@@ -207,7 +225,7 @@ Never work around a Homebrew lock by deleting files under `Cellar`, removing Hom
207
225
  `bin/codexclaude.js` must rewrite `~/.codex/config.toml` before every coding session. Preserve this top-level shape:
208
226
 
209
227
  ```toml
210
- model = "gpt-6-sol"
228
+ model = "gpt-6.1-sol"
211
229
  model_catalog_json = "<absolute path to ~/.codexclaude/model_catalog.json>"
212
230
  preferred_auth_method = "apikey"
213
231
  model_provider = "codexapi"
@@ -224,7 +242,7 @@ base_url = "<service Responses URL>"
224
242
  experimental_bearer_token = "<customer System Token/API username>"
225
243
  wire_api = "responses"
226
244
  supports_websockets = false
227
- http_headers = { "X-CodexAPI-Client" = "codexclaude", "X-CodexAPI-Client-Version" = "2.0.41", "X-CodexAPI-Selected-Model" = "<selected model>" }
245
+ http_headers = { "X-CodexAPI-Client" = "codexclaude", "X-CodexAPI-Client-Version" = "2.0.43", "X-CodexAPI-Selected-Model" = "<selected model>" }
228
246
 
229
247
  [tui]
230
248
  status_line = ["model-with-reasoning", "fast-mode", "current-dir"]
@@ -233,7 +251,7 @@ terminal_title = ["project-name", "model-with-reasoning", "run-state"]
233
251
  ```
234
252
 
235
253
  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`,
254
+ including `gpt-6.1-sol`, `gemini-4-argon`, `gpt-6-sol`, `gpt-6-astra`, `gpt-daybreak-blue-latest`, `gpt-5.6`,
237
255
  `gpt-5.6-terra`, `gpt-5.6-sol-max`, and `gpt-5.6-sol-ultra`. This prevents
238
256
  fallback metadata warnings such as:
239
257
 
@@ -289,7 +307,7 @@ When updating the bundled runtime dependency:
289
307
  3. Bump `package.json` and `package-lock.json` to a new `@codexapi/codexclaude` version.
290
308
  4. Update `APP_VERSION` and `CODEX_VERSION` in `bin/codexclaude.js`.
291
309
  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.
310
+ 6. Preserve `DEFAULT_MODEL_ID = "gpt-6.1-sol"` unless product explicitly changes the first-run default.
293
311
  7. Preserve `DEFAULT_DISPLAY_REASONING_EFFORT = "xhigh"` and `DEFAULT_SERVER_REASONING_EFFORT = "xhigh"` unless operations explicitly changes the launcher-visible contract.
294
312
  8. Preserve Full Access defaults and the local model catalog.
295
313
  9. Preserve direct platform-native binary launch.
@@ -333,7 +351,7 @@ HOME="$tmp_home" CODEXCLAUDE_DISABLE_UPDATE_CHECK=1 CODEXCLAUDE_QUIET_STATUS=1 n
333
351
 
334
352
  Verify the generated config contains:
335
353
 
336
- - `model = "gpt-6-sol"` after the one-time 2.0.41 migration
354
+ - `model = "gpt-6.1-sol"` after the one-time 2.0.42 migration
337
355
  - `model_reasoning_effort = "xhigh"`
338
356
  - `check_for_update_on_startup = false`
339
357
  - `approval_policy = "never"`
@@ -343,6 +361,8 @@ Verify the generated config contains:
343
361
  Verify the generated model catalog contains these visible choices in launcher
344
362
  order (and the hidden Opus 4.8 compatibility entry):
345
363
 
364
+ - `gpt-6.1-sol`
365
+ - `gemini-4-argon`
346
366
  - `gpt-6-sol`
347
367
  - `gpt-6-astra`
348
368
  - `claude-fable-5`
@@ -352,19 +372,21 @@ order (and the hidden Opus 4.8 compatibility entry):
352
372
  - `gpt-5.6-sol-max`
353
373
  - `gpt-5.6-sol-ultra`
354
374
  - `gpt-5.6-sol`
355
- - `claude-sonnet-5`
375
+ - `claude-sonnet-4-6`
376
+ - `claude-sonnet-5-5`
356
377
  - `gpt-5.6-terra`
357
378
 
358
- After npm publication and hosted-archive verification, promote the release
379
+ After immutable hosted-archive verification (and npm publication when authorized
380
+ and available), promote the release
359
381
  metadata and mandatory minimum one region at a time, then verify:
360
382
 
361
383
  ```bash
362
384
  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"
385
+ curl -fsSI "https://codexapi.pro/downloads/codexapi-codexclaude-2.0.43.tgz"
364
386
  ```
365
387
 
366
- Once promoted, the version endpoint must report `latestVersion = 2.0.41`,
367
- `minimumVersion = 2.0.41`, and `updateRequired = true` for every older client.
388
+ Once promoted, the version endpoint must report `latestVersion = 2.0.43`,
389
+ `minimumVersion = 2.0.43`, and `updateRequired = true` for every older client.
368
390
 
369
391
  ## Version 2.0.37 Changes
370
392
 
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.44",
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.164.0"
27
27
  },
28
28
  "publishConfig": {
29
29
  "access": "public"