@numa-tech/numa 1.12.4 → 1.12.6

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 CHANGED
@@ -23,23 +23,18 @@
23
23
  npm config set @numa-tech:registry=https://registry.npmjs.org/
24
24
  ```
25
25
 
26
- 公司私有 registry 仍受支持,可通过 `numa config --set registryUrl=<url>` 或 shortcut
27
- `--registry-url <url>` 显式选择。发布人员先使用 `npm run release -- patch --tag=candidate`;脚本锁步更新
28
- 所有 workspace 的版本与内部精确依赖,并按依赖顺序将每个包的同一份 tarball 依次推送到
29
- 公共 npm 和公司私有 registry 的 `candidate` tag,不改动 `latest`。已存在且 integrity/tag 一致的目标会被跳过;部分失败时使用
30
- `npm run release:resume` 从持久化状态补推,不会再次修改版本或重新生成 tarball。
31
- 可用 `NUMA_PUBLIC_NPM_REGISTRY`、`NUMA_PRIVATE_NPM_REGISTRY` 覆盖两个发布目标。旧版配置
32
- 中作为默认值保存的私有 registry 会自动迁移到公共 npm;迁移后显式设置的私有地址会保留。
26
+ 客户端仍可通过 `numa config --set registryUrl=<url>` 或 shortcut 的 `--registry-url <url>`
27
+ 选择兼容的 npm 镜像或代理;这只影响安装与启动。Numa 的正式发布目标固定为
28
+ `https://registry.npmjs.org/`,发布脚本不再向任何私有 registry 上传包。
33
29
 
34
- 发布前需要在用户或 CI 的 `.npmrc` 中分别配置两个 registry 的令牌:
30
+ 发布前需要在用户或 CI 的 `.npmrc` 中配置公共 npm 令牌:
35
31
 
36
32
  ```ini
37
33
  //registry.npmjs.org/:_authToken=${NPM_PUBLIC_TOKEN}
38
- //packages.aliyun.com/60371955c4393f5ed3b7baa8/npm/npm-registry/:_authToken=${NPM_PRIVATE_TOKEN}
39
34
  ```
40
35
 
41
- 脚本会先检查 Git 工作区干净、当前分支与 upstream 完全同步,再于修改版本号之前检查两个
42
- registry 的身份以及公共 npm `@tokensrc`、`@numa-tech` scope 权限。使用验证器 App 的
36
+ 脚本会先检查 Git 工作区干净、当前分支与 upstream 完全同步,再于修改版本号之前检查公共
37
+ npm 身份以及 `@tokensrc`、`@numa-tech` scope 权限。使用验证器 App 的
43
38
  本地交互发布会在公共 npm 推送前隐藏输入 6 位 OTP,并显式传给 `npm publish`;
44
39
  使用带 bypass 2FA 权限的 granular token 时直接回车即可。非交互环境可以临时提供
45
40
  `NUMA_PUBLIC_NPM_OTP`,更推荐使用 bypass 2FA granular token 或 npm trusted publishing。
@@ -53,44 +48,67 @@ npm org ls numa-tech --registry=https://registry.npmjs.org/
53
48
  npm org ls tokensrc --registry=https://registry.npmjs.org/
54
49
  ```
55
50
 
56
- 双仓库发布命令:
51
+ ## 标准发布流程
52
+
53
+ 所有 workspace 包必须锁步发布,并严格执行 `candidate → 验收 → latest`。禁止直接发布到
54
+ `latest`,也不要单独手工发布某一个 workspace 包。
57
55
 
58
56
  ```bash
59
- # 仅预览:1.12.0 -> 1.12.1,默认 candidate,不修改文件、不访问 registry
57
+ # 1. 确认 main 与远端同步,并验证公共 npm 身份
58
+ git switch main
59
+ git pull --ff-only
60
+ npm whoami --registry=https://registry.npmjs.org/
61
+
62
+ # 2. 预览下一个 patch 版本;不修改文件、不访问 npm
60
63
  npm run release -- patch --dry-run
61
64
 
62
- # 候选 patch:全量验证、双发到 candidate,成功后提交、打 tag 并原子推送
65
+ # 3. 发布 candidate;脚本自动检查、构建、打包、发布、提交、打 tag 并原子推送
63
66
  npm run release -- patch --tag=candidate
64
67
 
65
- # 线上验收通过后,显式把同一候选版本晋级为 latest
66
- npm run release:promote -- 1.12.1 --from-tag=candidate
68
+ # 4. 使用 candidate 做安装与功能验收
69
+ npx -y --prefer-online --registry=https://registry.npmjs.org/ @numa-tech/numa@candidate --version
70
+ npx -y --prefer-online --registry=https://registry.npmjs.org/ @numa-tech/numa@candidate codex status --json
67
71
 
68
- # 候选 minor / 指定完整版本(也可显式附加 --tag=next)
69
- npm run release -- minor
70
- npm run release -- 2.0.0
72
+ # 5. 验收通过后,将 X.Y.Z 替换为本次 candidate 的实际版本并晋级 latest
73
+ npm run release:promote -- X.Y.Z --from-tag=candidate
71
74
 
