@codexapi/codexclaude 2.0.40 → 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.40`
9
- - Bundled official runtime dependency: `@openai/codex@0.157.0-alpha.7`
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.40.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,14 +47,16 @@ The launcher writes a model provider named `codexapi`:
47
47
 
48
48
  ## Runtime Defaults
49
49
 
50
- - Default model: `gpt-5.6-sol` displayed as `GPT-5.6 SOL`
51
- - Picker order: `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 and Opus 4.8 are hidden compatibility entries, not deleted API identities. 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.
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.
52
54
  - Default reasoning effort displayed locally: `Extra High`, stored as `xhigh`; SOL Max and SOL Ultra retain their explicit premium labels.
53
55
  - Reasoning hint written to managed runtime config: model-specific
54
56
  - Approval policy: `never`
55
57
  - Sandbox mode: `danger-full-access`
56
58
  - Display wording for permissions: `Full Access` in launcher-owned copy
57
- - 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.
58
60
  - Service tier: omitted by default; `/fast` remains user-controlled and billed server-side when active.
59
61
  - TUI status line: `model-with-reasoning`, `fast-mode`, `current-dir`
60
62
  - Fable 5 stays visible to the user while the backend applies its server-managed route and billing policy.
@@ -67,8 +69,8 @@ Before launching the runtime, the launcher calls `/api/v1/wallet/status`, then `
67
69
  Expected status line:
68
70
 
69
71
  ```text
70
- MagnetAPI.org Codex CLI v2.0.40 · GPT-5.6 SOL Extra High · ~/project · Wallet balance $20.00
71
- Fable 5.1, ChatGPT-6-Astra and Daybreak Blue are now available. 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.
72
74
  ```
73
75
 
74
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.
@@ -81,7 +83,7 @@ When updating the bundled runtime:
81
83
  2. Update `@openai/codex` in `package.json` and `package-lock.json`.
82
84
  3. Bump the launcher package version.
83
85
  4. Keep `APP_DISPLAY_NAME = "MagnetAPI.org Codex CLI"`.
84
- 5. Keep `DEFAULT_MODEL_ID = "gpt-5.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.
85
87
  6. Keep `reasoningEffortForModel()` and model-specific visible reasoning.
86
88
  7. Keep Full Access defaults: `approval_policy = "never"` and `sandbox_mode = "danger-full-access"`.
