@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 +10 -9
- package/README.md +8 -90
- package/bin/account-status.js +103 -0
- package/bin/codexclaude.js +112 -62
- package/codexclaude.md +78 -56
- package/package.json +3 -3
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.
|
|
9
|
-
- Bundled official runtime dependency: `@openai/codex@0.
|
|
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.
|
|
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
|
|
51
|
-
- Picker order:
|
|
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`;
|
|
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.
|
|
72
|
-
|
|
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
|
-
|
|
3
|
+
Bundles the exact official Codex runtime 0.164.0.
|
|
4
4
|
|
|
5
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
-
|
|
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
|
+
}
|
package/bin/codexclaude.js
CHANGED
|
@@ -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.
|
|
19
|
-
const CODEX_VERSION = "0.
|
|
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 = "
|
|
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
|
-
"
|
|
144
|
-
id: "
|
|
145
|
-
label: "
|
|
146
|
-
aliases: ["
|
|
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
|
|
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}
|
|
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-
|
|
1077
|
-
return "Sonnet
|
|
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
|
|
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-
|
|
1330
|
-
return "
|
|
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.
|
|
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",
|
|
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", "
|
|
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.
|
|
19
|
-
|
|
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.
|
|
179
|
+
## Current Customer Behavior (2.0.43)
|
|
135
180
|
|
|
136
|
-
The launcher
|
|
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.
|
|
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
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
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
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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-
|
|
375
|
+
- `claude-sonnet-4-6`
|
|
376
|
+
- `claude-sonnet-5-5`
|
|
356
377
|
- `gpt-5.6-terra`
|
|
357
378
|
|
|
358
|
-
After
|
|
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.
|
|
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.
|
|
367
|
-
`minimumVersion = 2.0.
|
|
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.
|
|
4
|
-
"description": "MagnetAPI.org Codex CLI for ChatGPT
|
|
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.
|
|
26
|
+
"@openai/codex": "0.164.0"
|
|
27
27
|
},
|
|
28
28
|
"publishConfig": {
|
|
29
29
|
"access": "public"
|