codex-copilot-dx 0.9.1 → 0.9.3
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/README.md +3 -3
- package/package.json +1 -1
- package/src/codex-model-catalog.mjs +22 -11
- package/src/dashboard/index.html +2 -2
- package/src/dashboard/ui.js +1 -0
package/README.md
CHANGED
|
@@ -26,9 +26,9 @@ Codex Auto-review uses the hidden `codex-auto-review` model ID. CCDX maps it to
|
|
|
26
26
|
|
|
27
27
|
Codex App requests a versioned, capability-rich model catalog that is different from Copilot's raw model list. CCDX reads the complete catalog bundled with the installed Codex App and preserves every other model entry and capability. It exposes each managed GPT-6 entry only when Copilot advertises that exact model as enabled, selectable, OpenAI-owned, and Responses-capable.
|
|
28
28
|
|
|
29
|
-
When an installed 0.155.x catalog does not yet contain `gpt-6-sol` or `gpt-6-luna`, CCDX derives their client-compatible entries from that catalog's GPT-6 Astra schema and the published OpenAI Codex model definitions at commit `0a2eb4696c26ac33204bcd255721ab30220a4774`.
|
|
29
|
+
When an installed 0.155.x catalog does not yet contain `gpt-6-sol` or `gpt-6-luna`, CCDX derives their client-compatible entries from that catalog's GPT-6 Astra schema and the published OpenAI Codex model definitions at commit `0a2eb4696c26ac33204bcd255721ab30220a4774`. When an installed 0.158+ catalog contains `gpt-6-sol` but not `gpt-6.1-sol`, CCDX derives only the missing 6.1 entry from that client's Sol schema and OpenAI Codex model identity/defaults at commit `ab84d71f5767e4a565ce81c2c426287cb48c7918`. Fallback reasoning controls are intersected with Copilot's advertised efforts; every other bundled entry retains its established behavior. A newer client-provided entry supplies its schema and future fields while CCDX still gates its visibility, speed tiers, and 6.1 Sol reasoning controls against Copilot.
|
|
30
30
|
|
|
31
|
-
CCDX exposes GPT-6 Standard paths and removes unverified speed-tier metadata.
|
|
31
|
+
CCDX exposes GPT-6 Standard paths and removes unverified speed-tier metadata. Existing GPT-6 bundled reasoning-effort options remain unchanged; 6.1 Sol is limited to efforts advertised by Copilot. Fast follows the exact upstream-variant rule above. Versioned model discovery matches the bundled catalog to the client's `client_version`, including the nested Codex CLI binary in current macOS App bundles, caches it by application binary identity, and reloads it after an App update. If a matching usable catalog cannot be loaded, the versioned models request returns `503`; an unversioned request returns the Copilot-style list.
|
|
32
32
|
|
|
33
33
|
`/v1/models` still attempts live discovery first. With a usable in-process catalog, it limits that upstream wait to 1.5 seconds (or a shorter configured upstream timeout) before falling back to last-known-good data. Without a catalog it retains the regular upstream timeout. Received HTTP `401`/`403` responses remain errors, not cached successes; fallback does not grant inference access. This does not change the explicitly live `ccdx models` command.
|
|
34
34
|
|
|
@@ -230,7 +230,7 @@ If a configured npm mirror has not synchronized the current release yet, use the
|
|
|
230
230
|
|
|
231
231
|
After starting `ccdx`, open [http://127.0.0.1:2026/](http://127.0.0.1:2026/) in a browser. If `ADAPTER_PORT` is customized, use that port instead. The dashboard shares the existing adapter listener; CCDX does not open a browser automatically or start another service. The page and its assets require both a loopback connection and a loopback Host header, even when LAN binding is enabled.
|
|
232
232
|
|
|
233
|
-
The dashboard loads local status, a live GitHub Copilot model directory, and a summary of local usage metadata once when opened. Each section has an explicit Refresh control; nothing polls in the background. The appearance button switches between the default dark terminal theme (sun icon) and a light theme (moon icon); the choice is stored only in that browser. The live model table uses the same fresh account validation and selectable GPT filtering as `ccdx models`, never labels cached fallback data as online, and makes no inference request. A catalog listing does not guarantee inference access. The Usage table combines the current and rotated local usage logs, shows totals and up to 100 model rows, and contains no prompt, response body, or credential fields. The animation selector previews the existing themes and saves through the same settings writer as `ccdx animation`; changes take effect on the next adapter start, and `CCDX_TERMINAL_ANIMATION=off` still disables terminal motion. Dashboard data requests require a custom header that cross-site simple requests cannot send; animation writes also require a matching same-origin `Origin`. The dashboard does not initialize the optional image handler. The overview's known-model count is the adapter's current in-memory catalog, not the live table. A missing image-generation status does not prove the feature is disabled: use `ccdx image-status` to check setup. Recent upstream error prose may contain sensitive details, so review the page before sharing screenshots.
|
|
233
|
+
The dashboard loads local status, a live GitHub Copilot model directory, and a summary of local usage metadata once when opened. Each section has an explicit Refresh control; nothing polls in the background. The appearance button switches between the default dark terminal theme (sun icon) and a light theme (moon icon); the choice is stored only in that browser. The Requests card shows the running adapter's active raw and decoded per-request body limits, not request-body usage; Local History shows its in-memory Responses history use and active limit. Limit changes remain CLI-only (`ccdx limits` and `ccdx cache`). The live model table uses the same fresh account validation and selectable GPT filtering as `ccdx models`, never labels cached fallback data as online, and makes no inference request. A catalog listing does not guarantee inference access. The Usage table combines the current and rotated local usage logs, shows totals and up to 100 model rows, and contains no prompt, response body, or credential fields. The animation selector previews the existing themes and saves through the same settings writer as `ccdx animation`; changes take effect on the next adapter start, and `CCDX_TERMINAL_ANIMATION=off` still disables terminal motion. Dashboard data requests require a custom header that cross-site simple requests cannot send; animation writes also require a matching same-origin `Origin`. The dashboard does not initialize the optional image handler. The overview's known-model count is the adapter's current in-memory catalog, not the live table. A missing image-generation status does not prove the feature is disabled: use `ccdx image-status` to check setup. Recent upstream error prose may contain sensitive details, so review the page before sharing screenshots.
|
|
234
234
|
|
|
235
235
|
The transparent, single-color double-peak favicon follows the dashboard's saved light/dark choice without a separate network request.
|
|
236
236
|
|
package/package.json
CHANGED
|
@@ -4,11 +4,17 @@ import os from "node:os";
|
|
|
4
4
|
import path from "node:path";
|
|
5
5
|
import { CODEX_GPT6_MODEL } from "./models.mjs";
|
|
6
6
|
|
|
7
|
-
//
|
|
8
|
-
// at commit 0a2eb4696c26ac33204bcd255721ab30220a4774.
|
|
9
|
-
//
|
|
10
|
-
//
|
|
7
|
+
// GPT-6 Sol/Luna compatibility metadata comes from OpenAI Codex's public models
|
|
8
|
+
// catalog at commit 0a2eb4696c26ac33204bcd255721ab30220a4774. GPT-6.1 Sol
|
|
9
|
+
// identity and defaults come from commit ab84d71f5767e4a565ce81c2c426287cb48c7918.
|
|
10
|
+
// The installed client's Astra or Sol entry supplies its schema and instructions.
|
|
11
11
|
const GPT6_COMPATIBILITY_SPECS = new Map([
|
|
12
|
+
["gpt-6.1-sol", Object.freeze({
|
|
13
|
+
display_name: "GPT-6.1-Sol",
|
|
14
|
+
description: "Latest workhorse model for coding and everyday work.",
|
|
15
|
+
default_reasoning_level: "low",
|
|
16
|
+
priority: 1,
|
|
17
|
+
})],
|
|
12
18
|
["gpt-6-sol", Object.freeze({
|
|
13
19
|
display_name: "GPT-6-Sol",
|
|
14
20
|
description: "Workhorse model for coding and everyday work.",
|
|
@@ -33,8 +39,12 @@ export { CODEX_GPT6_MODEL };
|
|
|
33
39
|
export const CODEX_APP_BINARY_PATHS = [
|
|
34
40
|
"/Applications/Codex.app/Contents/Resources/codex",
|
|
35
41
|
"/Applications/ChatGPT.app/Contents/Resources/codex",
|
|
42
|
+
"/Applications/Codex.app/Contents/Resources/codex-cli/CodexCLI.app/Contents/MacOS/codex",
|
|
43
|
+
"/Applications/ChatGPT.app/Contents/Resources/codex-cli/CodexCLI.app/Contents/MacOS/codex",
|
|
36
44
|
path.join(os.homedir(), "Applications", "Codex.app", "Contents", "Resources", "codex"),
|
|
37
45
|
path.join(os.homedir(), "Applications", "ChatGPT.app", "Contents", "Resources", "codex"),
|
|
46
|
+
path.join(os.homedir(), "Applications", "Codex.app", "Contents", "Resources", "codex-cli", "CodexCLI.app", "Contents", "MacOS", "codex"),
|
|
47
|
+
path.join(os.homedir(), "Applications", "ChatGPT.app", "Contents", "Resources", "codex-cli", "CodexCLI.app", "Contents", "MacOS", "codex"),
|
|
38
48
|
];
|
|
39
49
|
export const CODEX_MODEL_CATALOG_TIMEOUT_MS = 5_000;
|
|
40
50
|
export const CODEX_MODEL_CATALOG_MAX_BUFFER = 8 * 1024 * 1024;
|
|
@@ -96,7 +106,7 @@ function catalogModelForCopilot(model, copilotModels, { filterReasoning = false
|
|
|
96
106
|
const patched = {
|
|
97
107
|
...structuredClone(model),
|
|
98
108
|
visibility: "list",
|
|
99
|
-
supported_reasoning_levels: filterReasoning && reasoning.size
|
|
109
|
+
supported_reasoning_levels: filterReasoning && reasoning.size && Array.isArray(model.supported_reasoning_levels)
|
|
100
110
|
? model.supported_reasoning_levels.filter(({ effort }) => reasoning.has(effort))
|
|
101
111
|
: model.supported_reasoning_levels,
|
|
102
112
|
};
|
|
@@ -111,17 +121,18 @@ function catalogModelForCopilot(model, copilotModels, { filterReasoning = false
|
|
|
111
121
|
}
|
|
112
122
|
|
|
113
123
|
function compatibilityModel(codexCatalog, slug) {
|
|
114
|
-
const
|
|
124
|
+
const isGpt61Sol = slug === "gpt-6.1-sol";
|
|
125
|
+
const template = codexCatalog.models.find((model) => model.slug === (isGpt61Sol ? "gpt-6-sol" : CODEX_GPT6_MODEL));
|
|
115
126
|
const spec = GPT6_COMPATIBILITY_SPECS.get(slug);
|
|
116
|
-
if (!
|
|
127
|
+
if (!template || !spec || (isGpt61Sol && !Array.isArray(template.supported_reasoning_levels))) return null;
|
|
117
128
|
return {
|
|
118
|
-
...structuredClone(
|
|
129
|
+
...structuredClone(template),
|
|
119
130
|
...spec,
|
|
120
131
|
slug,
|
|
121
132
|
supports_parallel_tool_calls: true,
|
|
122
|
-
multi_agent_reasoning_effort: null,
|
|
133
|
+
multi_agent_reasoning_effort: isGpt61Sol ? "xhigh" : null,
|
|
123
134
|
supports_experimental_context: false,
|
|
124
|
-
minimal_client_version: "0.155.0",
|
|
135
|
+
minimal_client_version: isGpt61Sol ? "0.158.0" : "0.155.0",
|
|
125
136
|
};
|
|
126
137
|
}
|
|
127
138
|
|
|
@@ -141,7 +152,7 @@ export function buildCodexModelResponse({ copilotModels, codexCatalog } = {}) {
|
|
|
141
152
|
const models = codexCatalog.models.map((model) => {
|
|
142
153
|
if (!MANAGED_GPT6_MODELS.has(model.slug)) return model;
|
|
143
154
|
if (!isEligibleCopilotGpt6(copilotModels, model.slug)) return { ...model, visibility: "hide" };
|
|
144
|
-
return catalogModelForCopilot(model, copilotModels);
|
|
155
|
+
return catalogModelForCopilot(model, copilotModels, { filterReasoning: model.slug === "gpt-6.1-sol" });
|
|
145
156
|
});
|
|
146
157
|
for (const slug of GPT6_COMPATIBILITY_SPECS.keys()) {
|
|
147
158
|
if (bundledSlugs.has(slug) || !isEligibleCopilotGpt6(copilotModels, slug)) continue;
|
package/src/dashboard/index.html
CHANGED
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
<article class="card"><h2>ADAPTER</h2><strong id="version">—</strong><p id="uptime">—</p></article>
|
|
28
28
|
<article class="card"><h2>COPILOT</h2><strong id="copilot">—</strong><p id="token">—</p></article>
|
|
29
29
|
<article class="card"><h2>KNOWN MODELS</h2><strong id="models">—</strong><p id="model-source">—</p></article>
|
|
30
|
-
<article class="card"><h2>REQUESTS</h2><strong id="requests">—</strong><p id="request-errors">—</p></article>
|
|
30
|
+
<article class="card"><h2>REQUESTS</h2><strong id="requests">—</strong><p id="request-errors">—</p><p>Per-request limits (active)<br><span id="body-limits">—</span></p></article>
|
|
31
31
|
</section>
|
|
32
32
|
|
|
33
33
|
<section class="details" aria-label="Runtime details">
|
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
<p class="hint">HTTP 2xx != model completed.</p>
|
|
38
38
|
</article>
|
|
39
39
|
<article class="panel">
|
|
40
|
-
<div class="panel-heading"><h2>LOCAL HISTORY</h2><span>
|
|
40
|
+
<div class="panel-heading"><h2>LOCAL HISTORY</h2><span>ACTIVE LIMIT</span></div>
|
|
41
41
|
<strong id="history">—</strong><progress id="history-meter" class="meter" max="100" value="0" aria-label="History cache usage"></progress>
|
|
42
42
|
<p id="history-detail" class="hint">—</p>
|
|
43
43
|
</article>
|
package/src/dashboard/ui.js
CHANGED
|
@@ -50,6 +50,7 @@ function render(data) {
|
|
|
50
50
|
const requests = data.requests || {};
|
|
51
51
|
text("requests", number(requests.total));
|
|
52
52
|
text("request-errors", `4xx ${number(requests.status_4xx)} / 5xx ${number(requests.status_5xx)} / active ${number(requests.active)}`);
|
|
53
|
+
text("body-limits", `raw ${mib(data.limits?.max_body_bytes)} / decoded ${mib(data.limits?.max_decoded_body_bytes)}`);
|
|
53
54
|
|
|
54
55
|
const outcomes = data.stream_performance?.by_route?.responses?.terminal_outcomes?.totals || {};
|
|
55
56
|
for (const key of ["completed", "incomplete", "failed", "cancelled"]) text(key, number(outcomes[key]));
|