87
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-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.40` bundles the exact Codex runtime dependency `@openai/codex@0.157.0-alpha.7`. The model picker starts with ChatGPT-6-Astra, Fable 5.1 and Opus 5. GPT-5.6 SOL with Extra High reasoning remains the default; existing valid selections are preserved. The release retains four-site authentication, wallet integration, Full Access defaults, local tools, safe configuration merging and managed updates.
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, GPT-5.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 three choices are `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`. Legacy GPT-5.5 and Opus 4.8 metadata is hidden from new selection but retained for existing configurations. 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.40 · GPT-5.6 SOL Extra High · ~/project · Wallet balance $20.00
85
- Fable 5.1, ChatGPT-6-Astra and Daybreak Blue are now available. 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 GPT-5.6 SOL/Extra High as the default and legacy configuration compatibility.
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.40";
19
- const CODEX_VERSION = "0.157.0-alpha.7";
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-5.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, ChatGPT-6-Astra and Daybreak Blue are now available. 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 = [
@@ -78,9 +79,13 @@ const SUPPORTED_REASONING_LEVELS = [
78
79
  { effort: "medium", description: "Balances speed and reasoning depth for everyday coding" },
79
80
  { effort: "high", description: "Greater reasoning depth for complex work" },
80
81
  { effort: "xhigh", description: "Extra high visible reasoning setting for managed sessions" },
81
- { effort: "max", description: "GPT-5.6 SOL Max visible reasoning mode" },
82
+ { effort: "max", description: "Maximum reasoning depth" },
82
83
  { effort: "ultra", description: "GPT-5.6 SOL Ultra visible reasoning mode" },
83
84
  ];
85
+ const SOL_REASONING_LEVELS = [
86
+ { effort: "none", description: "Fastest responses without extended reasoning" },
87
+ ...SUPPORTED_REASONING_LEVELS.filter(({ effort }) => effort !== "ultra"),
88
+ ];
84
89
 
85
90
  const TOPUP_PACKAGES = [
86
91
  { amount: 5, credit: 50, sharedPlanId: "test", whiteLabelPlanId: "credit-5" },
@@ -94,6 +99,52 @@ const TOPUP_POLL_INTERVAL_MS = positiveInteger(process.env.CODEXCLAUDE_TOPUP_POL
94
99
  const TOPUP_TIMEOUT_MS = positiveInteger(process.env.CODEXCLAUDE_TOPUP_TIMEOUT_MS, 30 * 60 * 1000);
95
100
 
96
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
+ },
139
+ "gpt-6-sol": {
140
+ id: "gpt-6-sol",
141
+ label: "ChatGPT-6-SOL",
142
+ aliases: ["gpt-6-sol", "gpt6-sol", "chatgpt-6-sol", "sol-6"],
143
+ reasoningEffort: "xhigh",
144
+ contextWindow: 1050000,
145
+ maxOutputTokens: 128000,
146
+ supportedReasoningLevels: SOL_REASONING_LEVELS,
147
+ },
97
148
  "gpt-6-astra": {
98
149
  id: "gpt-6-astra",
99
150
  label: "ChatGPT-6-Astra",
@@ -110,46 +161,16 @@ const MODELS = {
110
161
  aliases: ["fable", "fable-5.1", "claude-fable-5.1", "fable-5", "fabel", "fabel-5", "claude-fable-5", "claude-fabel-5"],
111
162
  premium: true,
112
163
  },
113
- "claude-opus-5": {
114
- id: "claude-opus-5",
115
- label: "Opus 5",
116
- aliases: ["opus", "opus-5", "claude", "claude-opus-5"],
117
- },
118
- "gpt-5.6": {
119
- id: "gpt-5.6",
120
- label: "GPT-5.6",
121
- aliases: ["gpt", "gpt-5.6", "chatgpt", "chatgpt-5.6", "gpt56"],
122
- reasoningEffort: "xhigh",
123
- },
124
164
  "gpt-daybreak-blue-latest": {
125
165
  id: "gpt-daybreak-blue-latest",
126
166
  label: "Daybreak Blue - Advanced Security",
127
167
  aliases: ["daybreak", "daybreak-blue", "chatgpt-daybreak-blue", "gpt-daybreak-blue-latest"],
128
168
  reasoningEffort: "xhigh",
129
169
  },
130
- "gpt-5.6-sol-max": {
131
- id: "gpt-5.6-sol-max",
132
- label: "GPT-5.6 SOL Max",
133
- aliases: ["gpt-5.6-sol-max", "gpt-5.6-max", "gpt56-max", "sol-max", "max"],
134
- reasoningEffort: "max",
135
- },
136
- "gpt-5.6-sol-ultra": {
137
- id: "gpt-5.6-sol-ultra",
138
- label: "GPT-5.6 SOL Ultra",
139
- aliases: ["gpt-5.6-sol-ultra", "gpt-5.6-ultra", "gpt56-ultra", "sol-ultra", "ultra"],
140
- reasoningEffort: "ultra",
141
- },
142
- "gpt-5.6-sol": {
143
- id: "gpt-5.6-sol",
144
- label: "GPT-5.6 SOL",
145
- aliases: ["gpt-5.6-sol", "sol"],
146
- reasoningEffort: "xhigh",
147
- },
148
- "gpt-5.5": {
149
- id: "gpt-5.5",
150
- label: "ChatGPT-5.5",
151
- aliases: ["gpt-5.5", "chatgpt-5.5"],
152
- legacy: true,
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"],
153
174
  },
154
175
  "claude-opus-4-8": {
155
176
  id: "claude-opus-4-8",
@@ -157,17 +178,6 @@ const MODELS = {
157
178
  aliases: ["opus-4.8", "opus-4.7", "claude-opus-4-8", "claude-opus-4-7"],
158
179
  legacy: true,
159
180
  },
160
- "claude-sonnet-5": {
161
- id: "claude-sonnet-5",
162
- label: "Sonnet 5",
163
- aliases: ["sonnet", "sonnet-5", "sonnet-4.6", "sonnet-4-6", "claude-sonnet-5", "claude-sonnet-4-6", "claude-sonnet-4.6"],
164
- },
165
- "gpt-5.6-terra": {
166
- id: "gpt-5.6-terra",
167
- label: "GPT-5.6 Terra",
168
- aliases: ["terra", "gpt-5.6-terra", "gpt56-terra"],
169
- reasoningEffort: "xhigh",
170
- },
171
181
  };
172
182
 
173
183
  const PICKER_MODELS = Object.values(MODELS).filter((model) => !model.legacy);
@@ -233,7 +243,7 @@ ${APP_DISPLAY_NAME} v${APP_VERSION}
233
243
 
234
244
  Commands:
235
245
  codexclaude login Login with dashboard username/email and password
236
- codexclaude models Select ChatGPT-6-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
237
247
  codexclaude changelog Show the latest CodexAPI.pro launcher changes
238
248
  codexclaude setup Rewrite ~/.codex/config.toml with Full Access defaults
239
249
  codexclaude topup Select an API Coding Credit package and securely complete payment
@@ -298,7 +308,8 @@ async function loginFlow() {
298
308
  };
299
309
  saveConfig(config);
300
310
  writeCodexConfig(config);
301
- 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"));
302
313
  console.log("Full Access permissions, model-specific visible reasoning, and service-specific provider config were written.");
303
314
  } finally {
304
315
  rl.close();
@@ -408,6 +419,9 @@ async function modelFlow() {
408
419
  saveConfig(config);
409
420
  writeCodexConfig(config);
410
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);
411
425
  } finally {
412
426
  rl.close();
413
427
  }
@@ -986,11 +1000,12 @@ function clearUpstreamUpdateCache() {
986
1000
  }
987
1001
  }
988
1002
 
989
- function writeModelCatalog() {
1003
+ function writeModelCatalog(account = null) {
990
1004
  mkdirSync(CONFIG_DIR, { recursive: true });
991
1005
  const catalog = {
992
1006
  models: [...PICKER_MODELS, ...Object.values(MODELS).filter((model) => model.legacy)]
993
- .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) })),
994
1009
  };
995
1010
  writeFileSync(MODEL_CATALOG_FILE, `${JSON.stringify(catalog, null, 2)}\n`, { encoding: "utf8", mode: 0o600 });
996
1011
  return MODEL_CATALOG_FILE;
@@ -1036,6 +1051,18 @@ function modelCatalogEntry(model, index) {
1036
1051
  }
1037
1052
 
1038
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
+ }
1063
+ if (modelId === "gpt-6-sol") {
1064
+ return "ChatGPT-6-SOL: coding tools, image input, and reasoning from None through Max.";
1065
+ }
1039
1066
  if (modelId === "gpt-6-astra") {
1040
1067
  return "ChatGPT-6-Astra: coding tools, configurable reasoning, and image input.";
1041
1068
  }
@@ -1057,19 +1084,22 @@ function modelCatalogDescription(modelId) {
1057
1084
  if (modelId === "gpt-5.6-terra") {
1058
1085
  return "GPT-5.6 Terra coding route with local coding tools and wallet billing.";
1059
1086
  }
1060
- if (modelId === "claude-opus-5") {
1061
- 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.";
1062
1089
  }
1063
1090
  if (modelId === "claude-opus-4-8") {
1064
1091
  return "Opus 4.8 coding route with local coding tools and wallet billing.";
1065
1092
  }
1066
- if (modelId === "claude-sonnet-5") {
1067
- 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.";
1068
1098
  }
1069
1099
  if (modelId === "claude-fable-5") {
1070
1100
  return "Fable 5.1: coding tools and image input, using the compatible Fable 5 API id.";
1071
1101
  }
1072
- return "ChatGPT-5.5 coding route with local coding tools and wallet billing.";
1102
+ return "Coding route with local coding tools and wallet billing.";
1073
1103
  }
1074
1104
 
1075
1105
  function readConfig() {
@@ -1117,6 +1147,9 @@ async function runCodex(args) {
1117
1147
  // Wallet lookup should never block the user from starting a local coding session.
1118
1148
  }
1119
1149
  if (interactive) {
1150
+ const account = await accountSnapshot(config);
1151
+ writeModelCatalog(account);
1152
+ console.log(accountLines(account, { model: config.model }).join("\n"));
1120
1153
  console.log(formatStatusLine(config, wallet, process.cwd()));
1121
1154
  const color = process.env.NO_COLOR === undefined && process.env.TERM !== "dumb";
1122
1155
  console.log(color ? `${ANSI_GREEN}${FABLE_ANNOUNCEMENT}${ANSI_RESET}` : FABLE_ANNOUNCEMENT);
@@ -1281,11 +1314,24 @@ function numericWalletValue(value) {
1281
1314
 
1282
1315
  function formatStatusLine(config, wallet, cwd) {
1283
1316
  const model = modelStatusName(config.model);
1284
- 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";
1285
1319
  return `${APP_DISPLAY_NAME} v${APP_VERSION} · ${model} ${displayReasoningEffortForModel(config.model)} · ${formatCwd(cwd)} · ${walletText}`;
1286
1320
  }
1287
1321
 
1288
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
+ }
1332
+ if (model === "gpt-6-sol") {
1333
+ return "ChatGPT-6-SOL";
1334
+ }
1289
1335
  if (model === "gpt-6-astra") {
1290
1336
  return "ChatGPT-6 Astra";
1291
1337
  }
@@ -1307,14 +1353,17 @@ function modelStatusName(model) {
1307
1353
  if (model === "gpt-5.6-terra") {
1308
1354
  return "gpt-5.6-terra";
1309
1355
  }
1310
- if (model === "claude-opus-5") {
1311
- return "Opus 5";
1356
+ if (model === "claude-opus-5-5") {
1357
+ return "Claude Opus 5.5";
1312
1358
  }
1313
1359
  if (model === "claude-opus-4-8") {
1314
1360
  return "opus-4.8";
1315
1361
  }
1316
- if (model === "claude-sonnet-5") {
1317
- 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";
1318
1367
  }
1319
1368
  if (model === "claude-fable-5") {
1320
1369
  return "fable-5";
@@ -1345,14 +1394,31 @@ function normalizeConfig(config) {
1345
1394
  return config;
1346
1395
  }
1347
1396
  const normalized = { ...config };
1348
- if (["opus", "opus-5", "claude"].includes(normalized.model)) {
1349
- normalized.model = "claude-opus-5";
1397
+ // Apply the 2.0.42 default once for existing installations. A later /model
1398
+ // choice remains the customer's explicit selection.
1399
+ if (isOlderVersion(config.version || "0.0.0", "2.0.42")) {
1400
+ normalized.model = DEFAULT_MODEL_ID;
1401
+ }
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";
1350
1404
  }
1351
1405
  if (normalized.model === "claude-opus-4-7") {
1352
1406
  normalized.model = "claude-opus-4-8";
1353
1407
  }
1354
- if (["claude-sonnet-4.6", "claude-sonnet-4-6", "sonnet-4.6", "sonnet-4-6", "sonnet-5"].includes(normalized.model)) {
1355
- 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";
1356
1422
  }
1357
1423
  if (["claude-fabel-5", "fable-5", "fabel-5", "fable-5.1", "claude-fable-5.1"].includes(normalized.model)) {
1358
1424
  normalized.model = "claude-fable-5";
@@ -1389,6 +1455,8 @@ function normalizeConfig(config) {
1389
1455
  ) {
1390
1456
  normalized.model = DEFAULT_MODEL_ID;
1391
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";
1392
1460
  if (!MODELS[normalized.model]) {
1393
1461
  normalized.model = DEFAULT_MODEL_ID;
1394
1462
  }
package/codexclaude.md CHANGED
@@ -1,9 +1,70 @@
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
+
51
+ ### 2026-09-26 Sol And Runtime Update: 2.0.41
52
+
53
+ Version 2.0.41 bundles exact `@openai/codex@0.157.1`. The local and API
54
+ catalogues place `gpt-6-sol` first, with None, Low, Medium, High, Extra High and
55
+ Max reasoning. Extra High is the default. The first 2.0.41 launch replaces the
56
+ previous saved model choice with Sol; selections made afterward persist. GPT-5.5
57
+ is absent from the new picker. Existing API compatibility routes remain separate
58
+ from the picker. The server executes according to saved Admin global routing;
59
+ the launcher never chooses a provider. Fable 5.1 and Sol are announced as
60
+ selectable models, with execution determined by that routing.
61
+ Official GPT-6 Sol documentation does not list Ultra; do not advertise an Ultra
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.
65
+
66
+ ## Previous Releases
67
+
7
68
  ### 2026-09-22 Daybreak And Runtime Update: 2.0.40
8
69
 
9
70
  Version 2.0.40 bundles exact `@openai/codex@0.157.0-alpha.7`. The launcher model
@@ -14,7 +75,21 @@ upstream package identifiers, SDK field names and license notices stay intact.
14
75
  Version and minimum are advanced only after the checked hosted archive exists.
15
76
  The launcher and upstream runtime have separate version numbers. Preserve the
16
77
  same safe config merge, model defaults, local tools and native command ownership.
17
- See STATE.md for actual publication and deployment evidence.
78
+ Npm publication completed September 22 at 12:53:59 UTC following browser login
79
+ and separate publication authorization. Public latest is 2.0.40. Registry download
80
+ SHA-256 is `11b219cc5985b4b1fc37b68f5069cd41ab9d8753583fe49ae721e7718426b309`,
81
+ identical to the tested hosted archive. Do not repack this published version.
82
+ Mandatory-minimum activation completed September 22 at 17:59 UTC after database
83
+ recovery. London, Chicago and Frankfurt enforce 2.0.40; all four sites' managed
84
+ launchers use the central version check and their Windows/macOS/Linux setup
85
+ downloads match the published archive. A real isolated 2.0.39 registry install
86
+ was blocked, upgraded to 2.0.40 and automatically relaunched, preserving unrelated
87
+ configuration. Existing sessions are not terminated; older launchers must update
88
+ before their next launch. Noninteractive sessions exit with update instructions.
89
+ See `/root/codexapi/STATE.md` and
90
+ `output/codexclaude-mandatory-2040-20260922T174500Z/COMPLETED.json`. Do not repack or
91
+ republish the immutable npm archive after this documentation update. Daybreak
92
+ Admin routing is tracked separately from launcher publication and enforcement.
18
93
 
19
94
  ## Previous Release
20
95
 
@@ -101,41 +176,28 @@ Run `npm test`, including the real-launcher configuration-preservation tests.
101
176
  - Generated model catalog: `~/.codexclaude/model_catalog.json`
102
177
  - Upstream update cache removed before setup: `~/.codex/version.json`
103
178
 
104
- ## Required Customer Behavior
105
-
106
- The launcher must present itself as:
107
-
108
- ```text
109
- MagnetAPI.org Codex CLI v2.0.37
110
- ```
179
+ ## Current Customer Behavior (2.0.43)
111
180
 
112
- Normal pre-launch status should look like:
181
+ The launcher identifies itself as `MagnetAPI.org Codex CLI v2.0.43`.
182
+ Normal interactive startup shows:
113
183
 
114
184
  ```text
