@numa-tech/numa 1.14.6 → 1.14.8
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 +20 -29
- package/dist/chatgpt-desktop.d.ts +4 -29
- package/dist/chatgpt-desktop.js +18 -376
- package/dist/chatgpt-desktop.js.map +1 -1
- package/dist/cli.js +28 -9
- package/dist/cli.js.map +1 -1
- package/dist/codex-module.d.ts +2 -1
- package/dist/codex-module.js +24 -8
- package/dist/codex-module.js.map +1 -1
- package/dist/command-catalog.js +126 -6
- package/dist/command-catalog.js.map +1 -1
- package/dist/integration-bootstrap/client.d.ts +31 -4
- package/dist/integration-bootstrap/client.js +161 -35
- package/dist/integration-bootstrap/client.js.map +1 -1
- package/dist/integration-bootstrap/commands.d.ts +28 -5
- package/dist/integration-bootstrap/commands.js +399 -47
- package/dist/integration-bootstrap/commands.js.map +1 -1
- package/dist/integration-bootstrap/schemas.d.ts +408 -43
- package/dist/integration-bootstrap/schemas.js +373 -93
- package/dist/integration-bootstrap/schemas.js.map +1 -1
- package/dist/teams/client.d.ts +119 -0
- package/dist/teams/client.js +177 -0
- package/dist/teams/client.js.map +1 -0
- package/dist/teams/commands.d.ts +6 -0
- package/dist/teams/commands.js +190 -0
- package/dist/teams/commands.js.map +1 -0
- package/dist/teams/errors.d.ts +10 -0
- package/dist/teams/errors.js +56 -0
- package/dist/teams/errors.js.map +1 -0
- package/dist/teams/schemas.d.ts +171 -0
- package/dist/teams/schemas.js +81 -0
- package/dist/teams/schemas.js.map +1 -0
- package/package.json +4 -4
- package/skills/numa-cli/SKILL.md +2 -1
- package/skills/numa-cli/references/pipeline-release.md +2 -0
- package/skills/numa-local-flux-deploy/SKILL.md +24 -0
- package/skills/numa-local-flux-deploy/agents/openai.yaml +4 -0
- package/skills/numa-local-flux-deploy/evals/evals.json +35 -0
- package/skills/numa-local-flux-deploy/references/local-flux-release.md +172 -0
package/README.md
CHANGED
|
@@ -110,7 +110,10 @@ numa-codex-app
|
|
|
110
110
|
面向业务同事的图文说明见 [`docs/chatgpt-cli-guide.html`](docs/chatgpt-cli-guide.html),其中分别介绍
|
|
111
111
|
CLI 与桌面版的适用场景、一次安装自动更新的 `numa` 命令与两个 Codex 入口、首次登录和常见问题排查。
|
|
112
112
|
|
|
113
|
-
上述安装器生成的 `numa` 是托管 launcher
|
|
113
|
+
上述安装器生成的 `numa` 是托管 launcher。它会记录安装时探测到的 Node/npm/Numa 绝对路径,并通过
|
|
114
|
+
原子版本缓存更新到可信 registry 的 `@latest`;即使桌面环境的 PATH 不含 Node,也能使用已记录入口。
|
|
115
|
+
registry 不可达或更新失败时只运行上次已验证版本,不会把业务命令重放到另一个版本。旧 shortcut 需
|
|
116
|
+
重新运行一次安装命令才能获得该 bootstrap。需要在 CI、离线环境
|
|
114
117
|
或其他可复现流程中固定版本时,才建议使用全局或精确版本安装:
|
|
115
118
|
|
|
116
119
|
```bash
|
|
@@ -212,7 +215,7 @@ numa config \
|
|
|
212
215
|
| `numa codex use` | 需登录 | 选择账号并写入官方 ChatGPT 登录 |
|
|
213
216
|
| `numa codex run` | 需登录 | 使用所选账号启动官方 Codex CLI |
|
|
214
217
|
| `numa codex app` | 需登录 | 使用官方 ChatGPT 登录启动桌面 App |
|
|
215
|
-
| `numa codex shortcut` | 公开 | 安装或删除 macOS/Windows 快捷命令与桌面入口 |
|
|
218
|
+
| `numa codex shortcut` | 公开 | 安装或删除 macOS/Windows/Linux 快捷命令与桌面入口 |
|
|
216
219
|
| `numa codex status` | 公开 | 查看本地选择、官方登录状态和 ChatGPT Desktop 版本 |
|
|
217
220
|
| `numa codex reset` | 公开 | 重置本地选择和登录并清理旧 provider 残留 |
|
|
218
221
|
| `numa serve` | 公开 | 启动兼容 MCP 服务 |
|
|
@@ -1089,8 +1092,9 @@ ChatGPT 个人账号;无需把本地登录文件或令牌附在工单中。
|
|
|
1089
1092
|
### macOS / Windows 快捷入口
|
|
1090
1093
|
|
|
1091
1094
|
日常使用优先安装快捷入口,无需全局安装 `@numa-tech/numa`。安装命令显式解析
|
|
1092
|
-
`@numa-tech/numa@latest
|
|
1093
|
-
|
|
1095
|
+
`@numa-tech/numa@latest`。新生成的通用 `numa` launcher 与 Codex 快捷入口使用安装时锁定的绝对 Node/npm
|
|
1096
|
+
路径和持久的已知良好版本缓存;每次成功联网启动都会在业务命令前检查 npm 仓库中的最新客户端版本
|
|
1097
|
+
(失败后短暂退避,避免离线环境反复等待):
|
|
1094
1098
|
|
|
1095
1099
|
```bash
|
|
1096
1100
|
npx -y --prefer-online --registry=https://registry.npmjs.org/ @numa-tech/numa@latest codex shortcut install
|
|
@@ -1108,15 +1112,16 @@ numa-codex exec "完成这个任务"
|
|
|
1108
1112
|
numa-codex-app
|
|
1109
1113
|
```
|
|
1110
1114
|
|
|
1111
|
-
|
|
1112
|
-
|
|
1113
|
-
|
|
1114
|
-
|
|
1115
|
+
bootstrap 只信任 HTTPS(本地开发可用 loopback HTTP)registry,解析 `latest` 后拒绝任何版本降级,
|
|
1116
|
+
以 `--ignore-scripts` 下载到临时目录,严格回读包名、exact版本和 `numa` bin,再原子切换已知良好版本。
|
|
1117
|
+
网络、registry或安装失败只产生诊断并回退,不会再次执行业务命令;离线可继续使用已缓存版本或安装时
|
|
1118
|
+
验证过的当前入口。已安装旧版快捷入口的用户必须重新执行一次上述安装命令,旧脚本无法自行获得无PATH
|
|
1119
|
+
bootstrap。若 `numa` 是指向同一 `@numa-tech/numa` 包的旧 npm
|
|
1115
1120
|
symlink,安装器会先核验包名与 `bin` 入口,再将其迁移为托管 launcher;卸载快捷入口时会在原包仍
|
|
1116
1121
|
存在的前提下恢复该 symlink。快捷入口默认从公共 npm 获取 Numa CLI;
|
|
1117
1122
|
启动 Codex 时仍按 `NUMA_CODEX_BIN`、PATH 中可用版本、包内版本的顺序选择。
|
|
1118
1123
|
|
|
1119
|
-
默认安装通用 `numa` launcher,以及 `run` 和 `app` 两种 Codex 入口。macOS 默认的 `--scope auto`
|
|
1124
|
+
默认安装通用 `numa` launcher,以及 `run` 和 `app` 两种 Codex 入口。macOS 默认的 `--scope auto` 会使用
|
|
1120
1125
|
`/usr/local/bin` 与 `/Applications`;没有系统级权限时自动降级到
|
|
1121
1126
|
`~/.local/bin/numa`、`~/.local/bin/numa-codex*` 与 `~/Applications/Numa Codex.app`,全程不会
|
|
1122
1127
|
调用 `sudo`。可用 `--scope system` 或 `--scope user` 显式指定。Windows 写入用户 npm 命令目录,并在开始菜单
|
|
@@ -1166,10 +1171,6 @@ Codex 的主机不会受包内平台可选依赖缺失影响;外部版本不
|
|
|
1166
1171
|
|
|
1167
1172
|
### Codex 桌面 App
|
|
1168
1173
|
|
|
1169
|
-
> **版本提醒:请勿主动升级 ChatGPT Desktop,也不要点击“检查更新”。** 如果应用弹出更新提示,
|
|
1170
|
-
> 请选择“稍后”或“取消”,并继续通过 `Numa Codex`、`numa-codex-app` 或 `numa codex app`
|
|
1171
|
-
> 启动,由 Numa 检查并使用公司批准版本。
|
|
1172
|
-
|
|
1173
1174
|
官方 Codex CLI、IDE 扩展和桌面 App 共享 `~/.codex/auth.json`。macOS/Windows 可直接运行:
|
|
1174
1175
|
|
|
1175
1176
|
```bash
|
|
@@ -1183,24 +1184,14 @@ numa codex app . \
|
|
|
1183
1184
|
2. 从服务端领取不含 refresh token 的官方登录凭据;
|
|
1184
1185
|
3. 原子更新 ChatGPT 模式 `auth.json`;
|
|
1185
1186
|
4. 清理项目更名前旧版 `mcex-codex` provider 残留;
|
|
1186
|
-
5.
|
|
1187
|
-
|
|
1188
|
-
|
|
1189
|
-
|
|
1190
|
-
|
|
1191
|
-
`https://mci-maint.oss-cn-shenzhen.aliyuncs.com/apps/chatgpt-26-730-61639.zip`
|
|
1192
|
-
下载并缓存到用户缓存目录。客户端会先核验大小、固定 SHA-256、Bundle ID、目标版本以及
|
|
1193
|
-
OpenAI Developer ID 签名,再停止正在运行的 ChatGPT,以同卷临时目录完成原子替换。下载、
|
|
1194
|
-
解压或安装后校验失败时保留或恢复原 App;目标版本及更早的 2026 年 7 月批次不会下载或改动。
|
|
1195
|
-
批准包 SHA-256 为
|
|
1196
|
-
`da88c8a15eab1ddc8efdf50182d4aca7468d995193d952c344a4d10d38c45871`。
|
|
1197
|
-
`NUMA_CHATGPT_APP_PATH` 可显式指定受管 App 路径。
|
|
1198
|
-
该守卫不会修改 ChatGPT 自带更新策略,而是在每次通过 Numa 启动桌面版时重新检查;需要长期
|
|
1199
|
-
禁止应用内更新时,应由组织管理员通过 ChatGPT Managed configuration/MDM 下发更新策略。
|
|
1187
|
+
5. 只读检查现有官方 App 是否存在,并直接启动官方 `codex app`。
|
|
1188
|
+
|
|
1189
|
+
Numa 不下载、安装、替换、升级或降级 ChatGPT Desktop,也不输出版本提醒或保留隐藏的版本回退开关。
|
|
1190
|
+
`NUMA_CHATGPT_APP_PATH` 仅可显式指定只读检查的 App 路径。应用版本与更新策略完全由官方应用和组织的
|
|
1191
|
+
Managed configuration/MDM 管理。
|
|
1200
1192
|
|
|
1201
1193
|
如果桌面 App 已经运行,需要完全退出后重新打开。`numa codex status` 可同时检查所选账号、
|
|
1202
|
-
|
|
1203
|
-
安全补丁,发布负责人应持续评估兼容性并及时更新批准版本。
|
|
1194
|
+
官方登录文件,以及本机是否存在可启动的 ChatGPT Desktop 和其只读版本信息。
|
|
1204
1195
|
|
|
1205
1196
|
### 前台官方登录同步
|
|
1206
1197
|
|
|
@@ -1,11 +1,4 @@
|
|
|
1
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
2
|
interface BundleMetadata {
|
|
10
3
|
bundleId: string;
|
|
11
4
|
version: string;
|
|
@@ -17,29 +10,11 @@ export interface ChatGptDesktopDependencies {
|
|
|
17
10
|
homeDirectory?: string;
|
|
18
11
|
env?: NodeJS.ProcessEnv;
|
|
19
12
|
appPaths?: string[];
|
|
20
|
-
cacheDirectory?: string;
|
|
21
|
-
fetch?: typeof fetch;
|
|
22
|
-
output?: NodeJS.WritableStream;
|
|
23
13
|
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
14
|
}
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
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;
|
|
15
|
+
/**
|
|
16
|
+
* Inspect only. Numa never downloads, installs, replaces, upgrades, or downgrades
|
|
17
|
+
* the official ChatGPT Desktop application.
|
|
18
|
+
*/
|
|
36
19
|
export declare function inspectChatGptDesktop(dependencies?: ChatGptDesktopDependencies): Promise<CodexDesktopAppStatus>;
|
|
37
|
-
interface DownloadProgress {
|
|
38
|
-
start(): void;
|
|
39
|
-
update(bytes: number): void;
|
|
40
|
-
complete(bytes: number): void;
|
|
41
|
-
abort(): void;
|
|
42
|
-
}
|
|
43
|
-
export declare function createChatGptDownloadProgress(output: NodeJS.WritableStream, totalBytes: number, now?: () => number): DownloadProgress;
|
|
44
|
-
export declare function ensureManagedChatGptDesktop(dependencies?: ChatGptDesktopDependencies): Promise<ChatGptDesktopPreparation>;
|
|
45
20
|
export {};
|
package/dist/chatgpt-desktop.js
CHANGED
|
@@ -1,22 +1,8 @@
|
|
|
1
1
|
import { execFile as execFileCallback } from "node:child_process";
|
|
2
|
-
import {
|
|
3
|
-
import { createReadStream, constants } from "node:fs";
|
|
4
|
-
import { access, lstat, mkdir, mkdtemp, open, rename, rm } from "node:fs/promises";
|
|
2
|
+
import { lstat } from "node:fs/promises";
|
|
5
3
|
import { homedir } from "node:os";
|
|
6
|
-
import {
|
|
4
|
+
import { join, resolve } from "node:path";
|
|
7
5
|
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 DOWNLOAD_PROGRESS_INTERVAL_MS = 200;
|
|
19
|
-
const MEBIBYTE = 1024 * 1024;
|
|
20
6
|
const execFile = promisify(execFileCallback);
|
|
21
7
|
function appCandidates(dependencies) {
|
|
22
8
|
if (dependencies.appPaths)
|
|
@@ -31,27 +17,20 @@ function appCandidates(dependencies) {
|
|
|
31
17
|
"/Applications/ChatGPT.app"
|
|
32
18
|
];
|
|
33
19
|
}
|
|
34
|
-
async function runCommand(command, args) {
|
|
35
|
-
const result = await execFile(command, args, {
|
|
36
|
-
encoding: "utf8",
|
|
37
|
-
maxBuffer: 4 * 1024 * 1024,
|
|
38
|
-
windowsHide: true
|
|
39
|
-
});
|
|
40
|
-
return {
|
|
41
|
-
stdout: result.stdout,
|
|
42
|
-
stderr: result.stderr
|
|
43
|
-
};
|
|
44
|
-
}
|
|
45
20
|
async function plistValue(appPath, key) {
|
|
46
|
-
const
|
|
21
|
+
const result = await execFile("/usr/bin/plutil", [
|
|
47
22
|
"-extract",
|
|
48
23
|
key,
|
|
49
24
|
"raw",
|
|
50
25
|
"-o",
|
|
51
26
|
"-",
|
|
52
27
|
join(appPath, "Contents", "Info.plist")
|
|
53
|
-
]
|
|
54
|
-
|
|
28
|
+
], {
|
|
29
|
+
encoding: "utf8",
|
|
30
|
+
maxBuffer: 4 * 1024 * 1024,
|
|
31
|
+
windowsHide: true
|
|
32
|
+
});
|
|
33
|
+
return result.stdout.trim();
|
|
55
34
|
}
|
|
56
35
|
async function defaultReadMetadata(appPath) {
|
|
57
36
|
const [bundleId, version, build] = await Promise.all([
|
|
@@ -61,34 +40,12 @@ async function defaultReadMetadata(appPath) {
|
|
|
61
40
|
]);
|
|
62
41
|
return { bundleId, version, build };
|
|
63
42
|
}
|
|
64
|
-
function numericVersionParts(version) {
|
|
65
|
-
const parts = version.trim().split(".");
|
|
66
|
-
return parts.length >= 2 && parts.every((part) => /^\d+$/u.test(part))
|
|
67
|
-
? parts
|
|
68
|
-
: undefined;
|
|
69
|
-
}
|
|
70
|
-
/** ChatGPT release versions use YY.MDD.build; `26.8` means the start of August 2026. */
|
|
71
|
-
export function requiresChatGptRollback(version) {
|
|
72
|
-
const parts = numericVersionParts(version);
|
|
73
|
-
const threshold = numericVersionParts(CHATGPT_ROLLBACK_THRESHOLD);
|
|
74
|
-
if (!parts || !threshold)
|
|
75
|
-
return false;
|
|
76
|
-
const year = Number(parts[0]);
|
|
77
|
-
const thresholdYear = Number(threshold[0]);
|
|
78
|
-
if (year !== thresholdYear)
|
|
79
|
-
return year > thresholdYear;
|
|
80
|
-
const releaseText = parts[1];
|
|
81
|
-
const thresholdReleaseText = threshold[1];
|
|
82
|
-
const release = Number(releaseText.padEnd(3, "0"));
|
|
83
|
-
const thresholdRelease = Number(thresholdReleaseText.padEnd(3, "0"));
|
|
84
|
-
return release >= thresholdRelease;
|
|
85
|
-
}
|
|
86
43
|
async function installedAppPath(paths) {
|
|
87
44
|
for (const path of paths) {
|
|
88
45
|
try {
|
|
89
46
|
const value = await lstat(path);
|
|
90
47
|
if (value.isSymbolicLink()) {
|
|
91
|
-
throw new Error(
|
|
48
|
+
throw new Error(`拒绝启动符号链接形式的 ChatGPT App:${path}`);
|
|
92
49
|
}
|
|
93
50
|
if (value.isDirectory())
|
|
94
51
|
return path;
|
|
@@ -100,18 +57,15 @@ async function installedAppPath(paths) {
|
|
|
100
57
|
}
|
|
101
58
|
return undefined;
|
|
102
59
|
}
|
|
60
|
+
/**
|
|
61
|
+
* Inspect only. Numa never downloads, installs, replaces, upgrades, or downgrades
|
|
62
|
+
* the official ChatGPT Desktop application.
|
|
63
|
+
*/
|
|
103
64
|
export async function inspectChatGptDesktop(dependencies = {}) {
|
|
104
65
|
const platform = dependencies.platform ?? process.platform;
|
|
105
66
|
const architecture = dependencies.architecture ?? process.arch;
|
|
106
|
-
if (platform !== "darwin"
|
|
107
|
-
return {
|
|
108
|
-
platform,
|
|
109
|
-
architecture,
|
|
110
|
-
supported: false,
|
|
111
|
-
installed: false,
|
|
112
|
-
targetVersion: MANAGED_CHATGPT_VERSION,
|
|
113
|
-
remediationRequired: false
|
|
114
|
-
};
|
|
67
|
+
if (platform !== "darwin") {
|
|
68
|
+
return { platform, architecture, supported: false, installed: false };
|
|
115
69
|
}
|
|
116
70
|
const candidates = appCandidates(dependencies);
|
|
117
71
|
const path = await installedAppPath(candidates);
|
|
@@ -121,9 +75,7 @@ export async function inspectChatGptDesktop(dependencies = {}) {
|
|
|
121
75
|
architecture,
|
|
122
76
|
supported: true,
|
|
123
77
|
installed: false,
|
|
124
|
-
path: candidates[0]
|
|
125
|
-
targetVersion: MANAGED_CHATGPT_VERSION,
|
|
126
|
-
remediationRequired: false
|
|
78
|
+
path: candidates[0]
|
|
127
79
|
};
|
|
128
80
|
}
|
|
129
81
|
const metadata = await (dependencies.readMetadata ?? defaultReadMetadata)(path);
|
|
@@ -135,317 +87,7 @@ export async function inspectChatGptDesktop(dependencies = {}) {
|
|
|
135
87
|
path,
|
|
136
88
|
bundleId: metadata.bundleId,
|
|
137
89
|
version: metadata.version,
|
|
138
|
-
build: metadata.build
|
|
139
|
-
targetVersion: MANAGED_CHATGPT_VERSION,
|
|
140
|
-
remediationRequired: metadata.bundleId === CHATGPT_BUNDLE_ID
|
|
141
|
-
&& requiresChatGptRollback(metadata.version)
|
|
142
|
-
};
|
|
143
|
-
}
|
|
144
|
-
async function hashFile(path) {
|
|
145
|
-
const digest = createHash("sha256");
|
|
146
|
-
let bytes = 0;
|
|
147
|
-
for await (const chunk of createReadStream(path)) {
|
|
148
|
-
const value = chunk;
|
|
149
|
-
bytes += value.byteLength;
|
|
150
|
-
digest.update(value);
|
|
151
|
-
}
|
|
152
|
-
return { bytes, sha256: digest.digest("hex") };
|
|
153
|
-
}
|
|
154
|
-
async function archiveIsValid(path) {
|
|
155
|
-
try {
|
|
156
|
-
const result = await hashFile(path);
|
|
157
|
-
return result.bytes === MANAGED_CHATGPT_ARCHIVE_BYTES
|
|
158
|
-
&& result.sha256 === MANAGED_CHATGPT_ARCHIVE_SHA256;
|
|
159
|
-
}
|
|
160
|
-
catch {
|
|
161
|
-
return false;
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
async function writeAll(file, value) {
|
|
165
|
-
let offset = 0;
|
|
166
|
-
while (offset < value.byteLength) {
|
|
167
|
-
const result = await file.write(value, offset, value.byteLength - offset);
|
|
168
|
-
if (result.bytesWritten <= 0)
|
|
169
|
-
throw new Error("无法继续写入 ChatGPT 安装包。");
|
|
170
|
-
offset += result.bytesWritten;
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
function formatMebibytes(bytes) {
|
|
174
|
-
return `${(bytes / MEBIBYTE).toFixed(1)} MiB`;
|
|
175
|
-
}
|
|
176
|
-
function formatRate(bytesPerSecond) {
|
|
177
|
-
if (bytesPerSecond >= MEBIBYTE)
|
|
178
|
-
return `${(bytesPerSecond / MEBIBYTE).toFixed(1)} MiB/s`;
|
|
179
|
-
return `${Math.max(0, bytesPerSecond / 1024).toFixed(0)} KiB/s`;
|
|
180
|
-
}
|
|
181
|
-
function formatDuration(seconds) {
|
|
182
|
-
if (!Number.isFinite(seconds) || seconds < 0)
|
|
183
|
-
return "--:--";
|
|
184
|
-
const rounded = Math.ceil(seconds);
|
|
185
|
-
const hours = Math.floor(rounded / 3600);
|
|
186
|
-
const minutes = Math.floor((rounded % 3600) / 60);
|
|
187
|
-
const remainder = rounded % 60;
|
|
188
|
-
return hours > 0
|
|
189
|
-
? `${hours}:${String(minutes).padStart(2, "0")}:${String(remainder).padStart(2, "0")}`
|
|
190
|
-
: `${minutes}:${String(remainder).padStart(2, "0")}`;
|
|
191
|
-
}
|
|
192
|
-
export function createChatGptDownloadProgress(output, totalBytes, now = Date.now) {
|
|
193
|
-
const terminal = output;
|
|
194
|
-
const interactive = terminal.isTTY === true;
|
|
195
|
-
const columns = Number.isFinite(terminal.columns) ? terminal.columns : 100;
|
|
196
|
-
const barWidth = Math.max(10, Math.min(30, columns - 64));
|
|
197
|
-
const startedAt = now();
|
|
198
|
-
let lastRenderedAt = Number.NEGATIVE_INFINITY;
|
|
199
|
-
let lastReportedBucket = 0;
|
|
200
|
-
let terminalLineOpen = false;
|
|
201
|
-
const snapshot = (bytes) => {
|
|
202
|
-
const bounded = Math.max(0, Math.min(bytes, totalBytes));
|
|
203
|
-
const ratio = totalBytes > 0 ? bounded / totalBytes : 0;
|
|
204
|
-
const percent = ratio * 100;
|
|
205
|
-
const elapsedSeconds = Math.max(0, (now() - startedAt) / 1000);
|
|
206
|
-
const rate = elapsedSeconds >= 0.25 && bounded > 0 ? bounded / elapsedSeconds : 0;
|
|
207
|
-
const eta = rate > 0 ? (totalBytes - bounded) / rate : Number.NaN;
|
|
208
|
-
const completed = Math.min(barWidth, Math.floor(ratio * barWidth));
|
|
209
|
-
const bar = `${"█".repeat(completed)}${"░".repeat(barWidth - completed)}`;
|
|
210
|
-
return `下载 [${bar}] ${percent.toFixed(1)}% ${formatMebibytes(bounded)}/${formatMebibytes(totalBytes)}`
|
|
211
|
-
+ ` ${rate > 0 ? formatRate(rate) : "-- KiB/s"} ETA ${formatDuration(eta)}`;
|
|
212
|
-
};
|
|
213
|
-
const renderInteractive = (bytes, force = false) => {
|
|
214
|
-
const timestamp = now();
|
|
215
|
-
if (!force && timestamp - lastRenderedAt < DOWNLOAD_PROGRESS_INTERVAL_MS)
|
|
216
|
-
return;
|
|
217
|
-
output.write(`\r\u001b[2K${snapshot(bytes)}`);
|
|
218
|
-
terminalLineOpen = true;
|
|
219
|
-
lastRenderedAt = timestamp;
|
|
90
|
+
build: metadata.build
|
|
220
91
|
};
|
|
221
|
-
const renderLog = (bytes, force = false) => {
|
|
222
|
-
const bounded = Math.max(0, Math.min(bytes, totalBytes));
|
|
223
|
-
const ratio = totalBytes > 0 ? bounded / totalBytes : 0;
|
|
224
|
-
const bucket = Math.min(10, Math.floor(ratio * 10));
|
|
225
|
-
if (!force && bucket <= lastReportedBucket)
|
|
226
|
-
return;
|
|
227
|
-
lastReportedBucket = Math.max(lastReportedBucket, bucket);
|
|
228
|
-
output.write(`${snapshot(bytes)}\n`);
|
|
229
|
-
};
|
|
230
|
-
return {
|
|
231
|
-
start() {
|
|
232
|
-
if (interactive)
|
|
233
|
-
renderInteractive(0, true);
|
|
234
|
-
else
|
|
235
|
-
output.write(`正在下载 ChatGPT 安装包(${formatMebibytes(totalBytes)})…\n`);
|
|
236
|
-
},
|
|
237
|
-
update(bytes) {
|
|
238
|
-
if (interactive)
|
|
239
|
-
renderInteractive(bytes, bytes >= totalBytes);
|
|
240
|
-
else
|
|
241
|
-
renderLog(bytes);
|
|
242
|
-
},
|
|
243
|
-
complete(bytes) {
|
|
244
|
-
if (interactive) {
|
|
245
|
-
renderInteractive(bytes, true);
|
|
246
|
-
output.write("\n");
|
|
247
|
-
terminalLineOpen = false;
|
|
248
|
-
}
|
|
249
|
-
else if (lastReportedBucket < 10) {
|
|
250
|
-
renderLog(bytes, true);
|
|
251
|
-
}
|
|
252
|
-
},
|
|
253
|
-
abort() {
|
|
254
|
-
if (terminalLineOpen) {
|
|
255
|
-
output.write("\n");
|
|
256
|
-
terminalLineOpen = false;
|
|
257
|
-
}
|
|
258
|
-
}
|
|
259
|
-
};
|
|
260
|
-
}
|
|
261
|
-
async function downloadManagedArchive(dependencies) {
|
|
262
|
-
const env = dependencies.env ?? process.env;
|
|
263
|
-
const home = dependencies.homeDirectory ?? homedir();
|
|
264
|
-
const cacheDirectory = dependencies.cacheDirectory
|
|
265
|
-
?? join(env.XDG_CACHE_HOME?.trim() || join(home, "Library", "Caches"), "numa", "apps");
|
|
266
|
-
const archivePath = join(cacheDirectory, `chatgpt-${MANAGED_CHATGPT_VERSION}.zip`);
|
|
267
|
-
await mkdir(cacheDirectory, { recursive: true });
|
|
268
|
-
if (await archiveIsValid(archivePath))
|
|
269
|
-
return archivePath;
|
|
270
|
-
await rm(archivePath, { force: true });
|
|
271
|
-
const temporary = `${archivePath}.${process.pid}.${randomUUID()}.tmp`;
|
|
272
|
-
const fetchImpl = dependencies.fetch ?? fetch;
|
|
273
|
-
const response = await fetchImpl(MANAGED_CHATGPT_DOWNLOAD_URL, {
|
|
274
|
-
redirect: "follow",
|
|
275
|
-
signal: AbortSignal.timeout(15 * 60 * 1_000)
|
|
276
|
-
});
|
|
277
|
-
if (!response.ok || !response.body) {
|
|
278
|
-
throw new Error(`下载 ChatGPT 安装包失败:HTTP ${response.status}`);
|
|
279
|
-
}
|
|
280
|
-
const declaredLengthHeader = response.headers.get("content-length");
|
|
281
|
-
if (declaredLengthHeader !== null) {
|
|
282
|
-
const declaredLength = Number(declaredLengthHeader);
|
|
283
|
-
if (!Number.isFinite(declaredLength) || declaredLength !== MANAGED_CHATGPT_ARCHIVE_BYTES) {
|
|
284
|
-
throw new Error(`ChatGPT 安装包大小异常:${declaredLengthHeader}`);
|
|
285
|
-
}
|
|
286
|
-
}
|
|
287
|
-
const digest = createHash("sha256");
|
|
288
|
-
const file = await open(temporary, "wx", 0o600);
|
|
289
|
-
const progress = createChatGptDownloadProgress(dependencies.output ?? process.stderr, MANAGED_CHATGPT_ARCHIVE_BYTES);
|
|
290
|
-
let bytes = 0;
|
|
291
|
-
progress.start();
|
|
292
|
-
try {
|
|
293
|
-
const reader = response.body.getReader();
|
|
294
|
-
while (true) {
|
|
295
|
-
const item = await reader.read();
|
|
296
|
-
if (item.done)
|
|
297
|
-
break;
|
|
298
|
-
bytes += item.value.byteLength;
|
|
299
|
-
if (bytes > MAX_DOWNLOAD_BYTES)
|
|
300
|
-
throw new Error("ChatGPT 安装包超过允许的最大大小。");
|
|
301
|
-
digest.update(item.value);
|
|
302
|
-
await writeAll(file, item.value);
|
|
303
|
-
progress.update(bytes);
|
|
304
|
-
}
|
|
305
|
-
progress.complete(bytes);
|
|
306
|
-
}
|
|
307
|
-
catch (error) {
|
|
308
|
-
progress.abort();
|
|
309
|
-
await rm(temporary, { force: true });
|
|
310
|
-
throw error;
|
|
311
|
-
}
|
|
312
|
-
finally {
|
|
313
|
-
await file.close();
|
|
314
|
-
}
|
|
315
|
-
const sha256 = digest.digest("hex");
|
|
316
|
-
if (bytes !== MANAGED_CHATGPT_ARCHIVE_BYTES || sha256 !== MANAGED_CHATGPT_ARCHIVE_SHA256) {
|
|
317
|
-
await rm(temporary, { force: true });
|
|
318
|
-
throw new Error(`ChatGPT 安装包完整性校验失败(bytes=${bytes}, sha256=${sha256})。`);
|
|
319
|
-
}
|
|
320
|
-
await rename(temporary, archivePath);
|
|
321
|
-
return archivePath;
|
|
322
|
-
}
|
|
323
|
-
async function defaultExtractArchive(archivePath, destination) {
|
|
324
|
-
await runCommand("/usr/bin/ditto", ["-x", "-k", archivePath, destination]);
|
|
325
|
-
const appPath = join(destination, "ChatGPT.app");
|
|
326
|
-
await access(appPath, constants.R_OK);
|
|
327
|
-
return appPath;
|
|
328
|
-
}
|
|
329
|
-
async function defaultVerifySignature(appPath) {
|
|
330
|
-
await runCommand("/usr/bin/codesign", ["--verify", "--deep", "--strict", appPath]);
|
|
331
|
-
const detail = await runCommand("/usr/bin/codesign", ["-dv", "--verbose=4", appPath]);
|
|
332
|
-
const text = `${detail.stdout}\n${detail.stderr}`;
|
|
333
|
-
if (!text.includes(`Identifier=${CHATGPT_BUNDLE_ID}`)
|
|
334
|
-
|| !text.includes(`TeamIdentifier=${OPENAI_TEAM_ID}`)) {
|
|
335
|
-
throw new Error("ChatGPT App 签名身份不符合预期。");
|
|
336
|
-
}
|
|
337
|
-
const architecture = await runCommand("/usr/bin/lipo", [
|
|
338
|
-
"-archs",
|
|
339
|
-
join(appPath, "Contents", "MacOS", "ChatGPT")
|
|
340
|
-
]);
|
|
341
|
-
if (!architecture.stdout.trim().split(/\s+/u).includes("arm64")) {
|
|
342
|
-
throw new Error("ChatGPT App 安装包不包含 arm64 可执行文件。");
|
|
343
|
-
}
|
|
344
|
-
}
|
|
345
|
-
async function processRunning(name) {
|
|
346
|
-
try {
|
|
347
|
-
await runCommand("/usr/bin/pgrep", ["-x", name]);
|
|
348
|
-
return true;
|
|
349
|
-
}
|
|
350
|
-
catch {
|
|
351
|
-
return false;
|
|
352
|
-
}
|
|
353
|
-
}
|
|
354
|
-
async function delay(milliseconds) {
|
|
355
|
-
await new Promise((resolve) => setTimeout(resolve, milliseconds));
|
|
356
|
-
}
|
|
357
|
-
async function defaultStopApp() {
|
|
358
|
-
if (!(await processRunning("ChatGPT")))
|
|
359
|
-
return;
|
|
360
|
-
try {
|
|
361
|
-
await runCommand("/usr/bin/pkill", ["-TERM", "-x", "ChatGPT"]);
|
|
362
|
-
}
|
|
363
|
-
catch (error) {
|
|
364
|
-
if (await processRunning("ChatGPT"))
|
|
365
|
-
throw error;
|
|
366
|
-
return;
|
|
367
|
-
}
|
|
368
|
-
for (let attempt = 0; attempt < 25; attempt += 1) {
|
|
369
|
-
if (!(await processRunning("ChatGPT")))
|
|
370
|
-
return;
|
|
371
|
-
await delay(200);
|
|
372
|
-
}
|
|
373
|
-
try {
|
|
374
|
-
await runCommand("/usr/bin/pkill", ["-KILL", "-x", "ChatGPT"]);
|
|
375
|
-
}
|
|
376
|
-
catch (error) {
|
|
377
|
-
if (await processRunning("ChatGPT"))
|
|
378
|
-
throw error;
|
|
379
|
-
}
|
|
380
|
-
}
|
|
381
|
-
async function validateManagedApp(appPath, dependencies) {
|
|
382
|
-
const metadata = await (dependencies.readMetadata ?? defaultReadMetadata)(appPath);
|
|
383
|
-
if (metadata.bundleId !== CHATGPT_BUNDLE_ID
|
|
384
|
-
|| metadata.version !== MANAGED_CHATGPT_VERSION
|
|
385
|
-
|| metadata.build !== MANAGED_CHATGPT_BUILD) {
|
|
386
|
-
throw new Error(`ChatGPT 安装包版本不符合预期:${metadata.bundleId} ${metadata.version} (${metadata.build})。`);
|
|
387
|
-
}
|
|
388
|
-
await (dependencies.verifySignature ?? defaultVerifySignature)(appPath);
|
|
389
|
-
return metadata;
|
|
390
|
-
}
|
|
391
|
-
export async function ensureManagedChatGptDesktop(dependencies = {}) {
|
|
392
|
-
const before = await inspectChatGptDesktop(dependencies);
|
|
393
|
-
if (!before.supported)
|
|
394
|
-
return { action: "not-supported", before };
|
|
395
|
-
if (!before.installed)
|
|
396
|
-
return { action: "not-installed", before };
|
|
397
|
-
if (!before.remediationRequired)
|
|
398
|
-
return { action: "not-required", before };
|
|
399
|
-
if (!before.path || before.bundleId !== CHATGPT_BUNDLE_ID) {
|
|
400
|
-
throw new Error("拒绝替换无法确认身份的 ChatGPT App。");
|
|
401
|
-
}
|
|
402
|
-
const output = dependencies.output ?? process.stderr;
|
|
403
|
-
output.write(`检测到 ChatGPT ${before.version},正在安装批准版本 ${MANAGED_CHATGPT_VERSION}…\n`);
|
|
404
|
-
await access(dirname(before.path), constants.W_OK);
|
|
405
|
-
const archivePath = await (dependencies.obtainArchive
|
|
406
|
-
? dependencies.obtainArchive()
|
|
407
|
-
: downloadManagedArchive(dependencies));
|
|
408
|
-
const stagingDirectory = await mkdtemp(join(dirname(before.path), ".numa-chatgpt-install-"));
|
|
409
|
-
const backupPath = join(dirname(before.path), `.ChatGPT.app.numa-backup-${process.pid}-${Date.now()}`);
|
|
410
|
-
let backupCreated = false;
|
|
411
|
-
try {
|
|
412
|
-
const stagedApp = await (dependencies.extractArchive ?? defaultExtractArchive)(archivePath, stagingDirectory);
|
|
413
|
-
await validateManagedApp(stagedApp, dependencies);
|
|
414
|
-
await (dependencies.stopApp ?? defaultStopApp)();
|
|
415
|
-
await rename(before.path, backupPath);
|
|
416
|
-
backupCreated = true;
|
|
417
|
-
try {
|
|
418
|
-
await rename(stagedApp, before.path);
|
|
419
|
-
await validateManagedApp(before.path, dependencies);
|
|
420
|
-
}
|
|
421
|
-
catch (error) {
|
|
422
|
-
await rm(before.path, { recursive: true, force: true });
|
|
423
|
-
await rename(backupPath, before.path);
|
|
424
|
-
backupCreated = false;
|
|
425
|
-
throw error;
|
|
426
|
-
}
|
|
427
|
-
try {
|
|
428
|
-
await rm(backupPath, { recursive: true, force: true });
|
|
429
|
-
backupCreated = false;
|
|
430
|
-
}
|
|
431
|
-
catch (error) {
|
|
432
|
-
output.write(`警告:旧版 ChatGPT 备份清理失败:${error.message}\n`);
|
|
433
|
-
}
|
|
434
|
-
}
|
|
435
|
-
finally {
|
|
436
|
-
await rm(stagingDirectory, { recursive: true, force: true });
|
|
437
|
-
if (backupCreated) {
|
|
438
|
-
try {
|
|
439
|
-
await access(before.path);
|
|
440
|
-
}
|
|
441
|
-
catch {
|
|
442
|
-
await rename(backupPath, before.path);
|
|
443
|
-
backupCreated = false;
|
|
444
|
-
}
|
|
445
|
-
}
|
|
446
|
-
}
|
|
447
|
-
const after = await inspectChatGptDesktop(dependencies);
|
|
448
|
-
output.write(`ChatGPT 已切换到 ${after.version} (${after.build})。\n`);
|
|
449
|
-
return { action: "reinstalled", before, after };
|
|
450
92
|
}
|
|
451
93
|
//# sourceMappingURL=chatgpt-desktop.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chatgpt-desktop.js","sourceRoot":"","sources":["../src/chatgpt-desktop.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"chatgpt-desktop.js","sourceRoot":"","sources":["../src/chatgpt-desktop.ts"],"names":[],"mappings":"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"}
|