72
- # 某个目标失败后恢复;查询两个 registry 并复用原 tarball/integrity
73
- npm run release:resume
75
+ # 6. 确认三个公共包的 latest 均已更新
76
+ npm dist-tag ls @numa-tech/cli-auth --registry=https://registry.npmjs.org/
77
+ npm dist-tag ls @tokensrc/codex --registry=https://registry.npmjs.org/
78
+ npm dist-tag ls @numa-tech/numa --registry=https://registry.npmjs.org/
74
79
  ```
75
80
 
76
- 候选发布只有在全部包的两个 registry integrity candidate tag 都校验成功后,脚本才会创建
77
- `chore(release): vX.Y.Z` commit、附注 tag,并以一次 atomic push 推送分支和 tag。部分失败
78
- 不会 commit 或打 tag,也不会尝试回滚 npm 的不可变版本。晋级命令会先验证干净且同步的
79
- release commit/tag、两个 registry 的候选 tag 及跨 registry integrity,再幂等更新 `latest`;
80
- 它不修改源码或 Git 历史。
81
+ 候选发布只有在三个公共包的 exact-version integrity `candidate` tag 都校验成功后,脚本才会
82
+ 创建 `chore(release): vX.Y.Z` commit、附注 tag,并以一次 atomic push 推送分支和 tag
83
+ 如果发布中断,运行 `npm run release:resume`;它会复用持久化的原始 tarball 和 integrity,跳过
84
+ 已经成功的包。不要重新执行普通 patch 发布,否则可能开始下一个版本。晋级命令会验证干净且
85
+ 同步的 release commit/tag、公共 npm 上的候选版本与 tag,再使用权威 `npm dist-tag ls` 接口
86
+ 幂等更新并校验 `latest`;它不修改源码或 Git 历史。
87
+
88
+ 发布 minor、major 或指定版本时,仅替换第 2、3 步的版本参数:
89
+
90
+ ```bash
91
+ npm run release -- minor --dry-run
92
+ npm run release -- minor --tag=candidate
93
+ npm run release -- 2.0.0 --dry-run
94
+ npm run release -- 2.0.0 --tag=candidate
95
+ ```
81
96
 
82
97
  macOS / Windows 日常启动 Codex 的推荐方式:
83
98
 
84
99
  ```bash
85
100
  npx -y --prefer-online --registry=https://registry.npmjs.org/ @numa-tech/numa@latest codex shortcut install
101
+ numa --version
102
+ numa codex list
86
103
  numa-codex
87
104
  numa-codex-app
88
105
  ```
89
106
 
90
107
  面向业务同事的图文说明见 [`docs/chatgpt-cli-guide.html`](docs/chatgpt-cli-guide.html),其中分别介绍
91
- CLI 与桌面版的适用场景、一次安装两个入口、首次登录和常见问题排查。
108
+ CLI 与桌面版的适用场景、一次安装自动更新的 `numa` 命令与两个 Codex 入口、首次登录和常见问题排查。
92
109
 
93
- 需要直接使用完整 `numa` 管理命令时,可选全局安装:
110
+ 上述安装器生成的 `numa` 是托管 launcher,完整管理命令也会自动解析 `@latest`。需要在 CI、离线环境
111
+ 或其他可复现流程中固定版本时,才建议使用全局或精确版本安装:
94
112
 
95
113
  ```bash
96
114
  npm install --global --registry=https://registry.npmjs.org/ @numa-tech/numa
@@ -184,7 +202,7 @@ numa config \
184
202
  | `numa codex run` | 需登录 | 使用所选账号启动官方 Codex CLI |
185
203
  | `numa codex app` | 需登录 | 使用官方 ChatGPT 登录启动桌面 App |
186
204
  | `numa codex shortcut` | 公开 | 安装或删除 macOS/Windows 快捷命令与桌面入口 |
187
- | `numa codex status` | 公开 | 查看本地选择和官方登录状态 |
205
+ | `numa codex status` | 公开 | 查看本地选择、官方登录状态和 ChatGPT Desktop 版本 |
188
206
  | `numa codex reset` | 公开 | 重置本地选择和登录并清理旧 provider 残留 |
189
207
  | `numa serve` | 公开 | 启动兼容 MCP 服务 |
190
208
 
@@ -509,12 +527,15 @@ ChatGPT 个人账号;无需把本地登录文件或令牌附在工单中。
509
527
  ### macOS / Windows 快捷入口
510
528
 
511
529
  日常使用优先安装快捷入口,无需全局安装 `@numa-tech/numa`。安装命令显式解析
512
- `@numa-tech/numa@latest`,生成的快捷入口也会在每次启动时使用 `--prefer-online`
530
+ `@numa-tech/numa@latest`,生成的通用 `numa` launcher 与 Codex 快捷入口也会在每次启动时使用 `--prefer-online`
513
531
  检查 npm 仓库中的最新客户端版本:
514
532
 