115
- MagnetAPI.org Codex CLI v2.0.37 · GPT-5.6 SOL Extra High · ~/project · Wallet balance $20.00
116
- Fable 5 is now available in codexclaude, exclusively.
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.
117
187
  ```
118
188
 
119
- 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.
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.
120
195
 
121
- The launcher command `codexclaude model` must list these customer-visible models:
122
-
123
- - `claude-opus-5` displayed as `Opus 5`
124
- - `gpt-5.6` displayed as `GPT-5.6`
125
- - `gpt-daybreak-blue-latest` displayed as `ChatGPT Daybreak Blue`
126
- - `gpt-5.6-sol-max` displayed as `GPT-5.6 SOL Max`
127
- - `gpt-5.6-sol-ultra` displayed as `GPT-5.6 SOL Ultra`
128
- - `gpt-5.6-sol` displayed as `GPT-5.6 SOL`, selected by default for new and invalid configurations
129
- - `gpt-5.5` displayed as `ChatGPT-5.5`
130
- - `claude-opus-4-8` displayed as `Opus 4.8`
131
- - `claude-sonnet-5` displayed as `Sonnet 5`
132
- - `claude-fable-5` displayed as `Fable 5`
133
- - `gpt-5.6-terra` displayed as `GPT-5.6 Terra`
134
- - `gpt-6-astra` displayed as `ChatGPT-6 Astra`
135
-
136
- ChatGPT-6 Astra supports `low`, `medium`, `high`, `xhigh`, and `max` reasoning in the managed catalog, with a 1,050,000-token context window and 128,000 maximum output tokens. The launcher displays a billing notice when Astra is selected. Native signed-in Astra usage is charged at 2x the normal Codex rate; when the dedicated Astra route follows Global Cross-Model Routing, normal billing for that route applies.
137
-
138
- GPT-5.6 SOL must be the default when a new config is created or a legacy config contains an unsupported model value. It is displayed as Extra High while the generated runtime config stores `xhigh`. A valid existing customer selection must remain unchanged across upgrades. The selected model slug must stay in `~/.codex/config.toml`; do not rewrite customer-facing model selections locally. `gpt-5.6-sol-max` and `gpt-5.6-sol-ultra` remain distinct for customer choice, 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.
139
201
 
140
202
  ## Update Policy
141
203
 
@@ -144,7 +206,7 @@ GPT-5.6 SOL must be the default when a new config is created or a legacy config
144
206
  - `https://codexapi.pro/api/v1/codexclaude/version`
