@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 +11 -9
- package/README.md +8 -90
- package/bin/account-status.js +103 -0
- package/bin/codexclaude.js +136 -68
- package/codexclaude.md +125 -48
- 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,14 +47,16 @@ The launcher writes a model provider named `codexapi`:
|
|
|
47
47
|
|
|
48
48
|
## Runtime Defaults
|
|
49
49
|
|
|
50
|
-
- Default model: `gpt-
|
|
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.
|
|
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`;
|
|
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.
|
|
71
|
-
|
|
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-
|
|
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
|
-
|
|
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, 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
|
-
|
|
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.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
|
-
|
|
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 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
|
+
}
|
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-
|
|
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 = [
|
|
@@ -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: "
|
|
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
|
-
"
|
|
131
|
-
id: "
|
|
132
|
-
label: "
|
|
133
|
-
aliases: ["
|
|
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
|
|
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}
|
|
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-
|
|
1067
|
-
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.";
|
|
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 "
|
|
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
|
|
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-
|
|
1317
|
-
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";
|
|
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
|
-
|
|
1349
|
-
|
|
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", "
|
|
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
|
-
|
|
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
|
-
##
|
|
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
|
-
|
|
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.
|
|
116
|
-
|
|
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
|
-
|
|
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
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
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.
|
|
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-
|
|
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.
|
|
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,
|
|
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,
|
|
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-
|
|
242
|
-
7. Preserve `
|
|
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.
|
|
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-
|
|
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
|
|
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
|
-
- `
|
|
299
|
-
- `claude-
|
|
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
|
|
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.
|
|
385
|
+
curl -fsSI "https://codexapi.pro/downloads/codexapi-codexclaude-2.0.43.tgz"
|
|
310
386
|
```
|
|
311
387
|
|
|
312
|
-
|
|
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.
|
|
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"
|