515
533
  ```bash
516
534
  npx -y --prefer-online --registry=https://registry.npmjs.org/ @numa-tech/numa@latest codex shortcut install
517
535
 
536
+ # 完整 Numa 管理命令同样自动使用 latest
537
+ numa codex list
538
+
518
539
  # 日常首选;首次运行会自动完成公司登录和账号选择
519
540
  numa-codex
520
541
 
@@ -528,12 +549,14 @@ numa-codex-app
528
549
  `--prefer-online` 会在启动时强制检查仓库元数据,`@latest` 避免复用项目内可能存在的旧版
529
550
  `@numa-tech/numa`;已经缓存的相同版本仍由 npm 复用。自动更新要求配置的 npm registry 可访问,
530
551
  并以仓库 `latest` dist-tag 指向的版本为准。已安装旧版快捷入口的用户重新执行一次上述安装
531
- 命令,即可升级为自动检查最新版的包装脚本。快捷入口默认从公共 npm 获取 Numa CLI;
552
+ 命令,即可升级为自动检查最新版的包装脚本。若 `numa` 是指向同一 `@numa-tech/numa` 包的旧 npm
553
+ symlink,安装器会先核验包名与 `bin` 入口,再将其迁移为托管 launcher;卸载快捷入口时会在原包仍
554
+ 存在的前提下恢复该 symlink。快捷入口默认从公共 npm 获取 Numa CLI;
532
555
  启动 Codex 时仍按 `NUMA_CODEX_BIN`、PATH 中可用版本、包内版本的顺序选择。
533
556
 
534
- 默认安装 `run` 和 `app` 两种入口。macOS 默认的 `--scope auto` 会先使用可写的
557
+ 默认安装通用 `numa` launcher,以及 `run` 和 `app` 两种 Codex 入口。macOS 默认的 `--scope auto` 会先使用可写的
535
558
  `/usr/local/bin` 与 `/Applications`;没有系统级权限时自动降级到
536
- `~/.local/bin/numa-codex*` 与 `~/Applications/Numa Codex.app`,全程不会
559
+ `~/.local/bin/numa`、`~/.local/bin/numa-codex*` 与 `~/Applications/Numa Codex.app`,全程不会
537
560
  调用 `sudo`。可用 `--scope system` 或 `--scope user` 显式指定。Windows 写入用户 npm 命令目录,并在开始菜单
538
561
  创建 `Numa Codex`。macOS App Bundle 使用 ChatGPT macOS 应用内置图标,Windows 开始菜单
539
562
  入口使用由同一图标转换的 Windows 图标;来源和商标说明见 `THIRD_PARTY_NOTICES.md`。桌面入口默认绑定安装命令
@@ -546,7 +569,8 @@ npx -y --prefer-online --registry=https://registry.npmjs.org/ @numa-tech/numa@la
546
569
  ```
547
570
 
548
571
  安装是幂等的,并拒绝覆盖同名的用户文件;确需替换时使用 `--force`。删除只处理安装清单中
549
- 由 numa 管理的入口:
572
+ 由 numa 管理的入口。明确要保留现有全局 `numa` 时,可在安装或删除命令中使用
573
+ `--no-cli-wrapper`:
550
574
 
551
575
  ```bash
552
576
  npx -y --prefer-online --registry=https://registry.npmjs.org/ @numa-tech/numa@latest codex shortcut remove
@@ -580,6 +604,10 @@ Codex 的主机不会受包内平台可选依赖缺失影响;外部版本不
580
604
 
581
605
  ### Codex 桌面 App
582
606
 
607
+ > **版本提醒:请勿主动升级 ChatGPT Desktop,也不要点击“检查更新”。** 如果应用弹出更新提示,
608
+ > 请选择“稍后”或“取消”,并继续通过 `Numa Codex`、`numa-codex-app` 或 `numa codex app`
609
+ > 启动,由 Numa 检查并使用公司批准版本。
610
+
583
611
  官方 Codex CLI、IDE 扩展和桌面 App 共享 `~/.codex/auth.json`。macOS/Windows 可直接运行:
584
612
 
585
613
  ```bash
@@ -593,9 +621,24 @@ numa codex app . \
593
621
  2. 从服务端领取不含 refresh token 的官方登录凭据;
594
622
  3. 原子更新 ChatGPT 模式 `auth.json`;
595
623
  4. 清理项目更名前旧版 `mcex-codex` provider 残留;
596
- 5. 直接启动官方 `codex app`。
597
-
598
- 如果桌面 App 已经运行,需要完全退出后重新打开。`numa codex status` 可检查所选账号是否与官方登录文件匹配。
624
+ 5. Apple Silicon macOS 读取 `ChatGPT.app/Contents/Info.plist`;检测到 2026 年 8 月批次
625
+ (`26.8` / `26.8xx`)或更高版本时,自动回退到批准版本 `26.730.61639 (6234)`;
626
+ 6. 直接启动官方 `codex app`。
627
+
628
+ 回退包固定从
629
+ `https://mci-maint.oss-cn-shenzhen.aliyuncs.com/apps/chatgpt-26-730-61639.zip`
630
+ 下载并缓存到用户缓存目录。客户端会先核验大小、固定 SHA-256、Bundle ID、目标版本以及
631
+ OpenAI Developer ID 签名,再停止正在运行的 ChatGPT,以同卷临时目录完成原子替换。下载、
632
+ 解压或安装后校验失败时保留或恢复原 App;目标版本及更早的 2026 年 7 月批次不会下载或改动。
633
+ 批准包 SHA-256 为
634
+ `da88c8a15eab1ddc8efdf50182d4aca7468d995193d952c344a4d10d38c45871`。
635
+ `NUMA_CHATGPT_APP_PATH` 可显式指定受管 App 路径。
636
+ 该守卫不会修改 ChatGPT 自带更新策略,而是在每次通过 Numa 启动桌面版时重新检查;需要长期
637
+ 禁止应用内更新时,应由组织管理员通过 ChatGPT Managed configuration/MDM 下发更新策略。
638
+
639
+ 如果桌面 App 已经运行,需要完全退出后重新打开。`numa codex status` 可同时检查所选账号、
640
+ 官方登录文件和本机 ChatGPT Desktop 版本。该回退属于企业批准版本部署;旧版本不获得单独的
641
+ 安全补丁,发布负责人应持续评估兼容性并及时更新批准版本。
599
642
 