145
207
  - `https://registry.npmjs.org/@codexapi%2Fcodexclaude/latest`
146
208
 
147
- It must not check `@openai/codex` npm metadata, OpenAI GitHub releases, or any upstream OpenAI update endpoint. Version `2.0.37` is both the enforced minimum and current latest release. 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.
148
210
 
149
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`.
150
212
 
@@ -163,7 +225,7 @@ Never work around a Homebrew lock by deleting files under `Cellar`, removing Hom
163
225
  `bin/codexclaude.js` must rewrite `~/.codex/config.toml` before every coding session. Preserve this top-level shape:
164
226
 
165
227
  ```toml
166
- model = "gpt-5.6-sol"
228
+ model = "gpt-6.1-sol"
167
229
  model_catalog_json = "<absolute path to ~/.codexclaude/model_catalog.json>"
168
230
  preferred_auth_method = "apikey"
169
231
  model_provider = "codexapi"
@@ -180,7 +242,7 @@ base_url = "<service Responses URL>"
180
242
  experimental_bearer_token = "<customer System Token/API username>"
181
243
  wire_api = "responses"
182
244
  supports_websockets = false
183
- http_headers = { "X-CodexAPI-Client" = "codexclaude", "X-CodexAPI-Client-Version" = "2.0.37", "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>" }
184
246
 
