@minhspark/codex-mcp-bridge 1.21.4 → 1.21.5
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/.codex-plugin/plugin.json +1 -1
- package/CHANGELOG.md +10 -0
- package/README.md +2 -2
- package/package.json +1 -1
- package/plugin.json +1 -1
- package/scripts/install-native-relay.mjs +1 -1
- package/scripts/publish-repo-analytics.mjs +22 -2
- package/src/claude-bridge.mjs +1 -1
- package/src/index.mjs +1 -1
- package/src/native-relay-companion.mjs +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,16 @@ Follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and [SemVer](ht
|
|
|
4
4
|
|
|
5
5
|
## [Unreleased]
|
|
6
6
|
|
|
7
|
+
## [1.21.5] - 2026-10-11
|
|
8
|
+
|
|
9
|
+
### Fixed
|
|
10
|
+
|
|
11
|
+
- README npm download badges no longer show "rate limited by upstream service". The total and monthly badges are now rendered from the archived daily npm totals and served from the analytics branch, refreshed hourly, instead of shields.io.
|
|
12
|
+
|
|
13
|
+
### Upgrade notes
|
|
14
|
+
|
|
15
|
+
- MCP behavior is unchanged.
|
|
16
|
+
|
|
7
17
|
## [1.21.4] - 2026-10-11
|
|
8
18
|
|
|
9
19
|
### Added
|
package/README.md
CHANGED
|
@@ -7,8 +7,8 @@
|
|
|
7
7
|
Local Desktop handoff guides: [daily workflow and directory verification](docs/daily-handoffs.md), [new-machine setup and permissions](docs/new-machine-setup.md), and [project onboarding](docs/project-onboarding.md).
|
|
8
8
|
|
|
9
9
|
[](https://www.npmjs.com/package/@minhspark/codex-mcp-bridge)
|
|
10
|
-
[](https://www.npmjs.com/package/@minhspark/codex-mcp-bridge)
|
|
11
|
+
[](https://www.npmcharts.com/compare/%40minhspark%2Fcodex-mcp-bridge?minimal=true)
|
|
12
12
|
[](https://github.com/buidangminh23/codex-mcp-bridge/network/dependents)
|
|
13
13
|
[](https://skills.sh/buidangminh23/codex-mcp-bridge/codex-bridge)
|
|
14
14
|
[](https://buidangminh23.github.io/codex-mcp-bridge/)
|
package/package.json
CHANGED
package/plugin.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json",
|
|
3
3
|
"name": "codex-mcp-bridge",
|
|
4
|
-
"version": "1.21.
|
|
4
|
+
"version": "1.21.5",
|
|
5
5
|
"description": "Connect ChatGPT to your own Codex Desktop projects and conversations.",
|
|
6
6
|
"author": {
|
|
7
7
|
"name": "Bui Dang Minh",
|
|
@@ -23,7 +23,7 @@ import { enableCodexFullAccess, fullAccessEnabled } from "../src/codex-full-acce
|
|
|
23
23
|
|
|
24
24
|
exitForVersionRequest(import.meta.url);
|
|
25
25
|
|
|
26
|
-
const VERSION = "1.21.
|
|
26
|
+
const VERSION = "1.21.5";
|
|
27
27
|
const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..");
|
|
28
28
|
const entry = path.join(root, "src", "mcp-supervisor.mjs");
|
|
29
29
|
const entryArgs = ["native-relay-companion.mjs"];
|
|
@@ -121,11 +121,31 @@ export function renderGithubViewsBadge(data, { now = Date.now() } = {}) {
|
|
|
121
121
|
const message = format(value) + age;
|
|
122
122
|
const color = value == null ? '#555' : stale || undated ? '#92400e' : '#0369a1';
|
|
123
123
|
const detail = `${validWindow ? `${start} to ${end} UTC` : 'Source window unavailable'}. Source: ${displayTime(time)}. Archived badge; freshness is relative to generation time.`;
|
|
124
|
+
return renderBadge(label, message, color, detail);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
function renderBadge(label, message, color, detail) {
|
|
124
128
|
const labelWidth = Math.ceil([...label].length * 7.2 + 16);
|
|
125
129
|
const messageWidth = Math.ceil([...message].length * 7.2 + 16);
|
|
126
130
|
const width = labelWidth + messageWidth;
|
|
127
131
|
const accessible = `${label}: ${message}`;
|
|
128
|
-
return `<svg xmlns="http://www.w3.org/2000/svg" width="${width}" height="24" viewBox="0 0 ${width} 24" role="img" aria-label="${escapeXml(accessible)}"><title>${escapeXml(`${accessible}. ${detail}`)}</title><rect width="${width}" height="24" rx="4" fill="#555"/><path d="M${labelWidth} 0H${width - 4}Q${width} 0 ${width} 4V20Q${width} 24 ${width - 4} 24H${labelWidth}Z" fill="${color}"/><g fill="#fff" font-family="DejaVu Sans Mono,monospace" font-size="12" text-anchor="middle"><text x="${labelWidth / 2}" y="16">${escapeXml(label)}</text><text x="${labelWidth + messageWidth / 2}" y="16">${escapeXml(message)}</text></g></svg
|
|
132
|
+
return `<svg xmlns="http://www.w3.org/2000/svg" width="${width}" height="24" viewBox="0 0 ${width} 24" role="img" aria-label="${escapeXml(accessible)}"><title>${escapeXml(`${accessible}. ${detail}`)}</title><rect width="${width}" height="24" rx="4" fill="#555"/><path d="M${labelWidth} 0H${width - 4}Q${width} 0 ${width} 4V20Q${width} 24 ${width - 4} 24H${labelWidth}Z" fill="${color}"/><g fill="#fff" font-family="DejaVu Sans Mono,monospace" font-size="12" text-anchor="middle"><text x="${labelWidth / 2}" y="16">${escapeXml(label)}</text><text x="${labelWidth + messageWidth / 2}" y="16">${escapeXml(message)}</text></g></svg>
|
|
133
|
+
`;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
export function renderNpmDownloadsBadge(data, { now = Date.now(), period = 'archive' } = {}) {
|
|
137
|
+
const snapshot = [...data.snapshots].sort((a, b) => String(b.collectedAt).localeCompare(String(a.collectedAt))).find(row => row.npm);
|
|
138
|
+
const time = snapshot?.sourceCollectedAt?.npm;
|
|
139
|
+
const rows = period === 'window' ? snapshot?.npm?.downloads || [] : Object.entries(data.daily?.npm || {}).map(([day, row]) => ({ day, downloads: row.downloads }));
|
|
140
|
+
const days = rows.map(row => row.day).filter(Boolean).sort();
|
|
141
|
+
const value = rows.length && rows.every(row => row.downloads != null) ? rows.reduce((total, row) => total + row.downloads, 0) : null;
|
|
142
|
+
const label = period === 'window' ? `npm downloads / ${days.length ? `${days.length}d` : 'window'}` : 'npm downloads';
|
|
143
|
+
const undated = !date(time);
|
|
144
|
+
const stale = !undated && now - Date.parse(time) > staleAfter;
|
|
145
|
+
const message = format(value) + (value == null ? '' : undated ? ' · undated' : stale ? ' · stale' : '');
|
|
146
|
+
const color = value == null ? '#555' : stale || undated ? '#92400e' : '#CB3837';
|
|
147
|
+
const detail = `${days.length ? `${days[0]} to ${days.at(-1)} UTC` : 'Source window unavailable'}. Source: ${displayTime(time)}. Archived daily npm totals; freshness is relative to generation time.`;
|
|
148
|
+
return renderBadge(label, message, color, detail);
|
|
129
149
|
}
|
|
130
150
|
|
|
131
151
|
export function renderLiveDashboard(data) {
|
|
@@ -218,7 +238,7 @@ export function publicFiles(history, usage) {
|
|
|
218
238
|
const table = ['| Date (UTC) | Views | Unique visitors | Clones | Unique cloners | npm downloads | Active installations |', '|---|---:|---:|---:|---:|---:|---:|', ...days.map(day => `| ${day} | ${[data.daily.views[day]?.count, data.daily.views[day]?.uniques, data.daily.clones[day]?.count, data.daily.clones[day]?.uniques, data.daily.npm[day]?.downloads, usageDays[day]].map(format).join(' | ')} |`)].join('\n');
|
|
219
239
|
const readme = `# Public repository analytics\n\n\n\n[Aggregate JSON history](data.json) · [Repository](https://github.com/${data.repo})\n\nAll dates and source windows use UTC. Source timestamps on the dashboard show when each metric was last available. Downloads and clones include automation and do not measure people. Unique visitors/cloners apply only to the source window; never sum daily unique counts across dates. Active installations cover consenting installations only, with distinct counts for each whole period. Operating system and version breakdowns cover 30 days; an installation may appear in multiple version groups after upgrading.\n\nThis branch contains only aggregate statistics. No installation identifiers, prompts, account details, credentials, private error messages, or local paths are published. Missing metrics mean unavailable, not zero.\n\n## Daily history\n\nEvery archived source day is listed below, newest first. Active installations count consenting installations that reported that UTC day.\n\n${table}\n`;
|
|
220
240
|
const pagesUrl = `https://${data.repo.split('/')[0]}.github.io/${data.repo.split('/')[1]}/`;
|
|
221
|
-
return { 'stats-github-views.svg': renderGithubViewsBadge(data), 'dashboard.svg': renderPublicDashboard(data), 'README.md': readme.replace('![Repository dashboard]', `[Live dashboard · refreshes every 30 seconds](${pagesUrl})\n\n![Repository dashboard]`), 'data.json': `${JSON.stringify(data, null, 2)}\n`, 'index.html': renderLiveDashboard(data) };
|
|
241
|
+
return { 'stats-github-views.svg': renderGithubViewsBadge(data), 'stats-npm-downloads.svg': renderNpmDownloadsBadge(data), 'stats-npm-downloads-month.svg': renderNpmDownloadsBadge(data, { period: 'window' }), 'dashboard.svg': renderPublicDashboard(data), 'README.md': readme.replace('![Repository dashboard]', `[Live dashboard · refreshes every 30 seconds](${pagesUrl})\n\n![Repository dashboard]`), 'data.json': `${JSON.stringify(data, null, 2)}\n`, 'index.html': renderLiveDashboard(data) };
|
|
222
242
|
}
|
|
223
243
|
|
|
224
244
|
export function githubEnvironment(token, env = process.env) {
|
package/src/claude-bridge.mjs
CHANGED
|
@@ -29,7 +29,7 @@ import { registerProjectOnboardingTools } from "./project-onboarding-tools.mjs";
|
|
|
29
29
|
|
|
30
30
|
exitForVersionRequest(import.meta.url);
|
|
31
31
|
|
|
32
|
-
const VERSION = "1.21.
|
|
32
|
+
const VERSION = "1.21.5";
|
|
33
33
|
void import("./telemetry.mjs").then(({ startUsageReporting }) => startUsageReporting({ version: VERSION })).catch(() => {});
|
|
34
34
|
const FORWARD_MIN_INTERVAL_MS = 5000;
|
|
35
35
|
const FORWARD_MAX_PER_SESSION = 50;
|
package/src/index.mjs
CHANGED
|
@@ -39,7 +39,7 @@ import { PROJECT_SETUP_TOOLS, registerProjectOnboardingTools } from "./project-o
|
|
|
39
39
|
|
|
40
40
|
exitForVersionRequest(import.meta.url);
|
|
41
41
|
|
|
42
|
-
const VERSION = "1.21.
|
|
42
|
+
const VERSION = "1.21.5";
|
|
43
43
|
void import("./telemetry.mjs").then(({ startUsageReporting }) => startUsageReporting({ version: VERSION })).catch(() => {});
|
|
44
44
|
const log = (msg) => process.stderr.write(`[codex-mcp-bridge] ${msg}\n`);
|
|
45
45
|
|
|
@@ -36,7 +36,7 @@ import { NativeCreationReceipts, creationIdValid } from "./native-creation-recei
|
|
|
36
36
|
|
|
37
37
|
exitForVersionRequest(import.meta.url);
|
|
38
38
|
|
|
39
|
-
const VERSION = "1.21.
|
|
39
|
+
const VERSION = "1.21.5";
|
|
40
40
|
const log = (msg) => process.stderr.write(`[native-relay] ${msg}\n`);
|
|
41
41
|
|
|
42
42
|
function errorResponse(code, message, sent) {
|