600
643
  ### 前台官方登录同步
601
644
 
@@ -0,0 +1,38 @@
1
+ import type { CodexDesktopAppStatus } from "@tokensrc/codex";
2
+ export declare const MANAGED_CHATGPT_VERSION = "26.730.61639";
3
+ export declare const MANAGED_CHATGPT_BUILD = "6234";
4
+ export declare const CHATGPT_ROLLBACK_THRESHOLD = "26.8";
5
+ export declare const CHATGPT_DESKTOP_UPDATE_REMINDER = "\u3010\u7248\u672C\u63D0\u9192\u3011\u8BF7\u52FF\u4E3B\u52A8\u5347\u7EA7 ChatGPT Desktop\uFF0C\u4E5F\u4E0D\u8981\u70B9\u51FB\u201C\u68C0\u67E5\u66F4\u65B0\u201D\uFF1B\u5982\u51FA\u73B0\u66F4\u65B0\u63D0\u793A\uFF0C\u8BF7\u9009\u62E9\u201C\u7A0D\u540E\u201D\u6216\u201C\u53D6\u6D88\u201D\uFF0C\u5E76\u7EE7\u7EED\u901A\u8FC7 Numa \u542F\u52A8\u3002";
6
+ export declare const MANAGED_CHATGPT_DOWNLOAD_URL = "https://mci-maint.oss-cn-shenzhen.aliyuncs.com/apps/chatgpt-26-730-61639.zip";
7
+ export declare const MANAGED_CHATGPT_ARCHIVE_BYTES = 568041035;
8
+ export declare const MANAGED_CHATGPT_ARCHIVE_SHA256 = "da88c8a15eab1ddc8efdf50182d4aca7468d995193d952c344a4d10d38c45871";
9
+ interface BundleMetadata {
10
+ bundleId: string;
11
+ version: string;
12
+ build: string;
13
+ }
14
+ export interface ChatGptDesktopDependencies {
15
+ platform?: NodeJS.Platform;
16
+ architecture?: string;
17
+ homeDirectory?: string;
18
+ env?: NodeJS.ProcessEnv;
19
+ appPaths?: string[];
20
+ cacheDirectory?: string;
21
+ fetch?: typeof fetch;
22
+ output?: NodeJS.WritableStream;
23
+ readMetadata?: (appPath: string) => Promise<BundleMetadata>;
24
+ obtainArchive?: () => Promise<string>;
25
+ extractArchive?: (archivePath: string, destination: string) => Promise<string>;
26
+ verifySignature?: (appPath: string) => Promise<void>;
27
+ stopApp?: () => Promise<void>;
28
+ }
29
+ export interface ChatGptDesktopPreparation {
30
+ action: "not-supported" | "not-installed" | "not-required" | "reinstalled";
31
+ before: CodexDesktopAppStatus;
32
+ after?: CodexDesktopAppStatus;
33
+ }
34
+ /** ChatGPT release versions use YY.MDD.build; `26.8` means the start of August 2026. */
35
+ export declare function requiresChatGptRollback(version: string): boolean;
36
+ export declare function inspectChatGptDesktop(dependencies?: ChatGptDesktopDependencies): Promise<CodexDesktopAppStatus>;
37
+ export declare function ensureManagedChatGptDesktop(dependencies?: ChatGptDesktopDependencies): Promise<ChatGptDesktopPreparation>;
38
+ export {};
@@ -0,0 +1,356 @@
1
+ import { execFile as execFileCallback } from "node:child_process";
2
+ import { createHash, randomUUID } from "node:crypto";
3
+ import { createReadStream, constants } from "node:fs";
4
+ import { access, lstat, mkdir, mkdtemp, open, rename, rm } from "node:fs/promises";
5
+ import { homedir } from "node:os";
6
+ import { dirname, join, resolve } from "node:path";
7
+ import { promisify } from "node:util";
8
+ export const MANAGED_CHATGPT_VERSION = "26.730.61639";
9
+ export const MANAGED_CHATGPT_BUILD = "6234";
10
+ export const CHATGPT_ROLLBACK_THRESHOLD = "26.8";
11
+ export const CHATGPT_DESKTOP_UPDATE_REMINDER = "【版本提醒】请勿主动升级 ChatGPT Desktop,也不要点击“检查更新”;如出现更新提示,请选择“稍后”或“取消”,并继续通过 Numa 启动。";
12
+ export const MANAGED_CHATGPT_DOWNLOAD_URL = "https://mci-maint.oss-cn-shenzhen.aliyuncs.com/apps/chatgpt-26-730-61639.zip";
13
+ export const MANAGED_CHATGPT_ARCHIVE_BYTES = 568_041_035;
14
+ export const MANAGED_CHATGPT_ARCHIVE_SHA256 = "da88c8a15eab1ddc8efdf50182d4aca7468d995193d952c344a4d10d38c45871";
15
+ const CHATGPT_BUNDLE_ID = "com.openai.codex";
16
+ const OPENAI_TEAM_ID = "2DC432GLL2";
17
+ const MAX_DOWNLOAD_BYTES = 650 * 1024 * 1024;
18
+ const execFile = promisify(execFileCallback);
19
+ function appCandidates(dependencies) {
20
+ if (dependencies.appPaths)
21
+ return dependencies.appPaths;
22
+ const env = dependencies.env ?? process.env;
23
+ const home = dependencies.homeDirectory ?? homedir();
24
+ if (env.NUMA_CHATGPT_APP_PATH?.trim()) {
25
+ return [resolve(env.NUMA_CHATGPT_APP_PATH.trim())];
26
+ }
27
+ return [
28
+ join(home, "Applications", "ChatGPT.app"),
29
+ "/Applications/ChatGPT.app"
30
+ ];
31
+ }
32
+ async function runCommand(command, args) {
33
+ const result = await execFile(command, args, {
34
+ encoding: "utf8",
35
+ maxBuffer: 4 * 1024 * 1024,
36
+ windowsHide: true
37
+ });
38
+ return {
39
+ stdout: result.stdout,
40
+ stderr: result.stderr
41
+ };
42
+ }
43
+ async function plistValue(appPath, key) {
44
+ const { stdout } = await runCommand("/usr/bin/plutil", [
45
+ "-extract",
46
+ key,
47
+ "raw",
48
+ "-o",
49
+ "-",
50
+ join(appPath, "Contents", "Info.plist")
51
+ ]);
52
+ return stdout.trim();
53
+ }
54
+ async function defaultReadMetadata(appPath) {
55
+ const [bundleId, version, build] = await Promise.all([
56
+ plistValue(appPath, "CFBundleIdentifier"),
57
+ plistValue(appPath, "CFBundleShortVersionString"),
58
+ plistValue(appPath, "CFBundleVersion")
59
+ ]);
60
+ return { bundleId, version, build };
61
+ }
62
+ function numericVersionParts(version) {
63
+ const parts = version.trim().split(".");
64
+ return parts.length >= 2 && parts.every((part) => /^\d+$/u.test(part))
65
+ ? parts
66
+ : undefined;
67
+ }
68
+ /** ChatGPT release versions use YY.MDD.build; `26.8` means the start of August 2026. */
69
+ export function requiresChatGptRollback(version) {
70
+ const parts = numericVersionParts(version);
71
+ const threshold = numericVersionParts(CHATGPT_ROLLBACK_THRESHOLD);
72
+ if (!parts || !threshold)
73
+ return false;
74
+ const year = Number(parts[0]);
75
+ const thresholdYear = Number(threshold[0]);
76
+ if (year !== thresholdYear)
77
+ return year > thresholdYear;
78
+ const releaseText = parts[1];
79
+ const thresholdReleaseText = threshold[1];
80
+ const release = Number(releaseText.padEnd(3, "0"));
81
+ const thresholdRelease = Number(thresholdReleaseText.padEnd(3, "0"));
82
+ return release >= thresholdRelease;
83
+ }
84
+ async function installedAppPath(paths) {
85
+ for (const path of paths) {
86
+ try {
87
+ const value = await lstat(path);
88
+ if (value.isSymbolicLink()) {
89
+ throw new Error(`拒绝管理符号链接形式的 ChatGPT App:${path}`);
90
+ }
91
+ if (value.isDirectory())
92
+ return path;
93
+ }
94
+ catch (error) {
95
+ if (error.code !== "ENOENT")
96
+ throw error;
97
+ }
98
+ }
99
+ return undefined;
100
+ }
101
+ export async function inspectChatGptDesktop(dependencies = {}) {
102
+ const platform = dependencies.platform ?? process.platform;
103
+ const architecture = dependencies.architecture ?? process.arch;
104
+ if (platform !== "darwin" || architecture !== "arm64") {
105
+ return {
106
+ platform,
107
+ architecture,
108
+ supported: false,
109
+ installed: false,
110
+ targetVersion: MANAGED_CHATGPT_VERSION,
111
+ remediationRequired: false
112
+ };
113
+ }
114
+ const candidates = appCandidates(dependencies);
115
+ const path = await installedAppPath(candidates);
116
+ if (!path) {
117
+ return {
118
+ platform,
119
+ architecture,
120
+ supported: true,
121
+ installed: false,
122
+ path: candidates[0],
123
+ targetVersion: MANAGED_CHATGPT_VERSION,
124
+ remediationRequired: false
125
+ };
126
+ }
127
+ const metadata = await (dependencies.readMetadata ?? defaultReadMetadata)(path);
128
+ return {
129
+ platform,
130
+ architecture,
131
+ supported: true,
132
+ installed: true,
133
+ path,
134
+ bundleId: metadata.bundleId,
135
+ version: metadata.version,
136
+ build: metadata.build,
137
+ targetVersion: MANAGED_CHATGPT_VERSION,
138
+ remediationRequired: metadata.bundleId === CHATGPT_BUNDLE_ID
139
+ && requiresChatGptRollback(metadata.version)
140
+ };
141
+ }
142
+ async function hashFile(path) {
143
+ const digest = createHash("sha256");
144
+ let bytes = 0;
145
+ for await (const chunk of createReadStream(path)) {
146
+ const value = chunk;
147
+ bytes += value.byteLength;
148
+ digest.update(value);
149
+ }
150
+ return { bytes, sha256: digest.digest("hex") };
151
+ }
152
+ async function archiveIsValid(path) {
153
+ try {
154
+ const result = await hashFile(path);
155
+ return result.bytes === MANAGED_CHATGPT_ARCHIVE_BYTES
156
+ && result.sha256 === MANAGED_CHATGPT_ARCHIVE_SHA256;
157
+ }
158
+ catch {
159
+ return false;
160
+ }
161
+ }
162
+ async function writeAll(file, value) {
163
+ let offset = 0;
164
+ while (offset < value.byteLength) {
165
+ const result = await file.write(value, offset, value.byteLength - offset);
166
+ if (result.bytesWritten <= 0)
167
+ throw new Error("无法继续写入 ChatGPT 安装包。");
168
+ offset += result.bytesWritten;
169
+ }
170
+ }
171
+ async function downloadManagedArchive(dependencies) {
172
+ const env = dependencies.env ?? process.env;
173
+ const home = dependencies.homeDirectory ?? homedir();
174
+ const cacheDirectory = dependencies.cacheDirectory
175
+ ?? join(env.XDG_CACHE_HOME?.trim() || join(home, "Library", "Caches"), "numa", "apps");
176
+ const archivePath = join(cacheDirectory, `chatgpt-${MANAGED_CHATGPT_VERSION}.zip`);
177
+ await mkdir(cacheDirectory, { recursive: true });
178
+ if (await archiveIsValid(archivePath))
179
+ return archivePath;
180
+ await rm(archivePath, { force: true });
181
+ const temporary = `${archivePath}.${process.pid}.${randomUUID()}.tmp`;
182
+ const fetchImpl = dependencies.fetch ?? fetch;
183
+ const response = await fetchImpl(MANAGED_CHATGPT_DOWNLOAD_URL, {
184
+ redirect: "follow",
185
+ signal: AbortSignal.timeout(15 * 60 * 1_000)
186
+ });
187
+ if (!response.ok || !response.body) {
188
+ throw new Error(`下载 ChatGPT 安装包失败:HTTP ${response.status}`);
189
+ }
190
+ const declaredLengthHeader = response.headers.get("content-length");
191
+ if (declaredLengthHeader !== null) {
192
+ const declaredLength = Number(declaredLengthHeader);
193
+ if (!Number.isFinite(declaredLength) || declaredLength !== MANAGED_CHATGPT_ARCHIVE_BYTES) {
194
+ throw new Error(`ChatGPT 安装包大小异常:${declaredLengthHeader}`);
195
+ }
196
+ }
197
+ const digest = createHash("sha256");
198
+ const file = await open(temporary, "wx", 0o600);
199
+ let bytes = 0;
200
+ try {
201
+ const reader = response.body.getReader();
202
+ while (true) {
203
+ const item = await reader.read();
204
+ if (item.done)
205
+ break;
206
+ bytes += item.value.byteLength;
207
+ if (bytes > MAX_DOWNLOAD_BYTES)
208
+ throw new Error("ChatGPT 安装包超过允许的最大大小。");
209
+ digest.update(item.value);
210
+ await writeAll(file, item.value);
211
+ }
212
+ }
213
+ catch (error) {
214
+ await rm(temporary, { force: true });
215
+ throw error;
216
+ }
217
+ finally {
218
+ await file.close();
219
+ }
220
+ const sha256 = digest.digest("hex");
221
+ if (bytes !== MANAGED_CHATGPT_ARCHIVE_BYTES || sha256 !== MANAGED_CHATGPT_ARCHIVE_SHA256) {
222
+ await rm(temporary, { force: true });
223
+ throw new Error(`ChatGPT 安装包完整性校验失败(bytes=${bytes}, sha256=${sha256})。`);
224
+ }
225
+ await rename(temporary, archivePath);
226
+ return archivePath;
227
+ }
228
+ async function defaultExtractArchive(archivePath, destination) {
229
+ await runCommand("/usr/bin/ditto", ["-x", "-k", archivePath, destination]);
230
+ const appPath = join(destination, "ChatGPT.app");
231
+ await access(appPath, constants.R_OK);
232
+ return appPath;
233
+ }
234
+ async function defaultVerifySignature(appPath) {
235
+ await runCommand("/usr/bin/codesign", ["--verify", "--deep", "--strict", appPath]);
236
+ const detail = await runCommand("/usr/bin/codesign", ["-dv", "--verbose=4", appPath]);
237
+ const text = `${detail.stdout}\n${detail.stderr}`;
238
+ if (!text.includes(`Identifier=${CHATGPT_BUNDLE_ID}`)
239
+ || !text.includes(`TeamIdentifier=${OPENAI_TEAM_ID}`)) {
240
+ throw new Error("ChatGPT App 签名身份不符合预期。");
241
+ }
242
+ const architecture = await runCommand("/usr/bin/lipo", [
243
+ "-archs",
244
+ join(appPath, "Contents", "MacOS", "ChatGPT")
245
+ ]);
246
+ if (!architecture.stdout.trim().split(/\s+/u).includes("arm64")) {
247
+ throw new Error("ChatGPT App 安装包不包含 arm64 可执行文件。");
248
+ }
249
+ }
250
+ async function processRunning(name) {
251
+ try {
252
+ await runCommand("/usr/bin/pgrep", ["-x", name]);
253
+ return true;
254
+ }
255
+ catch {
256
+ return false;
257
+ }
258
+ }
259
+ async function delay(milliseconds) {
260
+ await new Promise((resolve) => setTimeout(resolve, milliseconds));
261
+ }
262
+ async function defaultStopApp() {
263
+ if (!(await processRunning("ChatGPT")))
264
+ return;
265
+ try {
266
+ await runCommand("/usr/bin/pkill", ["-TERM", "-x", "ChatGPT"]);
267
+ }
268
+ catch (error) {
269
+ if (await processRunning("ChatGPT"))
270
+ throw error;
271
+ return;
272
+ }
273
+ for (let attempt = 0; attempt < 25; attempt += 1) {
274
+ if (!(await processRunning("ChatGPT")))
275
+ return;
276
+ await delay(200);
277
+ }
278
+ try {
279
+ await runCommand("/usr/bin/pkill", ["-KILL", "-x", "ChatGPT"]);
280
+ }
281
+ catch (error) {
282
+ if (await processRunning("ChatGPT"))
283
+ throw error;
284
+ }
285
+ }
286
+ async function validateManagedApp(appPath, dependencies) {
287
+ const metadata = await (dependencies.readMetadata ?? defaultReadMetadata)(appPath);
288
+ if (metadata.bundleId !== CHATGPT_BUNDLE_ID
289
+ || metadata.version !== MANAGED_CHATGPT_VERSION
290
+ || metadata.build !== MANAGED_CHATGPT_BUILD) {
291
+ throw new Error(`ChatGPT 安装包版本不符合预期:${metadata.bundleId} ${metadata.version} (${metadata.build})。`);
292
+ }
293
+ await (dependencies.verifySignature ?? defaultVerifySignature)(appPath);
294
+ return metadata;
295
+ }
296
+ export async function ensureManagedChatGptDesktop(dependencies = {}) {
297
+ const before = await inspectChatGptDesktop(dependencies);
298
+ if (!before.supported)
299
+ return { action: "not-supported", before };
300
+ if (!before.installed)
301
+ return { action: "not-installed", before };
302
+ if (!before.remediationRequired)
303
+ return { action: "not-required", before };
304
+ if (!before.path || before.bundleId !== CHATGPT_BUNDLE_ID) {
305
+ throw new Error("拒绝替换无法确认身份的 ChatGPT App。");
306
+ }
307
+ const output = dependencies.output ?? process.stderr;
308
+ output.write(`检测到 ChatGPT ${before.version},正在安装批准版本 ${MANAGED_CHATGPT_VERSION}…\n`);
309
+ await access(dirname(before.path), constants.W_OK);
310
+ const archivePath = await (dependencies.obtainArchive
311
+ ? dependencies.obtainArchive()
312
+ : downloadManagedArchive(dependencies));
313
+ const stagingDirectory = await mkdtemp(join(dirname(before.path), ".numa-chatgpt-install-"));
314
+ const backupPath = join(dirname(before.path), `.ChatGPT.app.numa-backup-${process.pid}-${Date.now()}`);
315
+ let backupCreated = false;
316
+ try {
317
+ const stagedApp = await (dependencies.extractArchive ?? defaultExtractArchive)(archivePath, stagingDirectory);
318
+ await validateManagedApp(stagedApp, dependencies);
319
+ await (dependencies.stopApp ?? defaultStopApp)();
320
+ await rename(before.path, backupPath);
321
+ backupCreated = true;
322
+ try {
323
+ await rename(stagedApp, before.path);
324
+ await validateManagedApp(before.path, dependencies);
325
+ }
326
+ catch (error) {
327
+ await rm(before.path, { recursive: true, force: true });
328
+ await rename(backupPath, before.path);
329
+ backupCreated = false;
330
+ throw error;
331
+ }
332
+ try {
333
+ await rm(backupPath, { recursive: true, force: true });
334
+ backupCreated = false;
335
+ }
336
+ catch (error) {
337
+ output.write(`警告:旧版 ChatGPT 备份清理失败:${error.message}\n`);
338
+ }
339
+ }
340
+ finally {
341
+ await rm(stagingDirectory, { recursive: true, force: true });
342
+ if (backupCreated) {
343
+ try {
344
+ await access(before.path);
345
+ }
346
+ catch {
347
+ await rename(backupPath, before.path);
348
+ backupCreated = false;
349
+ }
350
+ }
351
+ }
352
+ const after = await inspectChatGptDesktop(dependencies);
353
+ output.write(`ChatGPT 已切换到 ${after.version} (${after.build})。\n`);
354
+ return { action: "reinstalled", before, after };
355
+ }
356
+ //# sourceMappingURL=chatgpt-desktop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chatgpt-desktop.js","sourceRoot":"","sources":["../src/chatgpt-desktop.ts"],"names":[],"mappings":"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"}
@@ -5,6 +5,7 @@ import { DEFAULT_CODEX_SERVER_URL } from "@tokensrc/codex/config";
5
5
  import { appConfigDirectory, loadAppConfig } from "./app-config.js";