185
247
  [tui]
186
248
  status_line = ["model-with-reasoning", "fast-mode", "current-dir"]
@@ -188,13 +250,20 @@ status_line_use_colors = true
188
250
  terminal_title = ["project-name", "model-with-reasoning", "run-state"]
189
251
  ```
190
252
 
191
- The generated model catalog must contain full metadata for every supported slug, including `gpt-6-astra`, `gpt-daybreak-blue-latest`, `gpt-5.6`, `gpt-5.6-terra`, `gpt-5.6-sol-max`, and `gpt-5.6-sol-ultra`. This prevents fallback metadata warnings such as:
253
+ The generated model catalog must contain full metadata for every supported slug,
254
+ including `gpt-6.1-sol`, `gemini-4-argon`, `gpt-6-sol`, `gpt-6-astra`, `gpt-daybreak-blue-latest`, `gpt-5.6`,
255
+ `gpt-5.6-terra`, `gpt-5.6-sol-max`, and `gpt-5.6-sol-ultra`. This prevents
256
+ fallback metadata warnings such as:
192
257
 
193
258
  ```text
194
259
  Model metadata for `claude-opus-4-8` not found. Defaulting to fallback metadata; this can degrade performance and cause issues.
195
260
  ```
196
261
 
197
- Each model catalog entry must include a slug, display name, reasoning levels including `xhigh`, `max`, and `ultra`, shell tool type, input modalities including images, web/search support, truncation policy, and `visibility = "list"`.
262
+ Each model catalog entry must include a slug, display name, model-specific
263
+ reasoning levels, shell tool type, input modalities including images,
264
+ web/search support, truncation policy, and visibility. GPT-6 Sol has `none`
265
+ through `max` and no `ultra`; the compatibility-only Opus 4.8 entry uses
266
+ `visibility = "hide"`.
198
267
 
199
268
  ## Service Login
200
269
 
@@ -238,8 +307,8 @@ When updating the bundled runtime dependency:
238
307
  3. Bump `package.json` and `package-lock.json` to a new `@codexapi/codexclaude` version.
239
308
  4. Update `APP_VERSION` and `CODEX_VERSION` in `bin/codexclaude.js`.
240
309
  5. Preserve `APP_DISPLAY_NAME = "MagnetAPI.org Codex CLI"`.
241
- 6. Preserve `DEFAULT_MODEL_ID = "gpt-5.6-sol"` unless product explicitly changes the first-run default.
242
- 7. Preserve `DISPLAY_REASONING_EFFORT = "xhigh"` and `SERVER_REASONING_EFFORT = "xhigh"` unless operations explicitly changes the launcher-visible contract.
310
+ 6. Preserve `DEFAULT_MODEL_ID = "gpt-6.1-sol"` unless product explicitly changes the first-run default.
311
+ 7. Preserve `DEFAULT_DISPLAY_REASONING_EFFORT = "xhigh"` and `DEFAULT_SERVER_REASONING_EFFORT = "xhigh"` unless operations explicitly changes the launcher-visible contract.
243
312
  8. Preserve Full Access defaults and the local model catalog.
244
313
  9. Preserve direct platform-native binary launch.
245
314
  10. Preserve update checks through our version endpoint and `@codexapi/codexclaude` npm metadata only.
@@ -267,7 +336,7 @@ tmp_home="$(mktemp -d)"
267
336
  mkdir -p "$tmp_home/.codexclaude"
268
337
  cat > "$tmp_home/.codexclaude/config.json" <<'JSON'
269
338
  {
270
- "version": "2.0.37",
339
+ "version": "2.0.40",
271
340
  "serviceId": "codexapi",
272
341
  "serviceLabel": "CodexAPI.pro",
273
342
  "apiOrigin": "https://codexapi.pro",
@@ -282,34 +351,42 @@ HOME="$tmp_home" CODEXCLAUDE_DISABLE_UPDATE_CHECK=1 CODEXCLAUDE_QUIET_STATUS=1 n
282
351
 
283
352
  Verify the generated config contains:
284
353
 
285
- - `model = "gpt-5.6-sol"`
354
+ - `model = "gpt-6.1-sol"` after the one-time 2.0.42 migration
286
355
  - `model_reasoning_effort = "xhigh"`
287
356
  - `check_for_update_on_startup = false`
288
357
  - `approval_policy = "never"`
289
358
  - `sandbox_mode = "danger-full-access"`
290
359
  - no default fast service tier
291
360
 
292
- Verify the generated model catalog contains only:
361
+ Verify the generated model catalog contains these visible choices in launcher
362
+ order (and the hidden Opus 4.8 compatibility entry):
293
363
 
364
+ - `gpt-6.1-sol`
365
+ - `gemini-4-argon`
366
+ - `gpt-6-sol`
367
+ - `gpt-6-astra`
368
+ - `claude-fable-5`
369
+ - `claude-opus-5`
294
370
  - `gpt-5.6`
371
+ - `gpt-daybreak-blue-latest`
295
372
  - `gpt-5.6-sol-max`
296
373
  - `gpt-5.6-sol-ultra`
297
374
  - `gpt-5.6-sol`
298
- - `gpt-5.5`
299
- - `claude-opus-5`
300
- - `claude-opus-4-8`
301
- - `claude-sonnet-5`
302
- - `claude-fable-5`
375
+ - `claude-sonnet-4-6`
376
+ - `claude-sonnet-5-5`
303
377
  - `gpt-5.6-terra`
304
378
 
305
- After packaging, copy the tarball to the public downloads directories, restart the backend, and verify:
379
+ After immutable hosted-archive verification (and npm publication when authorized
380
+ and available), promote the release
381
+ metadata and mandatory minimum one region at a time, then verify:
306
382
 
307
383
  ```bash
308
384
  curl -fsS "https://codexapi.pro/api/v1/codexclaude/version?current=2.0.17"
309
- curl -fsSI "https://codexapi.pro/downloads/codexapi-codexclaude-2.0.37.tgz"
385
+ curl -fsSI "https://codexapi.pro/downloads/codexapi-codexclaude-2.0.43.tgz"
310
386
  ```
311
387
 
312
- The version endpoint must report `latestVersion = 2.0.37`, `minimumVersion = 2.0.37`, 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.
313
390
 
314
391
  ## Version 2.0.37 Changes
315
392
 
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@codexapi/codexclaude",
3
- "version": "2.0.40",
4
- "description": "MagnetAPI.org Codex CLI for ChatGPT-6-Astra, Fable 5.1, Opus 5, Sonnet 5, Daybreak Blue, and GPT-5.6.",
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.0-alpha.7"
26
+ "@openai/codex": "0.164.0"
27
27
  },
28
28
  "publishConfig": {
29
29
  "access": "public"