@numa-tech/numa 1.11.10
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 +602 -0
- package/THIRD_PARTY_NOTICES.md +13 -0
- package/assets/codex-shortcut-icon.icns +0 -0
- package/assets/codex-shortcut-icon.ico +0 -0
- package/dist/app-config.d.ts +26 -0
- package/dist/app-config.js +135 -0
- package/dist/app-config.js.map +1 -0
- package/dist/backend.d.ts +16 -0
- package/dist/backend.js +106 -0
- package/dist/backend.js.map +1 -0
- package/dist/branding.d.ts +7 -0
- package/dist/branding.js +13 -0
- package/dist/branding.js.map +1 -0
- package/dist/chatgpt-console.d.ts +53 -0
- package/dist/chatgpt-console.js +105 -0
- package/dist/chatgpt-console.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +451 -0
- package/dist/cli.js.map +1 -0
- package/dist/codex-auth-agent.d.ts +60 -0
- package/dist/codex-auth-agent.js +331 -0
- package/dist/codex-auth-agent.js.map +1 -0
- package/dist/codex-commands.d.ts +2 -0
- package/dist/codex-commands.js +528 -0
- package/dist/codex-commands.js.map +1 -0
- package/dist/codex-legacy-cleanup.d.ts +5 -0
- package/dist/codex-legacy-cleanup.js +77 -0
- package/dist/codex-legacy-cleanup.js.map +1 -0
- package/dist/codex-process.d.ts +13 -0
- package/dist/codex-process.js +193 -0
- package/dist/codex-process.js.map +1 -0
- package/dist/codex-protocol.d.ts +352 -0
- package/dist/codex-protocol.js +116 -0
- package/dist/codex-protocol.js.map +1 -0
- package/dist/codex-quota-cache.d.ts +20 -0
- package/dist/codex-quota-cache.js +82 -0
- package/dist/codex-quota-cache.js.map +1 -0
- package/dist/codex-selection.d.ts +18 -0
- package/dist/codex-selection.js +47 -0
- package/dist/codex-selection.js.map +1 -0
- package/dist/codex-service-client.d.ts +11 -0
- package/dist/codex-service-client.js +91 -0
- package/dist/codex-service-client.js.map +1 -0
- package/dist/codex-shortcuts.d.ts +43 -0
- package/dist/codex-shortcuts.js +429 -0
- package/dist/codex-shortcuts.js.map +1 -0
- package/dist/codex-tui.d.ts +15 -0
- package/dist/codex-tui.js +235 -0
- package/dist/codex-tui.js.map +1 -0
- package/dist/command-catalog.d.ts +9 -0
- package/dist/command-catalog.js +206 -0
- package/dist/command-catalog.js.map +1 -0
- package/dist/config-page.d.ts +2 -0
- package/dist/config-page.js +51 -0
- package/dist/config-page.js.map +1 -0
- package/dist/config.d.ts +22 -0
- package/dist/config.js +99 -0
- package/dist/config.js.map +1 -0
- package/dist/identity.d.ts +23 -0
- package/dist/identity.js +78 -0
- package/dist/identity.js.map +1 -0
- package/dist/media/client.d.ts +79 -0
- package/dist/media/client.js +175 -0
- package/dist/media/client.js.map +1 -0
- package/dist/media/commands.d.ts +2 -0
- package/dist/media/commands.js +193 -0
- package/dist/media/commands.js.map +1 -0
- package/dist/media/errors.d.ts +8 -0
- package/dist/media/errors.js +37 -0
- package/dist/media/errors.js.map +1 -0
- package/dist/media/schemas.d.ts +62 -0
- package/dist/media/schemas.js +71 -0
- package/dist/media/schemas.js.map +1 -0
- package/dist/media/transfers.d.ts +38 -0
- package/dist/media/transfers.js +169 -0
- package/dist/media/transfers.js.map +1 -0
- package/dist/oauth.d.ts +30 -0
- package/dist/oauth.js +295 -0
- package/dist/oauth.js.map +1 -0
- package/dist/private-file.d.ts +3 -0
- package/dist/private-file.js +51 -0
- package/dist/private-file.js.map +1 -0
- package/dist/server.d.ts +2 -0
- package/dist/server.js +197 -0
- package/dist/server.js.map +1 -0
- package/dist/types.d.ts +40 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/web-console-page.d.ts +3 -0
- package/dist/web-console-page.js +59 -0
- package/dist/web-console-page.js.map +1 -0
- package/dist/web-console.d.ts +22 -0
- package/dist/web-console.js +335 -0
- package/dist/web-console.js.map +1 -0
- package/examples/claude-desktop-installed-binary.json +11 -0
- package/examples/claude-desktop-npx.json +12 -0
- package/examples/codex-installed-binary.json +11 -0
- package/examples/codex-npx.json +12 -0
- package/package.json +67 -0
package/README.md
ADDED
|
@@ -0,0 +1,602 @@
|
|
|
1
|
+
# Numa
|
|
2
|
+
|
|
3
|
+
公司内部研发平台的跨平台命令行入口。它同时面向研发人员、CI 和 AI 工具,提供:
|
|
4
|
+
|
|
5
|
+
- 无需登录即可使用的环境诊断、配置和命令发现;
|
|
6
|
+
- 沿用原项目的 Keycloak Authorization Code + PKCE 登录、离线刷新和本地安全缓存;
|
|
7
|
+
- 需要登录或指定 Keycloak 角色的命令门禁;
|
|
8
|
+
- 登录后自动进入只监听本机的网页控制台,并可随时重新打开;
|
|
9
|
+
- 网页控制台提供身份概览、基础配置、命令发现和非交互命令执行;
|
|
10
|
+
- 包含 Realm 角色、Client 角色和用户组的个人信息页;
|
|
11
|
+
- 使用服务端托管的 Codex 账号启动官方 Codex CLI,客户端不保存 refresh token;
|
|
12
|
+
- 通过领域化 `media` 命令安全调用平台托管的 TTS、视频、资产和素材库服务;
|
|
13
|
+
- 兼容原有 stdio MCP 服务。
|
|
14
|
+
|
|
15
|
+
## 环境与安装
|
|
16
|
+
|
|
17
|
+
支持 Windows、macOS 和 Linux,要求 Node.js 20 或更高版本。
|
|
18
|
+
|
|
19
|
+
默认从公共 npm registry 安装,无需修改用户级 npm 配置。如需显式固定 `@numa-tech` scope:
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
npm config set @numa-tech:registry=https://registry.npmjs.org/
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
公司私有 registry 仍受支持,可通过 `numa config --set registryUrl=<url>` 或 shortcut
|
|
26
|
+
的 `--registry-url <url>` 显式选择。发布人员使用 `npm run publish:all`,脚本默认先把
|
|
27
|
+
patch 版本加一,再将同一 tarball 依次推送到公共 npm 和公司私有 registry;脚本会跳过
|
|
28
|
+
已存在的同版本。若其中一个仓库失败,使用 `--resume` 以当前版本补推,不会再次修改版本号。
|
|
29
|
+
可用 `NUMA_PUBLIC_NPM_REGISTRY`、`NUMA_PRIVATE_NPM_REGISTRY` 覆盖两个发布目标。旧版配置
|
|
30
|
+
中作为默认值保存的私有 registry 会自动迁移到公共 npm;迁移后显式设置的私有地址会保留。
|
|
31
|
+
|
|
32
|
+
发布前需要在用户或 CI 的 `.npmrc` 中分别配置两个 registry 的令牌:
|
|
33
|
+
|
|
34
|
+
```ini
|
|
35
|
+
//registry.npmjs.org/:_authToken=${NPM_PUBLIC_TOKEN}
|
|
36
|
+
//packages.aliyun.com/60371955c4393f5ed3b7baa8/npm/npm-registry/:_authToken=${NPM_PRIVATE_TOKEN}
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
脚本会在修改版本号之前运行公共 npm 的 `whoami` 和 `@numa-tech` scope 权限检查。使用验证器
|
|
40
|
+
App 的本地交互发布会在公共 npm 推送前隐藏输入 6 位 OTP,并显式传给 `npm publish`;
|
|
41
|
+
使用带 bypass 2FA 权限的 granular token 时直接回车即可。非交互环境可以临时提供
|
|
42
|
+
`NUMA_PUBLIC_NPM_OTP`,更推荐使用 bypass 2FA granular token 或 npm trusted publishing。
|
|
43
|
+
|
|
44
|
+
首次从本机发布公共包,或公共登录已经过期时,先运行:
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
npm login --registry=https://registry.npmjs.org/
|
|
48
|
+
npm whoami --registry=https://registry.npmjs.org/
|
|
49
|
+
npm org ls numa-tech --registry=https://registry.npmjs.org/
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
双仓库发布命令:
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
# 仅预览:1.11.9 -> 1.11.10,不修改文件、不访问 registry
|
|
56
|
+
npm run publish:all -- --dry-run
|
|
57
|
+
|
|
58
|
+
# 默认 patch:自动修改 package.json 和 package-lock.json,然后推送两个仓库
|
|
59
|
+
npm run publish:all
|
|
60
|
+
|
|
61
|
+
# minor / major / 指定完整版本
|
|
62
|
+
npm run publish:all -- minor
|
|
63
|
+
npm run publish:all -- major
|
|
64
|
+
npm run publish:all -- 2.0.0
|
|
65
|
+
|
|
66
|
+
# 某个仓库失败后,用当前版本补推;不会再次升级版本
|
|
67
|
+
npm run publish:resume
|
|
68
|
+
|
|
69
|
+
# 等价写法(注意中间必须有独立的 --)
|
|
70
|
+
npm run publish:all -- --resume
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
脚本不会自动创建 Git commit 或 tag;发布成功后应提交版本文件。可先运行
|
|
74
|
+
`npm whoami --registry=<registry-url>` 分别检查两个仓库的发布身份。
|
|
75
|
+
|
|
76
|
+
macOS / Windows 日常启动 Codex 的推荐方式:
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
npx -y --prefer-online --registry=https://registry.npmjs.org/ @numa-tech/numa@latest codex shortcut install
|
|
80
|
+
numa-codex
|
|
81
|
+
numa-codex-app
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
需要直接使用完整 `numa` 管理命令时,可选全局安装:
|
|
85
|
+
|
|
86
|
+
```bash
|
|
87
|
+
npm install --global --registry=https://registry.npmjs.org/ @numa-tech/numa
|
|
88
|
+
numa --version
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
无需安装直接运行:
|
|
92
|
+
|
|
93
|
+
```bash
|
|
94
|
+
npx -y --prefer-online --registry=https://registry.npmjs.org/ @numa-tech/numa@latest doctor
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
本地开发:
|
|
98
|
+
|
|
99
|
+
```bash
|
|
100
|
+
npm install
|
|
101
|
+
npm run check
|
|
102
|
+
npm link
|
|
103
|
+
numa help
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
## 快速开始
|
|
107
|
+
|
|
108
|
+
```bash
|
|
109
|
+
# 公开命令,不需要登录
|
|
110
|
+
numa doctor
|
|
111
|
+
numa commands
|
|
112
|
+
|
|
113
|
+
# 登录;成功后浏览器自动跳转到本地网页控制台
|
|
114
|
+
numa login
|
|
115
|
+
|
|
116
|
+
# 随时重新打开网页控制台
|
|
117
|
+
numa console
|
|
118
|
+
|
|
119
|
+
# 终端内配置仍然保留
|
|
120
|
+
numa config
|
|
121
|
+
|
|
122
|
+
# 查看包含角色信息的个人资料
|
|
123
|
+
numa profile
|
|
124
|
+
|
|
125
|
+
# 调用研发平台 API
|
|
126
|
+
numa request /api/projects
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
非交互环境可完全通过参数初始化:
|
|
130
|
+
|
|
131
|
+
```bash
|
|
132
|
+
numa config \
|
|
133
|
+
--set output=json \
|
|
134
|
+
--set locale=zh-CN \
|
|
135
|
+
--set apiBaseUrl=https://rd.example.internal
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
## 命令与访问控制
|
|
139
|
+
|
|
140
|
+
| 命令 | 访问级别 | 说明 |
|
|
141
|
+
| --- | --- | --- |
|
|
142
|
+
| `numa help [command]` | 公开 | 详细帮助、参数和示例 |
|
|
143
|
+
| `numa commands [--json]` | 公开 | AI/脚本可读取的命令目录 |
|
|
144
|
+
| `numa doctor` | 公开 | 检查 Node、平台、配置和登录缓存 |
|
|
145
|
+
| `numa config` | 公开 | 打开配置页或参数化配置 |
|
|
146
|
+
| `numa login` | 公开 | Keycloak PKCE 登录,成功后默认进入网页控制台 |
|
|
147
|
+
| `numa console` | 公开 | 启动只监听本机的网页控制台 |
|
|
148
|
+
| `numa auth status` | 公开 | 查看本地会话状态,不输出令牌 |
|
|
149
|
+
| `numa auth logout` | 公开 | 删除本地登录缓存 |
|
|
150
|
+
| `numa profile` | 需登录 | 当前用户、角色和用户组 |
|
|
151
|
+
| `numa request <path>` | 需登录 | 携带令牌调用平台 API |
|
|
152
|
+
| `numa request <path> --require-role <role...>` | 需角色 | 调用前检查指定角色之一 |
|
|
153
|
+
| `numa admin context` | 需角色 | 要求 `platform-admin` 或 `numa-admin` |
|
|
154
|
+
| `numa media capabilities` | 需登录 | 查询媒体 API、Provider 和版本能力 |
|
|
155
|
+
| `numa media tts submit` | 需登录 | 提交 TTS 异步任务 |
|
|
156
|
+
| `numa media video submit` | 需登录 | 提交视频生成异步任务 |
|
|
157
|
+
| `numa media job inspect` | 需登录 | 查询异步任务状态 |
|
|
158
|
+
| `numa media job resolve` | 需登录 | 按幂等键解析已有任务,避免重复付费提交 |
|
|
159
|
+
| `numa media artifact pull` | 需登录 | 流式下载并校验产物 |
|
|
160
|
+
| `numa media asset upload` | 需登录 | 流式 multipart 上传资产 |
|
|
161
|
+
| `numa media library search/inspect/pull/publish` | 需登录 | 查询、锁定、下载和发布素材 |
|
|
162
|
+
| `numa codex list` | 需登录 | 列出服务端账号元数据,不下载 refresh token |
|
|
163
|
+
| `numa codex upload` | 需登录 | 批量上传 codex-multi-auth 管理的账号池 |
|
|
164
|
+
| `numa codex use` | 需登录 | 选择账号并写入官方 ChatGPT 登录 |
|
|
165
|
+
| `numa codex run` | 需登录 | 使用所选账号启动官方 Codex CLI |
|
|
166
|
+
| `numa codex app` | 需登录 | 使用官方 ChatGPT 登录启动桌面 App |
|
|
167
|
+
| `numa codex shortcut` | 公开 | 安装或删除 macOS/Windows 快捷命令与桌面入口 |
|
|
168
|
+
| `numa codex status` | 公开 | 查看本地选择和官方登录状态 |
|
|
169
|
+
| `numa codex reset` | 公开 | 重置本地选择和登录并清理旧 provider 残留 |
|
|
170
|
+
| `numa serve` | 公开 | 启动兼容 MCP 服务 |
|
|
171
|
+
|
|
172
|
+
`numa codex list` 的人类可读输出采用账号卡片:不显示账号服务地址和底层 ChatGPT UUID,
|
|
173
|
+
只突出账号名称、当前选择以及短周期/长周期剩余额度。额度柱状图会随终端宽度缩放,
|
|
174
|
+
高、中、低余额分别使用绿、黄、红提示;设置 `NO_COLOR=1` 可关闭颜色,设置
|
|
175
|
+
`NUMA_ASCII=1` 可在不支持 Unicode 的终端使用 ASCII 轨道。`--json` 保留完整账号元数据,
|
|
176
|
+
但同样不会返回账号服务地址。服务端返回的空额度窗口不会显示成“长周期 100%”;只有
|
|
177
|
+
带窗口长度、重置时间或实际用量的窗口才会进入账号卡片。这里的“刷新”是额度窗口重置,
|
|
178
|
+
不是 ChatGPT 订阅续费或订阅到期。服务端确认 refresh token 已失效后,账号卡片会标记
|
|
179
|
+
“凭据已失效”,交互选择器会禁止选中该账号;显式指定该账号或凭据在启动期间失效时,
|
|
180
|
+
CLI 会返回稳定错误码 `codex_account_needs_reauth`,需要管理员重新导入有效登录凭据。
|
|
181
|
+
|
|
182
|
+
CLI 的本地角色检查用于快速反馈和隐藏无权限入口,不能替代服务端授权。内部平台 API 必须继续在服务端校验访问令牌、资源和角色。
|
|
183
|
+
|
|
184
|
+
## 配置
|
|
185
|
+
|
|
186
|
+
网页控制台的“基础配置”和 `numa config` 读写同一份配置。直接运行
|
|
187
|
+
`numa config` 仍会打开终端配置页。当前基础配置包括:
|
|
188
|
+
|
|
189
|
+
- `locale`:`zh-CN` 或 `en-US`;
|
|
190
|
+
- `output`:`text` 或 `json`;
|
|
191
|
+
- `apiBaseUrl`:内部研发平台 API 根地址,默认
|
|
192
|
+
`https://apps-gw-prd.mcisaas.com/mci-devops-platform`;
|
|
193
|
+
- `registryUrl`:npm registry,默认公共 npm,也可配置公司私有 registry;
|
|
194
|
+
- `checkUpdates`:是否检查 CLI 更新。
|
|
195
|
+
|
|
196
|
+
读取或脚本化修改:
|
|
197
|
+
|
|
198
|
+
```bash
|
|
199
|
+
numa config --show
|
|
200
|
+
numa config --show --json
|
|
201
|
+
numa config --set output=json --set checkUpdates=false
|
|
202
|
+
numa config --reset
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
配置位置遵循各平台约定:
|
|
206
|
+
|
|
207
|
+
- Linux/macOS:`${XDG_CONFIG_HOME:-~/.config}/numa/config.json`
|
|
208
|
+
- Windows:`%APPDATA%\numa\config.json`
|
|
209
|
+
- 测试/隔离环境:可通过 `NUMA_CONFIG_DIR` 覆盖
|
|
210
|
+
|
|
211
|
+
文件采用版本化 JSON 结构,后续可向后兼容地增加配置项。
|
|
212
|
+
|
|
213
|
+
## 本地网页控制台
|
|
214
|
+
|
|
215
|
+
`numa login` 完成 Keycloak 登录后,回调页会自动跳转到本机控制台。已有登录状态时可直接运行:
|
|
216
|
+
|
|
217
|
+
```bash
|
|
218
|
+
numa console
|
|
219
|
+
|
|
220
|
+
# 只启动服务,不自动打开浏览器
|
|
221
|
+
numa console --no-open
|
|
222
|
+
|
|
223
|
+
# 登录后不保留网页控制台,适合脚本或 CI
|
|
224
|
+
numa login --no-console --no-config --json
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
控制台展示当前身份、Realm/Client 角色、ChatGPT 账号、基础配置和机器可读命令目录。
|
|
228
|
+
ChatGPT 账号页先读取 `codex-multi-auth` 的本地账号与额度缓存并立即展示,再使用当前
|
|
229
|
+
Keycloak 会话连接平台补充当前用户可用账号、剩余 limit 和同步状态。平台不可用时页面
|
|
230
|
+
保留本地结果并明确显示“远程同步失败”,不会把 access token 或 refresh token 返回给页面。
|
|
231
|
+
命令执行器使用
|
|
232
|
+
JSON argv 调用同一版 CLI,不经过 shell,并自动要求结构化 `--json` 输出。删除登录缓存、
|
|
233
|
+
重置 Codex 或配置等操作需要显式确认;`serve`、`codex run`、`codex app`、
|
|
234
|
+
`codex auth-agent` 等长驻、交互或会启动其他应用的命令仍应在终端运行。控制台由当前
|
|
235
|
+
`numa` 进程托管,关闭使用时在终端按 `Ctrl+C` 停止。
|
|
236
|
+
|
|
237
|
+
控制台不是新的远程管理服务:它只允许绑定 `127.0.0.1`、`::1` 或 `localhost`,默认端口
|
|
238
|
+
为 `17654`。页面使用随机 HttpOnly/SameSite 会话 Cookie、CSRF token、严格 Host 校验和
|
|
239
|
+
CSP。OIDC access/refresh token 始终保留在 CLI 进程及私有缓存中,不会返回给浏览器脚本;
|
|
240
|
+
实际平台请求仍由服务端 Keycloak 授权决定。
|
|
241
|
+
|
|
242
|
+
## 平台媒体服务
|
|
243
|
+
|
|
244
|
+
自 1.8.0 起,`numa media` 通过当前 Keycloak 会话调用 `/api/v1/media`。第三方
|
|
245
|
+
Seedance、语音和 OSS 凭据只存在于平台;CLI 不读取、不保存,也不输出这些凭据。
|
|
246
|
+
这些命令直接调用平台 REST API,不经过 `numa_backend_request`,也没有新增媒体 MCP Tool。
|
|
247
|
+
|
|
248
|
+
```bash
|
|
249
|
+
# 查询 API 版本、Provider 和功能开关
|
|
250
|
+
numa media capabilities --json
|
|
251
|
+
|
|
252
|
+
# JSON 输入采用平台 lowerCamelCase 契约;重试时复用同一幂等键
|
|
253
|
+
numa media tts submit \
|
|
254
|
+
--input narration.json \
|
|
255
|
+
--idempotency-key project-scene-01 \
|
|
256
|
+
--json
|
|
257
|
+
|
|
258
|
+
numa media video submit \
|
|
259
|
+
--input seedance.json \
|
|
260
|
+
--idempotency-key project-shot-01 \
|
|
261
|
+
--json
|
|
262
|
+
|
|
263
|
+
numa media job inspect job_123 --json
|
|
264
|
+
|
|
265
|
+
# 网络中断导致提交结果不明时,先解析幂等键,不要直接重提付费任务
|
|
266
|
+
numa media job resolve \
|
|
267
|
+
--type video \
|
|
268
|
+
--idempotency-key project-shot-01 \
|
|
269
|
+
--json
|
|
270
|
+
|
|
271
|
+
# 目标文件必须不存在。CLI 先写同目录临时文件,校验后再原子重命名
|
|
272
|
+
numa media artifact pull artifact_123 \
|
|
273
|
+
--output ./result.mp4 \
|
|
274
|
+
--sha256 0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef \
|
|
275
|
+
--json
|
|
276
|
+
|
|
277
|
+
# 文件以流式 multipart 上传,不编码进 JSON 或命令行参数;结果返回 artifactId
|
|
278
|
+
numa media asset upload ./reference.png \
|
|
279
|
+
--kind image \
|
|
280
|
+
--project-id project_123 \
|
|
281
|
+
--idempotency-key reference-01 \
|
|
282
|
+
--json
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
素材库使用精确的 `id@semver` 引用。发布前先通过 `asset upload` 上传二进制,随后让
|
|
286
|
+
manifest 的 `artifactId` 引用上传结果:
|
|
287
|
+
|
|
288
|
+
```bash
|
|
289
|
+
numa media library search --query product --cursor next_page --limit 20 --json
|
|
290
|
+
numa media library inspect logo-main@1.2.0 --json
|
|
291
|
+
numa media library pull logo-main@1.2.0 --output ./assets --json
|
|
292
|
+
numa media library publish --manifest library-entry.json --json
|
|
293
|
+
```
|
|
294
|
+
|
|
295
|
+
`library publish` 首次创建接受 HTTP 201;同一 `id@semver` 和 SHA-256 的幂等重放接受
|
|
296
|
+
HTTP 200。相同版本对应不同 SHA-256 时,平台应返回带 `code/message/requestId` 的 409。
|
|
297
|
+
|
|
298
|
+
`--json` 的 CLI 外层是稳定的 snake_case envelope,例如 `{"ok":true,"job":...}`;
|
|
299
|
+
`job`、`capabilities`、`entry` 等嵌套的平台 payload 原样保留 lowerCamelCase。首次提交
|
|
300
|
+
任务成功时平台返回 HTTP 202;同一幂等键重放可返回 HTTP 200。两者都至少包含
|
|
301
|
+
`jobId`、`status` 和 `requestId`。
|
|
302
|
+
|
|
303
|
+
用户是否确认付费生成由上层 Skill 记录;真正的安全边界是平台 Grant、Quota 和服务端
|
|
304
|
+
授权。CLI 不接受可伪造的 `--approval-id`。请求 JSON 可以包含只用于审计的
|
|
305
|
+
`approvalContext`,但平台不得把其中的布尔值作为授权依据。
|
|
306
|
+
|
|
307
|
+
`apiBaseUrl` 是服务根地址,可以是 `https://host`,也可以包含网关服务前缀,例如
|
|
308
|
+
`https://host/mci-devops-platform`。后一种配置会把媒体路径解析成
|
|
309
|
+
`/mci-devops-platform/api/v1/media/...`;已经带该前缀的兼容路径不会重复拼接。
|
|
310
|
+
|
|
311
|
+
所有媒体 HTTP 调用只允许发送到 `apiBaseUrl` 的同源、同服务前缀地址。绝对外部 URL、
|
|
312
|
+
`//host` 形式、反斜杠、路径穿越和内嵌 URL 凭据都会在附加 Bearer Token 前被拒绝。
|
|
313
|
+
上传和下载错误会脱敏 Token 与常见签名参数;临时签名 URL 不进入稳定 JSON 输出。
|
|
314
|
+
|
|
315
|
+
## Codex 远端账号
|
|
316
|
+
|
|
317
|
+
`numa codex` 只使用官方 Codex 的 ChatGPT 文件登录模式。账号源主机或正式平台服务保管 OpenAI refresh token;客户端只获得 `access_token`、`id_token`、账号 ID 和到期时间,并写入官方 `~/.codex/auth.json`。模型请求由官方 Codex 直接发送,不经过 Numa 中转。
|
|
318
|
+
|
|
319
|
+
Numa 会清理项目更名前旧版本写入的自定义 `model_provider = "mcex-codex"`、`auth.command`、动态 token helper 和桌面 provider 绑定,不需要删除整个 `~/.codex`。
|
|
320
|
+
|
|
321
|
+
自 1.7.0 起,职责进一步收敛:numa 负责服务端账号分发、选择和短效凭据同步,`codex-multi-auth/cli` 负责把凭据应用到官方文件登录并返回脱敏状态。消费端不会调用 `codex-multi-auth` 的 OAuth 登录、本地账号池切换或 refresh token 刷新功能;真实 refresh token 仍只存在于服务端。升级期间 2.8.x 保留兼容写入路径,安装 `codex-multi-auth` 2.9.0 及以上后自动使用新的公共接口。
|
|
322
|
+
|
|
323
|
+
默认连接生产网关;也可通过以下任一种方式显式覆盖:
|
|
324
|
+
|
|
325
|
+
```bash
|
|
326
|
+
numa codex list --server https://apps-gw-prd.mcisaas.com/mci-devops-platform/api
|
|
327
|
+
export NUMA_CODEX_SERVICE_URL=https://apps-gw-prd.mcisaas.com/mci-devops-platform/api
|
|
328
|
+
numa config --set apiBaseUrl=https://apps-gw-prd.mcisaas.com/mci-devops-platform
|
|
329
|
+
```
|
|
330
|
+
|
|
331
|
+
选择账号并启动:
|
|
332
|
+
|
|
333
|
+
```bash
|
|
334
|
+
# 管理员:把当前 codex-multi-auth 账号池批量上传到平台
|
|
335
|
+
numa codex upload --server https://platform.example/api
|
|
336
|
+
|
|
337
|
+
numa codex list
|
|
338
|
+
numa codex use acct_xxx
|
|
339
|
+
numa codex run
|
|
340
|
+
|
|
341
|
+
# 每次启动前列出当前用户可用账号并交互选择
|
|
342
|
+
numa codex run --select-account
|
|
343
|
+
numa codex app . --select-account
|
|
344
|
+
|
|
345
|
+
# 非交互脚本直接指定平台账号 ID
|
|
346
|
+
numa codex run --account acct_xxx
|
|
347
|
+
|
|
348
|
+
# 将参数原样交给官方 Codex
|
|
349
|
+
numa codex run -- exec "完成这个长任务"
|
|
350
|
+
numa codex run -- resume --last
|
|
351
|
+
```
|
|
352
|
+
|
|
353
|
+
### macOS / Windows 快捷入口
|
|
354
|
+
|
|
355
|
+
日常使用优先安装快捷入口,无需全局安装 `@numa-tech/numa`。安装命令显式解析
|
|
356
|
+
`@numa-tech/numa@latest`,生成的快捷入口也会在每次启动时使用 `--prefer-online`
|
|
357
|
+
检查 npm 仓库中的最新客户端版本:
|
|
358
|
+
|
|
359
|
+
```bash
|
|
360
|
+
npx -y --prefer-online --registry=https://registry.npmjs.org/ @numa-tech/numa@latest codex shortcut install
|
|
361
|
+
|
|
362
|
+
# 日常首选;首次运行会自动完成公司登录和账号选择
|
|
363
|
+
numa-codex
|
|
364
|
+
|
|
365
|
+
# 参数继续原样转发给官方 Codex
|
|
366
|
+
numa-codex exec "完成这个任务"
|
|
367
|
+
|
|
368
|
+
# 启动官方 Codex 桌面 App
|
|
369
|
+
numa-codex-app
|
|
370
|
+
```
|
|
371
|
+
|
|
372
|
+
`--prefer-online` 会在启动时强制检查仓库元数据,`@latest` 避免复用项目内可能存在的旧版
|
|
373
|
+
`@numa-tech/numa`;已经缓存的相同版本仍由 npm 复用。自动更新要求配置的 npm registry 可访问,
|
|
374
|
+
并以仓库 `latest` dist-tag 指向的版本为准。已安装旧版快捷入口的用户重新执行一次上述安装
|
|
375
|
+
命令,即可升级为自动检查最新版的包装脚本。快捷入口默认从公共 npm 获取 Numa CLI;
|
|
376
|
+
启动 Codex 时仍按 `NUMA_CODEX_BIN`、PATH 中可用版本、包内版本的顺序选择。
|
|
377
|
+
|
|
378
|
+
默认安装 `run` 和 `app` 两种入口。macOS 默认的 `--scope auto` 会先使用可写的
|
|
379
|
+
`/usr/local/bin` 与 `/Applications`;没有系统级权限时自动降级到
|
|
380
|
+
`~/.local/bin/numa-codex*` 与 `~/Applications/Numa Codex.app`,全程不会
|
|
381
|
+
调用 `sudo`。可用 `--scope system` 或 `--scope user` 显式指定。Windows 写入用户 npm 命令目录,并在开始菜单
|
|
382
|
+
创建 `Numa Codex`。macOS App Bundle 使用 ChatGPT macOS 应用内置图标,Windows 开始菜单
|
|
383
|
+
入口使用由同一图标转换的 Windows 图标;来源和商标说明见 `THIRD_PARTY_NOTICES.md`。桌面入口默认绑定安装命令
|
|
384
|
+
执行时的当前目录,也可显式指定:
|
|
385
|
+
|
|
386
|
+
```bash
|
|
387
|
+
npx -y --prefer-online --registry=https://registry.npmjs.org/ @numa-tech/numa@latest codex shortcut install --target app --workspace /path/to/project
|
|
388
|
+
npx -y --prefer-online --registry=https://registry.npmjs.org/ @numa-tech/numa@latest codex shortcut install --target run --select-account
|
|
389
|
+
npx -y --prefer-online --registry=https://registry.npmjs.org/ @numa-tech/numa@latest codex shortcut install --account acct_xxx
|
|
390
|
+
```
|
|
391
|
+
|
|
392
|
+
安装是幂等的,并拒绝覆盖同名的用户文件;确需替换时使用 `--force`。删除只处理安装清单中
|
|
393
|
+
由 numa 管理的入口:
|
|
394
|
+
|
|
395
|
+
```bash
|
|
396
|
+
npx -y --prefer-online --registry=https://registry.npmjs.org/ @numa-tech/numa@latest codex shortcut remove
|
|
397
|
+
```
|
|
398
|
+
|
|
399
|
+
在 macOS/Windows 终端直接运行 `codex run` 且尚未安装默认快捷命令时,CLI 会用中文提示
|
|
400
|
+
上述安装命令;检测到受管的 `numa-codex` 后不再重复提示。
|
|
401
|
+
|
|
402
|
+
`numa codex upload` 默认读取当前 `codex-multi-auth` 存储上下文,也可使用
|
|
403
|
+
`--storage <path>` 指定账号文件。整批上传会包含所有启用和停用账号;任一账号缺少
|
|
404
|
+
refresh token 时整批终止,避免服务端形成不完整快照。令牌只通过带 Keycloak Bearer
|
|
405
|
+
认证的 HTTPS 请求发送,不写入 CLI 输出。
|
|
406
|
+
|
|
407
|
+
`@numa-tech/numa` 直接依赖官方 `@openai/codex`,因此发布到 npm 后,新主机可以用一条命令安装并启动:
|
|
408
|
+
|
|
409
|
+
```bash
|
|
410
|
+
npx -y --prefer-online --registry=https://registry.npmjs.org/ @numa-tech/numa@latest codex run --server https://platform.example/api
|
|
411
|
+
```
|
|
412
|
+
|
|
413
|
+
启动时会先运行 `codex --version` 做健康检查,依次使用 `NUMA_CODEX_BIN` 指定的入口、
|
|
414
|
+
PATH 中已安装且可用的 Codex CLI、最后才使用 `@numa-tech/numa` 包内版本。这样已全局安装
|
|
415
|
+
Codex 的主机不会受包内平台可选依赖缺失影响;外部版本不可用时会自动回退。设置
|
|
416
|
+
`NUMA_USE_BUNDLED_CODEX=1` 可跳过 PATH 探测并强制使用包内版本。
|
|
417
|
+
|
|
418
|
+
如果本机没有 Numa 会话,交互式 `run` 会先启动 Keycloak 登录。SSH 场景需要把登录回调端口转发到远端,例如 `ssh -L 8765:127.0.0.1:8765 host`。非交互环境必须预先运行 `numa login` 或提供 `NUMA_TOKEN_CACHE_PATH`。
|
|
419
|
+
|
|
420
|
+
### Codex 桌面 App
|
|
421
|
+
|
|
422
|
+
官方 Codex CLI、IDE 扩展和桌面 App 共享 `~/.codex/auth.json`。macOS/Windows 可直接运行:
|
|
423
|
+
|
|
424
|
+
```bash
|
|
425
|
+
numa codex app . \
|
|
426
|
+
--server https://platform.example/api
|
|
427
|
+
```
|
|
428
|
+
|
|
429
|
+
该命令会:
|
|
430
|
+
|
|
431
|
+
1. 选择并验证服务端账号;
|
|
432
|
+
2. 从服务端领取不含 refresh token 的官方登录凭据;
|
|
433
|
+
3. 原子更新 ChatGPT 模式 `auth.json`;
|
|
434
|
+
4. 清理项目更名前旧版 `mcex-codex` provider 残留;
|
|
435
|
+
5. 直接启动官方 `codex app`。
|
|
436
|
+
|
|
437
|
+
如果桌面 App 已经运行,需要完全退出后重新打开。`numa codex status` 可检查所选账号是否与官方登录文件匹配。
|
|
438
|
+
|
|
439
|
+
### 前台官方登录同步
|
|
440
|
+
|
|
441
|
+
需要验证官方订阅身份、插件目录和 `personalAccessToken` 认证效果时,可以让认证代理在前台运行:
|
|
442
|
+
|
|
443
|
+
```bash
|
|
444
|
+
numa codex auth-agent acct_xxx --replace-login
|
|
445
|
+
```
|
|
446
|
+
|
|
447
|
+
该命令会替换当前官方 Codex 登录,因此必须显式传入 `--replace-login`。代理仅支持官方 CLI 的文件凭据存储,并在首次替换前把已有 `~/.codex/auth.json` 备份为 `~/.codex/auth.json.numa-backup`。
|
|
448
|
+
|
|
449
|
+
进入该模式时,代理会自动清理项目更名前遗留的 `mcex-codex` provider 和顶层选择。之后所有 CLI、IDE 和 App 都只读取官方登录文件。
|
|
450
|
+
|
|
451
|
+
账号服务会专门刷新并返回 `access_token`、`id_token`、账号 ID 和到期时间,但绝不返回 OpenAI refresh token。客户端使用原子替换和 `0600` 权限写入 ChatGPT 模式 `auth.json`;其中 `refresh_token` 是每次凭据安装时由本机生成的 48 字节高熵随机占位值,不使用真实 refresh token 的格式或固定公共字符串。真实 refresh token 始终只在服务器。写入后代理运行:
|
|
452
|
+
|
|
453
|
+
```bash
|
|
454
|
+
codex -c 'cli_auth_credentials_store="file"' login status
|
|
455
|
+
```
|
|
456
|
+
|
|
457
|
+
`codex login --with-access-token` 只接受 Codex Personal/Agent access token,不能用于这里的 ChatGPT OAuth access token,因此代理不会调用该命令。
|
|
458
|
+
|
|
459
|
+
前台会持续输出脱敏状态日志:
|
|
460
|
+
|
|
461
|
+
```text
|
|
462
|
+
2026-07-30T07:00:00.000Z INFO auth.backup 已备份当前 Codex 文件登录: ~/.codex/auth.json.numa-backup
|
|
463
|
+
2026-07-30T07:00:00.010Z INFO agent.start 前台认证代理已启动;账号=Primary (acct_xxx)...
|
|
464
|
+
2026-07-30T07:00:00.020Z INFO token.fetch 正在从账号服务领取有效 access token
|
|
465
|
+
2026-07-30T07:00:00.100Z INFO token.received 已收到短效凭据;剩余=237小时...
|
|
466
|
+
2026-07-30T07:00:00.110Z INFO auth.write 正在原子更新 ChatGPT 模式 auth.json
|
|
467
|
+
2026-07-30T07:00:00.400Z INFO codex.verify.output Logged in using ChatGPT
|
|
468
|
+
2026-07-30T07:00:00.410Z INFO token.installed 短效凭据已写入 auth.json 并经官方 Codex 验证
|
|
469
|
+
```
|
|
470
|
+
|
|
471
|
+
默认每 60 秒检查一次,剩余 1 小时时向服务端领取并安装新 token,从而尽量早于官方 App 自己的刷新尝试。token 本身不会出现在日志或命令参数中:
|
|
472
|
+
|
|
473
|
+
```bash
|
|
474
|
+
# 调整检查与提前刷新窗口
|
|
475
|
+
numa codex auth-agent --replace-login \
|
|
476
|
+
--interval 30 \
|
|
477
|
+
--refresh-before 3600
|
|
478
|
+
|
|
479
|
+
# 只安装和验证一次
|
|
480
|
+
numa codex auth-agent --replace-login --once
|
|
481
|
+
|
|
482
|
+
# JSON Lines 状态日志
|
|
483
|
+
numa --json codex auth-agent --replace-login
|
|
484
|
+
|
|
485
|
+
# 恢复首次运行前的文件登录
|
|
486
|
+
numa codex auth-agent --restore
|
|
487
|
+
```
|
|
488
|
+
|
|
489
|
+
按 `Ctrl+C` 可停止前台代理。运行中的桌面 App 可能缓存旧凭据;日志出现 `app.reload` 提示、账号仍未切换或发生 `401` 时,需要完全退出后重新打开 App。当前仅支持 `--credential-store file`,不写入 Keychain。
|
|
490
|
+
|
|
491
|
+
### 长任务与续期
|
|
492
|
+
|
|
493
|
+
`numa codex run` 和 `numa codex app` 不再承担运行时续期。需要覆盖超过当前 access token 有效期的长任务时,应在独立前台终端持续运行 `numa codex auth-agent --replace-login`。代理默认每 60 秒检查一次,并在剩余 1 小时时向服务端领取新凭据、原子更新 `auth.json`。
|
|
494
|
+
|
|
495
|
+
服务短暂不可用时,官方 Codex 可继续使用尚未过期的当前 access token;服务持续不可用直到 token 过期,或服务端 refresh 失败时,任务仍可能中断。客户端不会自行刷新,也不会持有真实 refresh token。
|
|
496
|
+
|
|
497
|
+
本地敏感文件采用 `0600` 权限:
|
|
498
|
+
|
|
499
|
+
- `${XDG_CONFIG_HOME:-~/.config}/numa/codex-selection.json`:服务地址和账号选择,不含 token;
|
|
500
|
+
- `~/.codex/auth.json`:官方 ChatGPT 登录文件,包含短效 access/id token 和本机随机 refresh 占位值;
|
|
501
|
+
- `~/.codex/auth.json.numa-backup`:首次替换前保留的原登录备份。
|
|
502
|
+
|
|
503
|
+
运行 `numa codex reset` 会清理账号选择和旧 provider 残留;存在备份时恢复原登录,否则只在确认当前 `auth.json` 属于所选 numa 账号时移除它。该命令不会删除源主机账号。也可单独使用 `numa codex auth-agent --restore` 恢复备份。
|
|
504
|
+
|
|
505
|
+
## 登录、个人信息与角色
|
|
506
|
+
|
|
507
|
+
登录逻辑继续使用原项目的本地浏览器 PKCE 回调:
|
|
508
|
+
|
|
509
|
+
```text
|
|
510
|
+
http://127.0.0.1:8765/callback
|
|
511
|
+
```
|
|
512
|
+
|
|
513
|
+
成功后访问令牌和刷新令牌只写入本地令牌缓存,不会由 CLI 或 MCP 工具输出。`numa profile` 会聚合:
|
|
514
|
+
|
|
515
|
+
- OIDC 用户资料;
|
|
516
|
+
- `realm_access.roles`;
|
|
517
|
+
- 各客户端的 `resource_access.<client>.roles`;
|
|
518
|
+
- 用户组 `groups`。
|
|
519
|
+
|
|
520
|
+
Keycloak 客户端需要允许:
|
|
521
|
+
|
|
522
|
+
```text
|
|
523
|
+
Valid redirect URIs:
|
|
524
|
+
http://127.0.0.1:8765/callback
|
|
525
|
+
http://localhost:8765/callback
|
|
526
|
+
|
|
527
|
+
Web origins:
|
|
528
|
+
http://127.0.0.1:8765
|
|
529
|
+
http://localhost:8765
|
|
530
|
+
```
|
|
531
|
+
|
|
532
|
+
如需长期会话,还要允许 `offline_access`。
|
|
533
|
+
|
|
534
|
+
### 认证环境变量
|
|
535
|
+
|
|
536
|
+
| 变量 | 默认值 | 用途 |
|
|
537
|
+
| --- | --- | --- |
|
|
538
|
+
| `NUMA_KEYCLOAK_DISCOVERY_URL` | production numa realm | OIDC discovery,优先级最高 |
|
|
539
|
+
| `NUMA_KEYCLOAK_ISSUER_URL` | 未设置 | 用于推导 discovery URL |
|
|
540
|
+
| `NUMA_KEYCLOAK_BASE_URL` + `NUMA_KEYCLOAK_REALM` | 未设置 | 用于推导 issuer |
|
|
541
|
+
| `NUMA_KEYCLOAK_CLIENT_ID` | `mcp-client` | OIDC client ID |
|
|
542
|
+
| `NUMA_KEYCLOAK_CLIENT_SECRET` | 未设置 | 仅供 confidential client |
|
|
543
|
+
| `NUMA_KEYCLOAK_REDIRECT_URI` | localhost callback | 完整回调覆盖 |
|
|
544
|
+
| `NUMA_KEYCLOAK_SCOPES` | `openid profile email offline_access` | OAuth scopes |
|
|
545
|
+
| `NUMA_TOKEN_CACHE_PATH` | `~/.config/numa/keycloak-token.json` | Keycloak 令牌缓存路径 |
|
|
546
|
+
| `NUMA_AUTH_OPEN_BROWSER` | `true` | 是否自动打开浏览器 |
|
|
547
|
+
| `NUMA_CONSOLE_HOST` | `127.0.0.1` | 网页控制台监听地址,只接受回环地址 |
|
|
548
|
+
| `NUMA_CONSOLE_PORT` | `17654` | 网页控制台监听端口 |
|
|
549
|
+
| `NUMA_BACKEND_BASE_URL` | 配置中的 `apiBaseUrl` | 平台 API 根地址,环境变量优先 |
|
|
550
|
+
| `NUMA_BACKEND_ALLOW_ABSOLUTE_URLS` | `false` | 是否接受绝对 URL 输入;即使开启也严格限制为平台同源 |
|
|
551
|
+
| `NUMA_CODEX_BIN` | 自动探测 | 显式指定官方 Codex CLI 可执行文件,优先级最高 |
|
|
552
|
+
| `NUMA_USE_BUNDLED_CODEX` | `false` | 设为 `1` 时跳过 PATH 探测,强制使用 CLI 包内 Codex |
|
|
553
|
+
|
|
554
|
+
## AI 和自动化调用
|
|
555
|
+
|
|
556
|
+
所有命令都有 `--help`、访问级别、参数说明和示例:
|
|
557
|
+
|
|
558
|
+
```bash
|
|
559
|
+
numa help
|
|
560
|
+
numa help request
|
|
561
|
+
numa commands --json
|
|
562
|
+
```
|
|
563
|
+
|
|
564
|
+
AI 或 CI 应优先:
|
|
565
|
+
|
|
566
|
+
1. 运行 `numa commands --json` 发现能力;
|
|
567
|
+
2. 为业务命令添加全局 `--json`,获得稳定结构化结果;
|
|
568
|
+
3. 根据退出码处理错误:`1` 通用失败、`3` 需要登录、`4` 缺少角色;
|
|
569
|
+
4. 不读取或传播本地令牌文件。
|
|
570
|
+
|
|
571
|
+
示例:
|
|
572
|
+
|
|
573
|
+
```bash
|
|
574
|
+
numa --json profile
|
|
575
|
+
numa --json request /api/projects
|
|
576
|
+
numa --json request /api/admin --require-role platform-admin
|
|
577
|
+
```
|
|
578
|
+
|
|
579
|
+
## MCP 兼容
|
|
580
|
+
|
|
581
|
+
```json
|
|
582
|
+
{
|
|
583
|
+
"mcpServers": {
|
|
584
|
+
"numa": {
|
|
585
|
+
"command": "numa",
|
|
586
|
+
"args": ["serve"]
|
|
587
|
+
}
|
|
588
|
+
}
|
|
589
|
+
}
|
|
590
|
+
```
|
|
591
|
+
|
|
592
|
+
MCP 工具:
|
|
593
|
+
|
|
594
|
+
- `numa_command_catalog`
|
|
595
|
+
- `numa_auth_status`
|
|
596
|
+
- `numa_auth_start_login`
|
|
597
|
+
- `numa_auth_complete_login`
|
|
598
|
+
- `numa_auth_whoami`
|
|
599
|
+
- `numa_auth_logout`
|
|
600
|
+
- `numa_backend_request`
|
|
601
|
+
|
|
602
|
+
`numa_backend_request` 可传 `required_roles` 做 CLI 侧预检查;服务端仍须执行最终授权。
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# Third-party notices
|
|
2
|
+
|
|
3
|
+
## ChatGPT application icon
|
|
4
|
+
|
|
5
|
+
- Source application: ChatGPT for macOS
|
|
6
|
+
- Source resources: `Contents/Resources/icon-chatgpt.icns` and `icon-chatgpt.png`
|
|
7
|
+
- Retrieved from the locally installed application: 2026-08-05
|
|
8
|
+
- Packaged ICNS SHA-256: `8ee5a24e1e32e33f976bc56943c2e8ad0a700449e6857741e543dc738648a2fb`
|
|
9
|
+
- Derived ICO SHA-256: `4545a9e0b29627db6c7e2f6c27e7babede751559736b092b910966d72d6eb789`
|
|
10
|
+
|
|
11
|
+
The Windows ICO is a format conversion of the ChatGPT application icon. ChatGPT, the application
|
|
12
|
+
icon, and associated trademark rights belong to their respective owner. Inclusion of the icon does
|
|
13
|
+
not imply endorsement by or affiliation with OpenAI.
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export type OutputFormat = "text" | "json";
|
|
2
|
+
export type CliLocale = "zh-CN" | "en-US";
|
|
3
|
+
export interface AppConfig {
|
|
4
|
+
schemaVersion: 2;
|
|
5
|
+
locale: CliLocale;
|
|
6
|
+
output: OutputFormat;
|
|
7
|
+
apiBaseUrl: string;
|
|
8
|
+
registryUrl: string;
|
|
9
|
+
checkUpdates: boolean;
|
|
10
|
+
initializedAt?: string;
|
|
11
|
+
updatedAt?: string;
|
|
12
|
+
}
|
|
13
|
+
export declare const DEFAULT_REGISTRY_URL = "https://registry.npmjs.org/";
|
|
14
|
+
export declare const LEGACY_PRIVATE_REGISTRY_URL = "https://packages.aliyun.com/60371955c4393f5ed3b7baa8/npm/npm-registry/";
|
|
15
|
+
export declare const DEFAULT_API_BASE_URL = "https://apps-gw-prd.mcisaas.com/mci-devops-platform";
|
|
16
|
+
export declare const DEFAULT_APP_CONFIG: AppConfig;
|
|
17
|
+
export declare function appConfigDirectory(): string;
|
|
18
|
+
export declare function appConfigPath(): string;
|
|
19
|
+
export declare function loadAppConfig(): Promise<AppConfig>;
|
|
20
|
+
export declare function loadAppConfigSync(): AppConfig;
|
|
21
|
+
export declare function hasAppConfig(): Promise<boolean>;
|
|
22
|
+
export declare function saveAppConfig(config: AppConfig): Promise<AppConfig>;
|
|
23
|
+
export declare function resetAppConfig(): Promise<void>;
|
|
24
|
+
export declare const CONFIG_KEYS: readonly ["locale", "output", "apiBaseUrl", "registryUrl", "checkUpdates"];
|
|
25
|
+
export type ConfigKey = (typeof CONFIG_KEYS)[number];
|
|
26
|
+
export declare function updateConfigValue(config: AppConfig, expression: string): AppConfig;
|