6
6
  import { CLI_NAME, CODEX_APP_NAME, CODEX_SHORTCUT_NAME, PACKAGE_NAME } from "./branding.js";
7
7
  import { loadConfig } from "./config.js";
8
+ import { CHATGPT_DESKTOP_UPDATE_REMINDER, ensureManagedChatGptDesktop, inspectChatGptDesktop } from "./chatgpt-desktop.js";
8
9
  import { currentPlatformProfile, ModuleUnavailableError, requireProfileService } from "./platform-profile.js";
9
10
  import { blockingBrowserLogin, ensureAccessToken, LoginRequiredError } from "./oauth.js";
10
11
  export const NUMA_CODEX_COMMAND_DIRECTORY = createCodexCommandDirectory({
@@ -98,6 +99,7 @@ export async function createNumaCodexModule() {
98
99
  appName: CODEX_APP_NAME
99
100
  },
100
101
  launcher: {
102
+ cliCommandName: CLI_NAME,
101
103
  runCommandName: CODEX_SHORTCUT_NAME,
102
104
  appCommandName: `${CODEX_SHORTCUT_NAME}-app`,
103
105
  launchMode: "direct",
@@ -109,6 +111,13 @@ export async function createNumaCodexModule() {
109
111
  manifestFileName: ".numa-codex-shortcuts.json",
110
112
  bundleId: "tech.numa.codex-shortcut"
111
113
  },
114
+ desktopApp: {
115
+ inspect: () => inspectChatGptDesktop({ env: process.env }),
116
+ prepare: async () => {
117
+ process.stderr.write(`${CHATGPT_DESKTOP_UPDATE_REMINDER}\n`);
118
+ await ensureManagedChatGptDesktop({ env: process.env, output: process.stderr });
119
+ }
120
+ },
112
121
  env: process.env,
113
122
  output: process.stdout,
114
123
  errorOutput: process.stderr,
@@ -1 +1 @@
1
- {"version":3,"file":"codex-module.js","sourceRoot":"","sources":["../src/codex-module.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"codex-module.js","sourceRoot":"","sources":["../src/codex-module.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@numa-tech/numa",
3
- "version": "1.12.4",
3
+ "version": "1.12.6",
4
4
  "description": "Cross-platform CLI for the Numa internal developer platform with Keycloak authentication and MCP support.",
5
5
  "author": "numa-tech",
6
6
  "keywords": [
@@ -32,7 +32,7 @@
32
32
  "typecheck": "turbo run typecheck root:typecheck",
33
33
  "root:typecheck": "tsc --noEmit",
34
34
  "test": "turbo run test root:test",
35
- "root:test": "node --import tsx --test src/branding.test.ts src/app-config.test.ts src/platform-profile.test.ts src/identity.test.ts src/backend.test.ts src/oauth.test.ts src/web-console.test.ts src/cli-options.test.ts src/ai-registry/client.test.ts src/ai-registry/skill-installer.test.ts src/ai-registry/mcp-installer.test.ts src/media/client.test.ts src/media/commands.test.ts src/media/transfers.test.ts src/pipeline/client.test.ts src/pipeline/commands.test.ts src/codex-integration.test.ts scripts/release-all.test.mjs",
35
+ "root:test": "node --import tsx --test src/branding.test.ts src/app-config.test.ts src/platform-profile.test.ts src/identity.test.ts src/backend.test.ts src/oauth.test.ts src/web-console.test.ts src/cli-options.test.ts src/ai-registry/client.test.ts src/ai-registry/skill-installer.test.ts src/ai-registry/mcp-installer.test.ts src/media/client.test.ts src/media/commands.test.ts src/media/transfers.test.ts src/pipeline/client.test.ts src/pipeline/commands.test.ts src/chatgpt-desktop.test.ts src/codex-integration.test.ts scripts/release-all.test.mjs",
36
36
  "pack:check": "turbo run pack:check root:pack:check",
37
37
  "root:pack:check": "node scripts/check-root-package.mjs",
38
38
  "boundaries": "node scripts/check-workspace-boundaries.mjs",
@@ -55,8 +55,8 @@
55
55
  "dependencies": {
56
56
  "@clack/prompts": "^1.7.0",
57
57
  "@modelcontextprotocol/sdk": "^1.29.0",
58
- "@numa-tech/cli-auth": "1.12.4",
59
- "@tokensrc/codex": "1.12.4",
58
+ "@numa-tech/cli-auth": "1.12.6",
59
+ "@tokensrc/codex": "1.12.6",
60
60
  "commander": "^14.0.3",
61
61
  "open": "^10.2.0",
62
62
  "yauzl": "^3.4.0",