@numa-tech/numa 1.11.11 → 1.11.13

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
@@ -81,6 +81,9 @@ numa-codex
81
81
  numa-codex-app
82
82
  ```
83
83
 
84
+ 面向业务同事的图文说明见 [`docs/chatgpt-cli-guide.html`](docs/chatgpt-cli-guide.html),其中分别介绍
85
+ CLI 与桌面版的适用场景、一次安装两个入口、首次登录和常见问题排查。
86
+
84
87
  需要直接使用完整 `numa` 管理命令时,可选全局安装:
85
88
 
86
89
  ```bash
@@ -350,6 +353,9 @@ numa codex run -- exec "完成这个长任务"
350
353
  numa codex run -- resume --last
351
354
  ```
352
355
 
356
+ 当前用户没有绑定可用账号时,CLI 会提示前往 OA 系统提交 `IT11` 工单,申请独享或共享的
357
+ ChatGPT 个人账号;无需把本地登录文件或令牌附在工单中。
358
+
353
359
  ### macOS / Windows 快捷入口
354
360
 
355
361
  日常使用优先安装快捷入口,无需全局安装 `@numa-tech/numa`。安装命令显式解析
@@ -415,7 +421,11 @@ PATH 中已安装且可用的 Codex CLI、最后才使用 `@numa-tech/numa` 包
415
421
  Codex 的主机不会受包内平台可选依赖缺失影响;外部版本不可用时会自动回退。设置
416
422
  `NUMA_USE_BUNDLED_CODEX=1` 可跳过 PATH 探测并强制使用包内版本。
417
423
 
418
- 如果本机没有 Numa 会话,交互式 `run` 会先启动 Keycloak 登录。SSH 场景需要把登录回调端口转发到远端,例如 `ssh -L 8765:127.0.0.1:8765 host`。非交互环境必须预先运行 `numa login` 或提供 `NUMA_TOKEN_CACHE_PATH`。
424
+ 如果本机没有 Numa 会话,`codex list/use/run/app/upload/auth-agent` 等交互式命令会提示
425
+ `你还没有登录,是否打开浏览器进行登录?(Y/n)`;直接回车默认打开浏览器并在登录成功后
426
+ 继续原命令。输入 `n` 会取消登录。SSH 场景需要把登录回调端口转发到远端,例如
427
+ `ssh -L 8765:127.0.0.1:8765 host`。非交互环境不会打开浏览器,必须预先运行
428
+ `numa login` 或提供 `NUMA_TOKEN_CACHE_PATH`。
419
429
 
420
430
  ### Codex 桌面 App
421
431
 
@@ -1,2 +1,13 @@
1
1
  import type { Command } from "commander";
2
+ export declare const NO_AVAILABLE_CHATGPT_ACCOUNT_MESSAGE = "\u5F53\u524D\u7528\u6237\u6CA1\u6709\u7ED1\u5B9A\u53EF\u7528\u7684 ChatGPT \u8D26\u53F7\u3002\u8BF7\u524D\u5F80 OA \u7CFB\u7EDF\u63D0\u4EA4 IT11 \u5DE5\u5355\uFF0C\u7533\u8BF7\u72EC\u4EAB\u6216\u5171\u4EAB\u7684 ChatGPT \u4E2A\u4EBA\u8D26\u53F7\u3002";
3
+ import { blockingBrowserLogin, ensureAccessToken } from "./oauth.js";
4
+ export declare function confirmBrowserLogin(input?: NodeJS.ReadableStream, output?: NodeJS.WritableStream): Promise<boolean>;
5
+ interface EnsureRunLoginDependencies {
6
+ ensureAccessToken?: typeof ensureAccessToken;
7
+ blockingBrowserLogin?: typeof blockingBrowserLogin;
8
+ confirmBrowserLogin?: typeof confirmBrowserLogin;
9
+ stdinIsTTY?: boolean;
10
+ }
11
+ export declare function ensureRunLogin(dependencies?: EnsureRunLoginDependencies): Promise<void>;
2
12
  export declare function registerCodexCommands(program: Command): void;
13
+ export {};
@@ -1,6 +1,7 @@
1
1
  import { createHash } from "node:crypto";
2
2
  import { hostname } from "node:os";
3
3
  import process from "node:process";
4
+ import { createInterface } from "node:readline/promises";
4
5
  import { getStoragePath, loadAccounts, setStoragePath, setStoragePathDirect } from "codex-multi-auth/storage";
5
6
  import { loadAppConfig } from "./app-config.js";
6
7
  import { CODEX_APP_NAME, CODEX_SHORTCUT_NAME, PACKAGE_NAME } from "./branding.js";
@@ -11,6 +12,8 @@ import { codexShortcutInstallHintNeeded, installCodexShortcuts, removeCodexShort
11
12
  import { loadCodexQuotaUploads } from "./codex-quota-cache.js";
12
13
  import { codexAccountStatusText, isCodexAccountAvailable, promptCodexAccount, renderCodexAccountDashboard } from "./codex-tui.js";
13
14
  import { listRemoteCodexAccounts, normalizeCodexServiceUrl, uploadRemoteCodexAccounts } from "./codex-service-client.js";
15
+ export const NO_AVAILABLE_CHATGPT_ACCOUNT_MESSAGE = "当前用户没有绑定可用的 ChatGPT 账号。请前往 OA 系统提交 IT11 工单,申请独享或共享的 ChatGPT 个人账号。";
16
+ const NO_AVAILABLE_CHATGPT_ACCOUNT_PROMPT = `【需要申请 ChatGPT 账号】\n${NO_AVAILABLE_CHATGPT_ACCOUNT_MESSAGE}`;
14
17
  import { clearCodexSelection, loadCodexSelection, saveCodexSelection } from "./codex-selection.js";
15
18
  import { loadConfig } from "./config.js";
16
19
  import { blockingBrowserLogin, ensureAccessToken, LoginRequiredError } from "./oauth.js";
@@ -65,11 +68,8 @@ async function resolveServiceOptions(options) {
65
68
  }
66
69
  async function selectAccount(accounts, requested, selectedAccountId) {
67
70
  const availableAccounts = accounts.filter(isCodexAccountAvailable);
68
- if (accounts.length === 0)
69
- throw new Error("Codex 账号服务没有分配给当前用户的账号。");
70
- if (availableAccounts.length === 0) {
71
- throw new Error("分配给当前用户的 ChatGPT 账号当前均不可用,请检查凭据状态或联系管理员。");
72
- }
71
+ if (availableAccounts.length === 0)
72
+ throw new Error(NO_AVAILABLE_CHATGPT_ACCOUNT_PROMPT);
73
73
  if (!requested) {
74
74
  if (availableAccounts.length === 1)
75
75
  return availableAccounts[0];
@@ -154,19 +154,46 @@ async function ensureSelectedOfficialAuth(options) {
154
154
  }
155
155
  return selected;
156
156
  }
157
- async function ensureRunLogin() {
157
+ export async function confirmBrowserLogin(input = process.stdin, output = process.stderr) {
158
+ const prompt = createInterface({
159
+ input,
160
+ output,
161
+ terminal: Boolean(input.isTTY)
162
+ });
163
+ try {
164
+ while (true) {
165
+ const answer = (await prompt.question("你还没有登录,是否打开浏览器进行登录?(Y/n) ")).trim().toLowerCase();
166
+ if (answer === "" || answer === "y" || answer === "yes")
167
+ return true;
168
+ if (answer === "n" || answer === "no")
169
+ return false;
170
+ output.write("请输入 Y 或 n。\n");
171
+ }
172
+ }
173
+ finally {
174
+ prompt.close();
175
+ }
176
+ }
177
+ export async function ensureRunLogin(dependencies = {}) {
158
178
  const authConfig = loadConfig();
179
+ const accessToken = dependencies.ensureAccessToken ?? ensureAccessToken;
180
+ const browserLogin = dependencies.blockingBrowserLogin ?? blockingBrowserLogin;
181
+ const confirmLogin = dependencies.confirmBrowserLogin ?? confirmBrowserLogin;
182
+ const stdinIsTTY = dependencies.stdinIsTTY ?? Boolean(process.stdin.isTTY);
159
183
  try {
160
- await ensureAccessToken(authConfig);
184
+ await accessToken(authConfig);
161
185
  }
162
186
  catch (error) {
163
187
  if (!(error instanceof LoginRequiredError))
164
188
  throw error;
165
- if (!process.stdin.isTTY) {
189
+ if (!stdinIsTTY) {
166
190
  throw new LoginRequiredError("非交互环境没有可用的 Keycloak 登录。请先运行 numa login,或预置 NUMA_TOKEN_CACHE_PATH。");
167
191
  }
192
+ if (!(await confirmLogin())) {
193
+ throw new LoginRequiredError("你还没有登录,已取消打开浏览器。请先运行 numa login。");
194
+ }
168
195
  process.stderr.write("尚未登录 Numa,正在启动 Keycloak 登录流程。\n");
169
- await blockingBrowserLogin(authConfig);
196
+ await browserLogin(authConfig);
170
197
  }
171
198
  }
172
199
  function addExamples(command, examples) {
@@ -182,18 +209,34 @@ export function registerCodexCommands(program) {
182
209
  .option("-u, --server <url>", "Codex 账号服务 URL")
183
210
  .option("--insecure-poc", "允许连接隔离网络中的非回环 HTTP 联调服务")
184
211
  .action(async (options, command) => {
212
+ await ensureRunLogin();
185
213
  const service = await resolveServiceOptions(options);
186
214
  const result = await listRemoteCodexAccounts(loadConfig(), service.serviceUrl, service.allowInsecurePoc);
215
+ const hasAvailableAccount = result.accounts.some(isCodexAccountAvailable);
187
216
  if (useJson(command) || (await loadAppConfig()).output === "json") {
188
- printJson({ ok: true, ...result });
217
+ printJson({
218
+ ok: true,
219
+ ...result,
220
+ ...(hasAvailableAccount
221
+ ? {}
222
+ : {
223
+ guidance: {
224
+ code: "chatgpt_account_request_required",
225
+ ticket_template: "IT11",
226
+ message: NO_AVAILABLE_CHATGPT_ACCOUNT_MESSAGE
227
+ }
228
+ })
229
+ });
189
230
  return;
190
231
  }
191
232
  if (result.accounts.length === 0) {
192
- process.stdout.write("没有可用的 Codex 账号。\n");
233
+ process.stdout.write(`${NO_AVAILABLE_CHATGPT_ACCOUNT_PROMPT}\n`);
193
234
  return;
194
235
  }
195
236
  const localSelection = await loadCodexSelection();
196
237
  process.stdout.write(renderCodexAccountDashboard(result.accounts, localSelection?.account.id ?? result.defaultAccountId ?? undefined));
238
+ if (!hasAvailableAccount)
239
+ process.stdout.write(`${NO_AVAILABLE_CHATGPT_ACCOUNT_PROMPT}\n`);
197
240
  }), [
198
241
  "numa codex list --server https://platform.example/api",
199
242
  "numa codex list --server http://10.0.0.8:9876 --insecure-poc --json"
@@ -1 +1 @@
1
- {"version":3,"file":"codex-commands.js","sourceRoot":"","sources":["../src/codex-commands.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"codex-commands.js","sourceRoot":"","sources":["../src/codex-commands.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,3 @@
1
1
  export declare const CONSOLE_HTML = "<!doctype html>\n<html lang=\"zh-CN\">\n<head>\n <meta charset=\"utf-8\">\n <meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">\n <title>Numa CLI \u63A7\u5236\u53F0</title>\n <link rel=\"stylesheet\" href=\"/assets/console.css\">\n</head>\n<body>\n <div id=\"app\" class=\"boot\"><div class=\"boot-mark\">N</div><p>\u6B63\u5728\u8FDE\u63A5\u672C\u5730\u63A7\u5236\u53F0\u2026</p></div>\n <script type=\"module\" src=\"/assets/console.js\"></script>\n</body>\n</html>";
2
- export declare const CONSOLE_CSS = "\n:root{color-scheme:light;--ink:#0b1728;--navy:#07182b;--navy-2:#102943;--cyan:#0eb7bf;--cyan-soft:#dff7f6;--mist:#eef4f8;--paper:#fbfdff;--line:#d7e2ea;--muted:#64778c;--amber:#e99a32;--red:#d94b58;--green:#198a68;--shadow:0 18px 50px rgba(12,38,62,.1)}\n*{box-sizing:border-box}html,body,#app{min-height:100%}body{min-height:100vh;margin:0;background:var(--mist);color:var(--ink);font-family:\"Avenir Next\",\"Segoe UI\",system-ui,sans-serif}button,input,select,textarea{font:inherit}.mono,code,pre{font-family:\"SFMono-Regular\",Consolas,\"Liberation Mono\",monospace}.boot{min-height:100vh;display:grid;place-content:center;justify-items:center;gap:14px;color:var(--muted)}.boot-mark,.brand-mark{display:grid;place-items:center;background:var(--cyan);color:#00262a;font-weight:900}.boot-mark{width:50px;height:50px;border-radius:15px;box-shadow:0 0 0 8px rgba(14,183,191,.12)}\n.shell{min-height:100vh;display:grid;grid-template-columns:260px 1fr}.rail{position:sticky;top:0;height:100vh;padding:24px 18px;background:var(--navy);color:#d7e6f3;display:flex;flex-direction:column}.brand{display:flex;align-items:center;gap:12px;padding:8px 8px 26px}.brand-mark{width:38px;height:38px;border-radius:12px}.brand strong{display:block;letter-spacing:.04em}.brand small{display:block;margin-top:4px;color:#708aa3;font-size:10px;letter-spacing:.18em;text-transform:uppercase}.nav{display:grid;gap:7px}.nav button{border:0;background:transparent;color:#8da4b8;border-radius:11px;text-align:left;padding:11px 13px;cursor:pointer;display:flex;justify-content:space-between}.nav button:hover,.nav button.active{background:var(--navy-2);color:white}.nav button.active{box-shadow:inset 3px 0 var(--cyan)}.rail-foot{margin-top:auto;border:1px solid #203b55;border-radius:14px;padding:14px}.rail-foot .pulse{display:inline-block;width:8px;height:8px;border-radius:50%;background:var(--cyan);box-shadow:0 0 12px var(--cyan);margin-right:7px}.rail-foot p{margin:7px 0 0;color:#7791a8;font-size:11px;line-height:1.5}\n.main{min-width:0;min-height:100vh;display:flex;flex-direction:column}.topbar{height:76px;padding:0 34px;background:rgba(251,253,255,.94);border-bottom:1px solid var(--line);display:flex;align-items:center;justify-content:space-between;position:sticky;top:0;z-index:3;backdrop-filter:blur(12px)}.topbar h1{font-size:17px;margin:0}.eyebrow{font:700 10px/1.2 \"SFMono-Regular\",monospace;text-transform:uppercase;letter-spacing:.16em;color:var(--cyan)}.user-chip{display:flex;align-items:center;gap:10px}.avatar{width:34px;height:34px;border-radius:50%;display:grid;place-items:center;background:var(--cyan-soft);color:#087d84;font-weight:800}.user-chip small{color:var(--muted)}.content{width:100%;max-width:1420px;flex:1;margin:0 auto;padding:30px 34px 56px}.hero{background:var(--navy);color:white;border-radius:22px;padding:28px 30px;display:grid;grid-template-columns:1fr auto;gap:24px;position:relative;overflow:hidden;box-shadow:var(--shadow)}.hero:after{content:\"\";position:absolute;right:-45px;top:-90px;width:320px;height:240px;border:34px solid rgba(14,183,191,.09);transform:rotate(-18deg);border-radius:48px}.hero h2{font-size:32px;line-height:1.08;margin:10px 0}.hero p{max-width:720px;color:#91aac0;margin:0;line-height:1.6}.session-track{align-self:center;display:flex;gap:0;position:relative;z-index:1}.track-node{min-width:112px;border:1px solid #2a4661;padding:13px 15px;background:#0b1e33}.track-node:first-child{border-radius:13px 0 0 13px}.track-node:last-child{border-radius:0 13px 13px 0}.track-node span{display:block;color:#7690a7;font-size:9px;text-transform:uppercase;letter-spacing:.12em}.track-node strong{display:block;margin-top:6px;font-size:13px}.track-node.live strong{color:#58e0df}\n.grid{display:grid;grid-template-columns:repeat(12,1fr);gap:18px;margin-top:20px}.card{grid-column:span 4;background:var(--paper);border:1px solid var(--line);border-radius:17px;padding:20px;box-shadow:0 10px 30px rgba(25,54,79,.05)}.card.wide{grid-column:span 8}.card.full{grid-column:1/-1}.card h3{margin:0;font-size:15px}.card p{color:var(--muted);font-size:12px;line-height:1.6}.metric{font-size:28px;font-weight:750;margin-top:16px}.metric small{font-size:11px;color:var(--muted);font-weight:500}.tag{display:inline-flex;border-radius:999px;padding:5px 8px;font:700 9px/1 \"SFMono-Regular\",monospace;text-transform:uppercase;letter-spacing:.05em;background:var(--cyan-soft);color:#087d84}.tag.public{background:#edf1f5;color:#5d7082}.tag.role{background:#fff0d9;color:#9c5c09}.actions{display:flex;gap:8px;flex-wrap:wrap}.button{border:1px solid var(--line);border-radius:10px;background:white;color:var(--ink);padding:9px 12px;cursor:pointer;font-weight:700;font-size:12px}.button:hover{border-color:#9ab6c9;background:#f7fbfd}.button.primary{background:#0b949b;border-color:#0b949b;color:white}.button.danger{color:var(--red);border-color:#f0bec4}.button:disabled{opacity:.45;cursor:not-allowed}.field{display:grid;gap:6px}.field label{font-size:11px;color:var(--muted);font-weight:700}.field input,.field select,.field textarea{width:100%;border:1px solid var(--line);border-radius:10px;background:white;padding:10px 11px;color:var(--ink);outline:none}.field input:focus,.field textarea:focus{border-color:var(--cyan);box-shadow:0 0 0 3px rgba(14,183,191,.12)}.field textarea{min-height:110px;resize:vertical}.form-grid{display:grid;grid-template-columns:1fr 1fr;gap:14px}.form-grid .span-2{grid-column:1/-1}.command-toolbar{display:flex;gap:10px;margin-bottom:15px}.grow{flex:1}.mt-10{margin-top:10px}.mt-12{margin-top:12px}.mt-14{margin-top:14px}.command-list{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:11px}.command{border:1px solid var(--line);border-radius:13px;padding:14px;background:white}.command-head{display:flex;gap:8px;align-items:center;justify-content:space-between}.command code{font-size:11px;color:#0b6f76}.command p{margin:9px 0}.command small{display:block;color:#8a9bab;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.output{background:#071522;color:#b8d1e2;border-radius:13px;padding:15px;min-height:170px;max-height:420px;overflow:auto;white-space:pre-wrap;font-size:11px;line-height:1.65}.notice{margin-top:14px;border-radius:11px;padding:11px 13px;font-size:12px}.notice.error{background:#fff0f2;color:#a52c3b;border:1px solid #f1c4ca}.notice.success{background:#e8f7f1;color:#176c54;border:1px solid #bce4d5}.login-gate{min-height:calc(100vh - 76px);display:grid;place-content:center;padding:30px}.login-card{width:min(520px,90vw);background:white;border:1px solid var(--line);border-radius:22px;padding:32px;box-shadow:var(--shadow)}.login-card h2{font-size:28px;margin:14px 0 9px}.login-card p{color:var(--muted);line-height:1.65}.hidden{display:none!important}\n.sync-board{display:grid;grid-template-columns:1fr 56px 1fr;align-items:stretch;margin-top:20px}.sync-stage{background:var(--paper);border:1px solid var(--line);border-radius:17px;padding:18px 20px;box-shadow:0 10px 30px rgba(25,54,79,.05)}.sync-stage strong{display:block;margin-top:8px;font-size:18px}.sync-stage p{margin:7px 0 0;color:var(--muted);font-size:11px}.sync-link{display:grid;place-items:center;color:var(--cyan);font-size:22px}.sync-link:before{content:\"\";height:2px;width:100%;background:linear-gradient(90deg,var(--cyan),#bad8dc)}.table-card{margin-top:18px;background:var(--paper);border:1px solid var(--line);border-radius:17px;box-shadow:0 10px 30px rgba(25,54,79,.05);overflow:hidden}.table-head{padding:18px 20px;display:flex;align-items:center;justify-content:space-between;gap:16px;border-bottom:1px solid var(--line)}.table-head h3{margin:0}.table-head p{margin:5px 0 0;color:var(--muted);font-size:11px}.account-table-wrap{overflow:auto}.account-table{width:100%;border-collapse:collapse;min-width:920px}.account-table th,.account-table td{text-align:left;padding:14px 16px;border-bottom:1px solid #e7eef3;vertical-align:middle}.account-table th{background:#f5f9fb;color:#6c8094;font-size:10px;text-transform:uppercase;letter-spacing:.08em}.account-table tr:last-child td{border-bottom:0}.account-name strong{display:block;font-size:13px}.account-name small{display:block;margin-top:4px;color:var(--muted);font-size:10px}.quota-stack{min-width:210px;display:grid;gap:8px}.quota-line{display:grid;grid-template-columns:42px 1fr 38px;align-items:center;gap:7px;font-size:10px;color:var(--muted)}progress{width:100%;height:7px;border:0;border-radius:99px;overflow:hidden;background:#e7eef3}progress::-webkit-progress-bar{background:#e7eef3;border-radius:99px}progress::-webkit-progress-value{background:var(--cyan);border-radius:99px}progress::-moz-progress-bar{background:var(--cyan);border-radius:99px}.status-stack{display:flex;gap:6px;flex-wrap:wrap}.tag.success{background:#e8f7f1;color:var(--green)}.tag.failed{background:#fff0f2;color:var(--red)}.tag.waiting{background:#fff0d9;color:#9c5c09}.tag.local{background:#e8f1fa;color:#32658f}.empty-state{padding:48px 20px;text-align:center;color:var(--muted)}.table-meta{color:var(--muted);font-size:10px;line-height:1.55}.spin{display:inline-block;animation:turn 1s linear infinite}@keyframes turn{to{transform:rotate(360deg)}}\n@media(max-width:980px){.shell{grid-template-columns:78px 1fr}.rail{padding:18px 10px}.brand div:last-child,.nav button span:first-child,.rail-foot p,.rail-foot strong{display:none}.brand{justify-content:center}.nav button{justify-content:center}.card,.card.wide{grid-column:span 6}.hero{grid-template-columns:1fr}.session-track{display:none}}\n@media(max-width:680px){.shell{display:block}.rail{height:auto;position:static;flex-direction:row;align-items:center;padding:10px 14px;overflow-x:auto}.brand{padding:0;margin-right:auto;flex:0 0 auto}.nav{display:flex}.nav button{padding:9px;flex:0 0 auto}.rail-foot{display:none}.topbar{padding:0 18px}.content{padding:20px 14px}.hero{padding:23px}.hero h2{font-size:25px}.card,.card.wide{grid-column:1/-1}.form-grid,.command-list{grid-template-columns:1fr}.form-grid .span-2{grid-column:auto}.user-chip div:not(.avatar){display:none}.sync-board{grid-template-columns:1fr}.sync-link{height:32px;transform:rotate(90deg)}.table-head{align-items:flex-start;flex-direction:column}}\n@media(prefers-reduced-motion:no-preference){.card,.hero{animation:arrive .35s ease both}@keyframes arrive{from{opacity:0;transform:translateY(7px)}to{opacity:1;transform:none}}}\n";
3
- export declare const CONSOLE_JS = "\nconst app=document.getElementById('app');let state=null;let csrf='';let active='overview';let output='\u9009\u62E9\u4E00\u6761\u547D\u4EE4\u6216\u8F93\u5165\u53C2\u6570\u540E\u8FD0\u884C\u3002';let chatgptLocal=null;let chatgptRemote=null;let chatgptLoading=false;\nconst esc=(v)=>String(v??'').replace(/[&<>\"']/g,(c)=>({'&':'&amp;','<':'&lt;','>':'&gt;','\"':'&quot;',\"'\":'&#39;'}[c]));\nasync function api(path,init={}){const headers={'Accept':'application/json',...(init.body?{'Content-Type':'application/json'}:{}),...(csrf?{'x-numa-console-csrf':csrf}:{})};const response=await fetch(path,{...init,headers:{...headers,...(init.headers||{})},credentials:'same-origin'});const body=await response.json().catch(()=>({error:{message:'\u54CD\u5E94\u4E0D\u662F JSON'}}));if(!response.ok)throw new Error(body.error?.message||body.stderr||body.stdout||('HTTP '+response.status));return body}\nasync function bootstrap(attempt=0){try{state=await api('/api/bootstrap');csrf=state.csrfToken;const callbackState=new URLSearchParams(location.search).get('login');const waitingForSuccess=callbackState==='complete'&&!state.loggedIn&&attempt<40;const waitingForFailure=callbackState==='failed'&&!state.loginError&&attempt<8;if(waitingForSuccess||waitingForFailure){app.innerHTML='<div class=\"boot\"><div class=\"boot-mark\">N</div><p>'+(callbackState==='complete'?'\u767B\u5F55\u6210\u529F\uFF0C\u6B63\u5728\u5EFA\u7ACB\u672C\u673A\u4F1A\u8BDD\u2026':'\u6B63\u5728\u8BFB\u53D6\u767B\u5F55\u5931\u8D25\u4FE1\u606F\u2026')+'</p></div>';setTimeout(()=>bootstrap(attempt+1),250);return}if(callbackState==='complete'&&!state.loggedIn&&!state.loginError)state.loginError='\u767B\u5F55\u51ED\u636E\u4EA4\u6362\u5C1A\u672A\u5B8C\u6210\uFF0C\u8BF7\u91CD\u8BD5\u767B\u5F55\u3002';if(callbackState==='failed'&&!state.loginError)state.loginError='Keycloak \u767B\u5F55\u672A\u5B8C\u6210\uFF0C\u8BF7\u91CD\u8BD5\u3002';if(callbackState)history.replaceState({},'',location.pathname);render()}catch(error){app.innerHTML='<div class=\"login-gate\"><div class=\"login-card\"><span class=\"tag role\">\u8FDE\u63A5\u5931\u8D25</span><h2>\u672C\u5730\u63A7\u5236\u53F0\u4E0D\u53EF\u7528</h2><p>'+esc(error.message)+'</p></div></div>'}}\nfunction navButton(id,label,mark){return '<button data-nav=\"'+id+'\" class=\"'+(active===id?'active':'')+'\"><span>'+label+'</span><span class=\"mono\">'+mark+'</span></button>'}\nfunction shell(content){const user=state.user||{};const label=user.username||user.email||'\u672A\u767B\u5F55';return '<div class=\"shell\"><aside class=\"rail\"><div class=\"brand\"><div class=\"brand-mark\">N</div><div><strong>Numa CLI</strong><small>Local control plane</small></div></div><nav class=\"nav\">'+navButton('overview','\u8FD0\u884C\u6982\u89C8','01')+navButton('chatgpt','ChatGPT \u8D26\u53F7','02')+navButton('config','\u57FA\u7840\u914D\u7F6E','03')+navButton('commands','\u547D\u4EE4\u80FD\u529B','04')+navButton('runner','\u6267\u884C\u5668','05')+'</nav><div class=\"rail-foot\"><strong><span class=\"pulse\"></span>\u4EC5\u76D1\u542C\u672C\u673A</strong><p>Token \u4E0D\u4F1A\u53D1\u9001\u7ED9\u7F51\u9875\u811A\u672C\uFF0C\u4E5F\u4E0D\u4F1A\u51FA\u73B0\u5728\u547D\u4EE4\u8F93\u51FA\u4E2D\u3002</p></div></aside><main class=\"main\"><header class=\"topbar\"><div><div class=\"eyebrow\">Numa / Web console</div><h1>'+sectionTitle()+'</h1></div><div class=\"user-chip\"><div class=\"avatar\">'+esc(label.slice(0,1).toUpperCase())+'</div><div><strong>'+esc(label)+'</strong><br><small>'+esc(state.loggedIn?'Keycloak \u4F1A\u8BDD\u6709\u6548':'\u9700\u8981\u767B\u5F55')+'</small></div></div></header>'+content+'</main></div>'}\nfunction sectionTitle(){return {overview:'\u8FD0\u884C\u6982\u89C8',chatgpt:'ChatGPT \u8D26\u53F7',config:'\u57FA\u7840\u914D\u7F6E',commands:'\u547D\u4EE4\u80FD\u529B',runner:'\u5B89\u5168\u6267\u884C\u5668'}[active]||'\u63A7\u5236\u53F0'}\nfunction loginGate(){const error=state?.loginError?'<div class=\"notice error\">'+esc(state.loginError)+'</div>':'';return '<div class=\"login-gate\"><div class=\"login-card\"><span class=\"tag role\">Keycloak PKCE</span><h2>\u767B\u5F55\u540E\u8FDB\u5165\u672C\u5730\u63A7\u5236\u53F0</h2><p>\u6D4F\u89C8\u5668\u53EA\u8D1F\u8D23\u5B8C\u6210\u8BA4\u8BC1\u548C\u64CD\u4F5C\u672C\u673A API\u3002\u8BBF\u95EE\u4EE4\u724C\u4FDD\u5B58\u5728 CLI \u7684\u79C1\u6709\u7F13\u5B58\u4E2D\uFF0C\u4E0D\u5199\u5165 localStorage\uFF0C\u4E5F\u4E0D\u8FD4\u56DE\u7ED9\u9875\u9762\u3002</p><div class=\"actions\"><button class=\"button primary\" data-action=\"login\">\u4F7F\u7528 Keycloak \u767B\u5F55</button></div><div id=\"notice\">'+error+'</div></div></div>'}\nfunction overview(){const u=state.user||{};const roles=[...(u.realmRoles||[]),...Object.values(u.clientRoles||{}).flat()];return '<div class=\"content\"><section class=\"hero\"><div><div class=\"eyebrow\">Authenticated workstation</div><h2>\u672C\u673A\u4F1A\u8BDD\u5DF2\u63A5\u5165\u7814\u53D1\u63A7\u5236\u9762</h2><p>\u4ECE\u540C\u4E00\u5904\u68C0\u67E5\u8EAB\u4EFD\u3001\u8C03\u6574 CLI \u914D\u7F6E\uFF0C\u5E76\u4EE5\u7ED3\u6784\u5316\u53C2\u6570\u8FD0\u884C\u53D7\u652F\u6301\u547D\u4EE4\u3002\u6240\u6709\u7F51\u7EDC\u8BF7\u6C42\u7EE7\u7EED\u7531 CLI \u6CE8\u5165 Bearer Token\u3002</p></div><div class=\"session-track\"><div class=\"track-node live\"><span>\u8EAB\u4EFD</span><strong>'+esc(u.username||'\u5DF2\u767B\u5F55')+'</strong></div><div class=\"track-node\"><span>API</span><strong>'+esc(state.config.apiBaseUrl?'\u5DF2\u914D\u7F6E':'\u672A\u914D\u7F6E')+'</strong></div><div class=\"track-node\"><span>\u89D2\u8272</span><strong>'+roles.length+'</strong></div></div></section><section class=\"grid\"><article class=\"card\"><div class=\"eyebrow\">Session</div><div class=\"metric\">'+esc(state.expiresAt?new Date(state.expiresAt*1000).toLocaleTimeString('zh-CN',{hour:'2-digit',minute:'2-digit'}):'\u2014')+' <small>\u8BBF\u95EE\u4EE4\u724C\u5230\u671F</small></div><p>\u9700\u8981\u65F6\u7531 CLI \u4F7F\u7528 refresh token \u81EA\u52A8\u7EED\u671F\u3002</p></article><article class=\"card\"><div class=\"eyebrow\">Commands</div><div class=\"metric\">'+state.commands.length+' <small>\u6761\u80FD\u529B\u5951\u7EA6</small></div><p>\u7F51\u9875\u6267\u884C\u5668\u53EA\u63A5\u53D7\u76EE\u5F55\u4E2D\u58F0\u660E\u7684\u547D\u4EE4\u3002</p></article><article class=\"card\"><div class=\"eyebrow\">Endpoint</div><div class=\"metric\">'+(state.config.apiBaseUrl?'READY':'SETUP')+'</div><p>'+esc(state.config.apiBaseUrl||'\u8BF7\u5728\u57FA\u7840\u914D\u7F6E\u4E2D\u586B\u5199\u5E73\u53F0 API \u5730\u5740')+'</p></article><article class=\"card wide\"><h3>\u5F53\u524D\u8EAB\u4EFD</h3><p>'+esc(u.displayName||u.username||'-')+' \u00B7 '+esc(u.email||'-')+'</p><div class=\"actions\">'+roles.slice(0,8).map((r)=>'<span class=\"tag\">'+esc(r)+'</span>').join('')+(roles.length>8?'<span class=\"tag public\">+'+(roles.length-8)+'</span>':'')+'</div></article><article class=\"card\"><h3>\u4F1A\u8BDD\u64CD\u4F5C</h3><p>\u5F3A\u5236\u5237\u65B0\u8EAB\u4EFD\u8D44\u6599\uFF0C\u6216\u6E05\u9664\u672C\u673A Keycloak \u7F13\u5B58\u3002</p><div class=\"actions\"><button class=\"button\" data-action=\"reload\">\u5237\u65B0\u72B6\u6001</button><button class=\"button danger\" data-action=\"logout\">\u9000\u51FA\u767B\u5F55</button></div></article></section></div>'}\nfunction instant(value){if(!value)return null;const number=typeof value==='number'?(value<1000000000000?value*1000:value):Date.parse(value);return Number.isFinite(number)?number:null}\nfunction timeText(value){const at=instant(value);return at?new Date(at).toLocaleString('zh-CN',{month:'2-digit',day:'2-digit',hour:'2-digit',minute:'2-digit'}):'\u2014'}\nfunction windowName(window,fallback){const minutes=window?.windowMinutes;if(!minutes)return fallback;if(minutes%1440===0)return (minutes/1440)+'d';if(minutes%60===0)return (minutes/60)+'h';return minutes+'m'}\nfunction quotaWindowHasData(window){if(!window)return false;const minutes=window.windowMinutes;const reset=window.resetAt;const hasMinutes=typeof minutes==='number'&&Number.isFinite(minutes)&&minutes>0;const hasReset=(typeof reset==='number'&&Number.isFinite(reset)&&reset>0)||(typeof reset==='string'&&Number.isFinite(Date.parse(reset)));const hasUsage=typeof window.usedPercent==='number'&&Number.isFinite(window.usedPercent)&&window.usedPercent>0;return hasMinutes||hasReset||hasUsage}\nfunction quotaLine(window,fallback){if(!quotaWindowHasData(window)||typeof window.usedPercent!=='number')return '';const remain=Math.max(0,Math.min(100,100-window.usedPercent));return '<div class=\"quota-line\" title=\"\u989D\u5EA6\u91CD\u7F6E\u65F6\u95F4 '+esc(timeText(window.resetAt))+'\"><span>'+esc(windowName(window,fallback))+'</span><progress max=\"100\" value=\"'+remain.toFixed(1)+'\"></progress><strong>'+remain.toFixed(0)+'%</strong></div>'}\nfunction quotaCell(quota){if(!quota)return '<span class=\"table-meta\">\u6682\u65E0\u989D\u5EA6\u91C7\u6837</span>';const lines=quotaLine(quota.primary,'\u4E3B\u7A97\u53E3')+quotaLine(quota.secondary,'\u6B21\u7A97\u53E3');const detail=[quota.planType,quota.model,quota.activeLimit!=null?'limit '+quota.activeLimit:null].filter(Boolean).join(' \u00B7 ');return '<div class=\"quota-stack\">'+(lines||'<span class=\"table-meta\">\u989D\u5EA6\u7A97\u53E3\u6682\u65E0\u6570\u636E</span>')+'<div class=\"table-meta\">'+esc(detail||'\u5DF2\u91C7\u6837')+'<br>\u91C7\u6837 '+esc(timeText(quota.updatedAt))+'</div></div>'}\nfunction newerQuota(localQuota,remoteQuota){if(!localQuota)return remoteQuota;if(!remoteQuota)return localQuota;return (instant(remoteQuota.updatedAt)||0)>=(instant(localQuota.updatedAt)||0)?remoteQuota:localQuota}\nfunction mergedChatgptAccounts(){const local=chatgptLocal?.accounts||[];const remote=chatgptRemote?.accounts||[];const used=new Set();const rows=local.map((item)=>{const index=remote.findIndex((candidate,i)=>!used.has(i)&&item.accountId&&candidate.accountId===item.accountId);const match=index>=0?remote[index]:null;if(index>=0)used.add(index);return {key:item.id,local:item,remote:match,label:item.label,email:item.email,accountId:item.accountId||match?.accountId,enabled:item.enabled,selected:item.selected,quota:newerQuota(item.quota,match?.quota)}});remote.forEach((item,index)=>{if(!used.has(index))rows.push({key:'remote_'+item.id,local:null,remote:item,label:item.label,email:null,accountId:item.accountId,enabled:true,selected:item.isDefault,quota:item.quota})});return rows}\nfunction syncTag(row){if(chatgptRemote?.status==='LOADING')return '<span class=\"tag waiting\">\u6B63\u5728\u540C\u6B65</span>';if(chatgptRemote?.status==='FAILED')return '<span class=\"tag failed\">\u8FDC\u7A0B\u540C\u6B65\u5931\u8D25</span>';if(chatgptRemote?.status==='NOT_CONFIGURED')return '<span class=\"tag waiting\">\u672A\u914D\u7F6E\u5E73\u53F0</span>';if(row.local&&row.remote)return '<span class=\"tag success\">\u5DF2\u540C\u6B65</span>';if(row.local)return '<span class=\"tag local\">\u4EC5\u672C\u5730</span>';return '<span class=\"tag success\">\u5E73\u53F0\u53EF\u7528</span>'}\nfunction remoteStage(){const remote=chatgptRemote;if(!remote||remote.status==='LOADING')return {tag:'<span class=\"tag waiting\"><span class=\"spin\">\u21BB</span>&nbsp;\u8FDE\u63A5\u4E2D</span>',title:'\u6B63\u5728\u8FDE\u63A5\u5E73\u53F0',detail:'\u672C\u5730\u8D26\u53F7\u5DF2\u7ECF\u53EF\u89C1\uFF0C\u6B63\u5728\u8BFB\u53D6\u8FDC\u7A0B\u53EF\u7528\u8D26\u53F7\u3002'};if(remote.status==='SUCCESS')return {tag:'<span class=\"tag success\">\u540C\u6B65\u6210\u529F</span>',title:remote.accounts.length+' \u4E2A\u5E73\u53F0\u8D26\u53F7',detail:'\u5B8C\u6210\u4E8E '+timeText(remote.syncedAt)};if(remote.status==='FAILED')return {tag:'<span class=\"tag failed\">\u8FDC\u7A0B\u540C\u6B65\u5931\u8D25</span>',title:'\u4FDD\u7559\u672C\u5730\u7ED3\u679C',detail:remote.error?.message||'\u65E0\u6CD5\u8FDE\u63A5\u8FDC\u7A0B\u8D26\u53F7\u670D\u52A1'};return {tag:'<span class=\"tag waiting\">\u672A\u914D\u7F6E</span>',title:'\u672A\u914D\u7F6E\u5E73\u53F0\u5730\u5740',detail:'\u53EF\u5728\u57FA\u7840\u914D\u7F6E\u4E2D\u586B\u5199\u5E73\u53F0 API \u5730\u5740\u3002'}}\nfunction accountRows(rows){return rows.map((row)=>'<tr><td><div class=\"account-name\"><strong>'+esc(row.label)+'</strong><small>'+esc(row.email||row.accountId||row.key)+'</small></div></td><td><div class=\"status-stack\">'+(row.enabled?'<span class=\"tag success\">\u53EF\u7528</span>':'<span class=\"tag failed\">\u5DF2\u505C\u7528</span>')+(row.selected?'<span class=\"tag role\">\u5BA2\u6237\u7AEF\u5DF2\u9009</span>':'')+'</div></td><td>'+quotaCell(row.quota)+'</td><td><div class=\"table-meta\">Token '+esc(row.local?'\u672C\u5730\u53EF\u7528':'\u6309\u9700\u4ECE\u5E73\u53F0\u83B7\u53D6')+'<br>\u5230\u671F '+esc(timeText(row.local?.accessExpiresAt||row.remote?.accessExpiresAt))+'</div></td><td><div class=\"status-stack\">'+syncTag(row)+'</div></td></tr>').join('')}\nfunction chatgptPage(){const rows=mergedChatgptAccounts();const remote=remoteStage();const localReady=chatgptLocal?.status==='READY';const localCount=chatgptLocal?.available??0;const failure=chatgptRemote?.status==='FAILED'?'<div class=\"notice error\"><strong>\u8FDC\u7A0B\u540C\u6B65\u5931\u8D25\u3002</strong> '+esc(chatgptRemote.error?.message||'\u5E73\u53F0\u6682\u65F6\u4E0D\u53EF\u7528')+'\uFF1B\u672C\u5730\u8D26\u53F7\u6570\u636E\u4ECD\u53EF\u6B63\u5E38\u67E5\u770B\u3002</div>':'';return '<div class=\"content\"><section class=\"hero\"><div><div class=\"eyebrow\">Local first / Remote second</div><h2>ChatGPT \u8D26\u53F7\u8FD0\u884C\u89C6\u56FE</h2><p>\u5148\u8BFB\u53D6 codex-multi-auth \u672C\u5730\u8D26\u53F7\u4E0E\u989D\u5EA6\u7F13\u5B58\uFF0C\u518D\u8FDE\u63A5\u5E73\u53F0\u8865\u5145\u5F53\u524D\u7528\u6237\u53EF\u7528\u8D26\u53F7\u3002\u9875\u9762\u6C38\u4E0D\u63A5\u6536 access token \u6216 refresh token\u3002</p></div><div class=\"session-track\"><div class=\"track-node live\"><span>\u672C\u5730\u53EF\u7528</span><strong>'+localCount+'</strong></div><div class=\"track-node\"><span>\u6C47\u603B\u8D26\u53F7</span><strong>'+rows.length+'</strong></div><div class=\"track-node\"><span>\u8FDC\u7A0B</span><strong>'+esc(chatgptRemote?.status||'WAITING')+'</strong></div></div></section><section class=\"sync-board\"><article class=\"sync-stage\"><div class=\"eyebrow\">01 / Local pool</div><strong>'+(localReady?localCount+' \u4E2A\u672C\u5730\u53EF\u7528\u8D26\u53F7':'\u6B63\u5728\u8BFB\u53D6\u672C\u5730\u8D26\u53F7')+'</strong><p>'+(localReady?'\u8BFB\u53D6\u5B8C\u6210\u4E8E '+timeText(chatgptLocal.readAt):'\u4F18\u5148\u8BFB\u53D6 codex-multi-auth \u5B89\u5168\u6458\u8981\u3002')+'</p></article><div class=\"sync-link\" aria-label=\"\u7136\u540E\u8FDE\u63A5\u8FDC\u7A0B\"></div><article class=\"sync-stage\"><div class=\"eyebrow\">02 / Platform service</div>'+remote.tag+'<strong>'+esc(remote.title)+'</strong><p>'+esc(remote.detail)+'</p></article></section>'+failure+'<section class=\"table-card\"><header class=\"table-head\"><div><h3>\u53EF\u7528\u8D26\u53F7\u4E0E\u5269\u4F59\u989D\u5EA6</h3><p>\u989D\u5EA6\u4F18\u5148\u5C55\u793A\u672C\u5730\u6216\u670D\u52A1\u5668\u7AEF\u66F4\u65B0\u8F83\u65B0\u7684\u5B89\u5168\u5FEB\u7167\u3002</p></div><button class=\"button\" data-action=\"chatgpt-refresh\" '+(chatgptLoading?'disabled':'')+'>'+(chatgptLoading?'<span class=\"spin\">\u21BB</span> \u540C\u6B65\u4E2D':'\u21BB \u91CD\u65B0\u540C\u6B65')+'</button></header>'+(rows.length?'<div class=\"account-table-wrap\"><table class=\"account-table\"><thead><tr><th>\u8D26\u53F7</th><th>\u53EF\u7528\u72B6\u6001</th><th>\u5269\u4F59 limit</th><th>\u51ED\u636E\u65F6\u6548</th><th>\u540C\u6B65\u72B6\u6001</th></tr></thead><tbody>'+accountRows(rows)+'</tbody></table></div>':'<div class=\"empty-state\">'+(chatgptLoading?'\u6B63\u5728\u8BFB\u53D6\u672C\u5730\u8D26\u53F7\u2026':'\u672A\u53D1\u73B0\u672C\u5730\u6216\u5E73\u53F0\u53EF\u7528\u8D26\u53F7')+'</div>')+'</section></div>'}\nfunction configPage(){const c=state.config;return '<div class=\"content\"><section class=\"grid\"><article class=\"card full\"><div class=\"eyebrow\">Configuration file</div><h3>\u57FA\u7840\u914D\u7F6E</h3><p>\u4E0E <code>numa config --set</code> \u4F7F\u7528\u540C\u4E00\u4EFD\u914D\u7F6E\u548C\u6821\u9A8C\u903B\u8F91\u3002</p><form id=\"config-form\" class=\"form-grid\"><div class=\"field\"><label>\u754C\u9762\u8BED\u8A00</label><select name=\"locale\"><option '+(c.locale==='zh-CN'?'selected':'')+'>zh-CN</option><option '+(c.locale==='en-US'?'selected':'')+'>en-US</option></select></div><div class=\"field\"><label>\u9ED8\u8BA4\u8F93\u51FA</label><select name=\"output\"><option '+(c.output==='text'?'selected':'')+'>text</option><option '+(c.output==='json'?'selected':'')+'>json</option></select></div><div class=\"field span-2\"><label>\u5E73\u53F0 API \u5730\u5740</label><input name=\"apiBaseUrl\" value=\"'+esc(c.apiBaseUrl)+'\" placeholder=\"https://platform.example/api\"></div><div class=\"field span-2\"><label>npm registry</label><input name=\"registryUrl\" value=\"'+esc(c.registryUrl)+'\"></div><label class=\"field span-2\"><span>\u66F4\u65B0\u68C0\u67E5</span><select name=\"checkUpdates\"><option value=\"true\" '+(c.checkUpdates?'selected':'')+'>\u542F\u7528</option><option value=\"false\" '+(!c.checkUpdates?'selected':'')+'>\u5173\u95ED</option></select></label><div class=\"actions span-2\"><button class=\"button primary\" type=\"submit\">\u4FDD\u5B58\u914D\u7F6E</button></div></form><div id=\"notice\"></div></article></section></div>'}\nfunction commandsPage(){return '<div class=\"content\"><section class=\"card full\"><div class=\"command-toolbar\"><div class=\"field grow\"><label>\u8FC7\u6EE4\u547D\u4EE4</label><input id=\"command-search\" placeholder=\"\u4F8B\u5982 codex\u3001media\u3001auth\"></div></div><div id=\"command-list\" class=\"command-list\">'+commandCards('')+'</div></section></div>'}\nfunction commandCards(query){const q=query.toLowerCase();return state.commands.filter((c)=>(c.command+' '+c.summary).toLowerCase().includes(q)).map((c)=>'<article class=\"command\"><div class=\"command-head\"><code>'+esc(c.command)+'</code><span class=\"tag '+esc(c.access)+'\">'+esc(c.access)+'</span></div><p>'+esc(c.summary)+'</p><small>'+esc(c.examples[0]||'')+'</small><div class=\"actions mt-10\"><button class=\"button\" data-load=\"'+esc(JSON.stringify(commandPrefix(c.command)))+'\">\u8F7D\u5165\u6267\u884C\u5668</button></div></article>').join('')||'<p>\u6CA1\u6709\u5339\u914D\u547D\u4EE4\u3002</p>'}\nfunction commandPrefix(command){return command.split(/s+/).filter((part)=>!part.startsWith('[')&&!part.startsWith('<')&&!part.startsWith('--'))}\nfunction runnerPage(){return '<div class=\"content\"><section class=\"grid\"><article class=\"card\"><div class=\"eyebrow\">Structured argv</div><h3>\u5B89\u5168\u6267\u884C\u5668</h3><p>\u4F7F\u7528 JSON \u6570\u7EC4\u4F20\u5165\u53C2\u6570\uFF0C\u4E0D\u7ECF\u8FC7 shell\u3002\u957F\u9A7B\u6216\u4EA4\u4E92\u547D\u4EE4\u9700\u8981\u5728\u7EC8\u7AEF\u8FD0\u884C\u3002</p><form id=\"runner-form\"><div class=\"field\"><label>\u547D\u4EE4\u53C2\u6570</label><textarea id=\"argv\" class=\"mono\">[\"doctor\"]</textarea></div><label class=\"field mt-12\"><span>\u5371\u9669\u64CD\u4F5C\u786E\u8BA4</span><select id=\"confirm\"><option value=\"false\">\u672A\u786E\u8BA4</option><option value=\"true\">\u786E\u8BA4\u6267\u884C\u5220\u9664/\u91CD\u7F6E</option></select></label><div class=\"actions mt-14\"><button class=\"button primary\" type=\"submit\">\u8FD0\u884C\u547D\u4EE4</button></div></form></article><article class=\"card wide\"><div class=\"eyebrow\">Result stream</div><h3>\u7ED3\u6784\u5316\u8F93\u51FA</h3><pre id=\"output\" class=\"output\">'+esc(output)+'</pre></article></section></div>'}\nasync function loadChatgpt(){if(chatgptLoading)return;chatgptLoading=true;chatgptLocal=null;chatgptRemote={status:'LOADING',accounts:[]};render();try{chatgptLocal=await api('/api/chatgpt/local')}catch(error){chatgptLocal={status:'FAILED',accounts:[],available:0,total:0,error:{message:error.message}}}render();try{chatgptRemote=await api('/api/chatgpt/remote')}catch(error){chatgptRemote={status:'FAILED',accounts:[],syncedAt:Date.now(),error:{message:error.message}}}finally{chatgptLoading=false;render()}}\nfunction render(){if(!state.loggedIn){app.innerHTML=loginGate();bind();return}const page=active==='overview'?overview():active==='chatgpt'?chatgptPage():active==='config'?configPage():active==='commands'?commandsPage():runnerPage();app.innerHTML=shell(page);bind()}\nfunction notice(message,type='success'){const target=document.getElementById('notice');if(target)target.innerHTML='<div class=\"notice '+type+'\">'+esc(message)+'</div>'}\nfunction bindCommandLoaders(){document.querySelectorAll('[data-load]').forEach((b)=>b.addEventListener('click',()=>{const argv=JSON.parse(b.dataset.load);active='runner';render();document.getElementById('argv').value=JSON.stringify(argv)}))}\nfunction bind(){document.querySelectorAll('[data-nav]').forEach((b)=>b.addEventListener('click',()=>{active=b.dataset.nav;render();if(active==='chatgpt'&&!chatgptLocal&&!chatgptLoading)void loadChatgpt()}));document.querySelector('[data-action=\"chatgpt-refresh\"]')?.addEventListener('click',()=>void loadChatgpt());document.querySelector('[data-action=\"login\"]')?.addEventListener('click',async()=>{try{notice('\u6B63\u5728\u542F\u52A8\u767B\u5F55\u2026');const result=await api('/api/auth/login',{method:'POST',body:'{}'});location.href=result.authorizationUrl}catch(e){notice(e.message,'error')}});document.querySelector('[data-action=\"reload\"]')?.addEventListener('click',()=>bootstrap());document.querySelector('[data-action=\"logout\"]')?.addEventListener('click',async()=>{if(!confirm('\u6E05\u9664\u672C\u673A Keycloak \u767B\u5F55\u7F13\u5B58\uFF1F'))return;await api('/api/auth/logout',{method:'POST',body:'{}'});location.reload()});document.getElementById('config-form')?.addEventListener('submit',async(e)=>{e.preventDefault();const data=Object.fromEntries(new FormData(e.currentTarget));data.checkUpdates=data.checkUpdates==='true';try{const result=await api('/api/config',{method:'PUT',body:JSON.stringify(data)});state.config=result.config;notice('\u914D\u7F6E\u5DF2\u4FDD\u5B58')}catch(err){notice(err.message,'error')}});document.getElementById('command-search')?.addEventListener('input',(e)=>{document.getElementById('command-list').innerHTML=commandCards(e.target.value);bindCommandLoaders()});bindCommandLoaders();document.getElementById('runner-form')?.addEventListener('submit',async(e)=>{e.preventDefault();try{const argv=JSON.parse(document.getElementById('argv').value);const confirmed=document.getElementById('confirm')?.value==='true';output='\u8FD0\u884C\u4E2D\u2026';render();const result=await api('/api/commands/run',{method:'POST',body:JSON.stringify({argv,confirm:confirmed})});output=result.stdout||result.stderr||JSON.stringify(result,null,2);render()}catch(err){output='\u9519\u8BEF: '+err.message;render()}})}\nbootstrap();\n";
2
+ export declare const CONSOLE_CSS = "\n:root{color-scheme:light;--ink:#0b1728;--navy:#07182b;--navy-2:#102943;--cyan:#0eb7bf;--cyan-soft:#dff7f6;--mist:#eef4f8;--paper:#fbfdff;--line:#d7e2ea;--muted:#64778c;--amber:#e99a32;--red:#d94b58;--green:#198a68;--shadow:0 18px 50px rgba(12,38,62,.1)}\n*{box-sizing:border-box}html,body,#app{min-height:100%}body{min-height:100vh;margin:0;background:var(--mist);color:var(--ink);font-family:\"Avenir Next\",\"Segoe UI\",system-ui,sans-serif}button,input,select,textarea{font:inherit}.mono,code,pre{font-family:\"SFMono-Regular\",Consolas,\"Liberation Mono\",monospace}.boot{min-height:100vh;display:grid;place-content:center;justify-items:center;gap:14px;color:var(--muted)}.boot-mark,.brand-mark{display:grid;place-items:center;background:var(--cyan);color:#00262a;font-weight:900}.boot-mark{width:50px;height:50px;border-radius:15px;box-shadow:0 0 0 8px rgba(14,183,191,.12)}\n.shell{min-height:100vh;display:grid;grid-template-columns:260px 1fr}.rail{position:sticky;top:0;height:100vh;padding:24px 18px;background:var(--navy);color:#d7e6f3;display:flex;flex-direction:column}.brand{display:flex;align-items:center;gap:12px;padding:8px 8px 26px}.brand-mark{width:38px;height:38px;border-radius:12px}.brand strong{display:block;letter-spacing:.04em}.brand small{display:block;margin-top:4px;color:#708aa3;font-size:10px;letter-spacing:.18em;text-transform:uppercase}.nav{display:grid;gap:7px}.nav button{border:0;background:transparent;color:#8da4b8;border-radius:11px;text-align:left;padding:11px 13px;cursor:pointer;display:flex;justify-content:space-between}.nav button:hover,.nav button.active{background:var(--navy-2);color:white}.nav button.active{box-shadow:inset 3px 0 var(--cyan)}.rail-foot{margin-top:auto;border:1px solid #203b55;border-radius:14px;padding:14px}.rail-foot .pulse{display:inline-block;width:8px;height:8px;border-radius:50%;background:var(--cyan);box-shadow:0 0 12px var(--cyan);margin-right:7px}.rail-foot p{margin:7px 0 0;color:#7791a8;font-size:11px;line-height:1.5}\n.main{min-width:0;min-height:100vh;display:flex;flex-direction:column}.topbar{height:76px;padding:0 34px;background:rgba(251,253,255,.94);border-bottom:1px solid var(--line);display:flex;align-items:center;justify-content:space-between;position:sticky;top:0;z-index:3;backdrop-filter:blur(12px)}.topbar h1{font-size:17px;margin:0}.eyebrow{font:700 10px/1.2 \"SFMono-Regular\",monospace;text-transform:uppercase;letter-spacing:.16em;color:var(--cyan)}.user-chip{display:flex;align-items:center;gap:10px}.avatar{width:34px;height:34px;border-radius:50%;display:grid;place-items:center;background:var(--cyan-soft);color:#087d84;font-weight:800}.user-chip small{color:var(--muted)}.content{width:100%;max-width:1420px;flex:1;margin:0 auto;padding:30px 34px 56px}.hero{background:var(--navy);color:white;border-radius:22px;padding:28px 30px;display:grid;grid-template-columns:1fr auto;gap:24px;position:relative;overflow:hidden;box-shadow:var(--shadow)}.hero:after{content:\"\";position:absolute;right:-45px;top:-90px;width:320px;height:240px;border:34px solid rgba(14,183,191,.09);transform:rotate(-18deg);border-radius:48px}.hero h2{font-size:32px;line-height:1.08;margin:10px 0}.hero p{max-width:720px;color:#91aac0;margin:0;line-height:1.6}.session-track{align-self:center;display:flex;gap:0;position:relative;z-index:1}.track-node{min-width:112px;border:1px solid #2a4661;padding:13px 15px;background:#0b1e33}.track-node:first-child{border-radius:13px 0 0 13px}.track-node:last-child{border-radius:0 13px 13px 0}.track-node span{display:block;color:#7690a7;font-size:9px;text-transform:uppercase;letter-spacing:.12em}.track-node strong{display:block;margin-top:6px;font-size:13px}.track-node.live strong{color:#58e0df}\n.grid{display:grid;grid-template-columns:repeat(12,1fr);gap:18px;margin-top:20px}.card{grid-column:span 4;background:var(--paper);border:1px solid var(--line);border-radius:17px;padding:20px;box-shadow:0 10px 30px rgba(25,54,79,.05)}.card.wide{grid-column:span 8}.card.full{grid-column:1/-1}.card h3{margin:0;font-size:15px}.card p{color:var(--muted);font-size:12px;line-height:1.6}.metric{font-size:28px;font-weight:750;margin-top:16px}.metric small{font-size:11px;color:var(--muted);font-weight:500}.tag{display:inline-flex;border-radius:999px;padding:5px 8px;font:700 9px/1 \"SFMono-Regular\",monospace;text-transform:uppercase;letter-spacing:.05em;background:var(--cyan-soft);color:#087d84}.tag.public{background:#edf1f5;color:#5d7082}.tag.role{background:#fff0d9;color:#9c5c09}.actions{display:flex;gap:8px;flex-wrap:wrap}.button{border:1px solid var(--line);border-radius:10px;background:white;color:var(--ink);padding:9px 12px;cursor:pointer;font-weight:700;font-size:12px}.button:hover{border-color:#9ab6c9;background:#f7fbfd}.button.primary{background:#0b949b;border-color:#0b949b;color:white}.button.danger{color:var(--red);border-color:#f0bec4}.button:disabled{opacity:.45;cursor:not-allowed}.field{display:grid;gap:6px}.field label{font-size:11px;color:var(--muted);font-weight:700}.field input,.field select,.field textarea{width:100%;border:1px solid var(--line);border-radius:10px;background:white;padding:10px 11px;color:var(--ink);outline:none}.field input:focus,.field textarea:focus{border-color:var(--cyan);box-shadow:0 0 0 3px rgba(14,183,191,.12)}.field textarea{min-height:110px;resize:vertical}.form-grid{display:grid;grid-template-columns:1fr 1fr;gap:14px}.form-grid .span-2{grid-column:1/-1}.command-toolbar{display:flex;gap:10px;margin-bottom:15px}.grow{flex:1}.mt-10{margin-top:10px}.mt-12{margin-top:12px}.mt-14{margin-top:14px}.command-list{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:11px}.command{border:1px solid var(--line);border-radius:13px;padding:14px;background:white}.command-head{display:flex;gap:8px;align-items:center;justify-content:space-between}.command code{font-size:11px;color:#0b6f76}.command p{margin:9px 0}.command small{display:block;color:#8a9bab;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.output{background:#071522;color:#b8d1e2;border-radius:13px;padding:15px;min-height:170px;max-height:420px;overflow:auto;white-space:pre-wrap;font-size:11px;line-height:1.65}.notice{margin-top:14px;border-radius:11px;padding:11px 13px;font-size:12px}.notice.error{background:#fff0f2;color:#a52c3b;border:1px solid #f1c4ca}.notice.success{background:#e8f7f1;color:#176c54;border:1px solid #bce4d5}.login-gate{min-height:calc(100vh - 76px);display:grid;place-content:center;padding:30px}.login-card{width:min(520px,90vw);background:white;border:1px solid var(--line);border-radius:22px;padding:32px;box-shadow:var(--shadow)}.login-card h2{font-size:28px;margin:14px 0 9px}.login-card p{color:var(--muted);line-height:1.65}.hidden{display:none!important}\n.sync-board{display:grid;grid-template-columns:1fr 56px 1fr;align-items:stretch;margin-top:20px}.sync-stage{background:var(--paper);border:1px solid var(--line);border-radius:17px;padding:18px 20px;box-shadow:0 10px 30px rgba(25,54,79,.05)}.sync-stage strong{display:block;margin-top:8px;font-size:18px}.sync-stage p{margin:7px 0 0;color:var(--muted);font-size:11px}.sync-link{display:grid;place-items:center;color:var(--cyan);font-size:22px}.sync-link:before{content:\"\";height:2px;width:100%;background:linear-gradient(90deg,var(--cyan),#bad8dc)}.table-card{margin-top:18px;background:var(--paper);border:1px solid var(--line);border-radius:17px;box-shadow:0 10px 30px rgba(25,54,79,.05);overflow:hidden}.table-head{padding:18px 20px;display:flex;align-items:center;justify-content:space-between;gap:16px;border-bottom:1px solid var(--line)}.table-head h3{margin:0}.table-head p{margin:5px 0 0;color:var(--muted);font-size:11px}.account-table-wrap{overflow:auto}.account-table{width:100%;border-collapse:collapse;min-width:920px}.account-table th,.account-table td{text-align:left;padding:14px 16px;border-bottom:1px solid #e7eef3;vertical-align:middle}.account-table th{background:#f5f9fb;color:#6c8094;font-size:10px;text-transform:uppercase;letter-spacing:.08em}.account-table tr:last-child td{border-bottom:0}.account-name strong{display:block;font-size:13px}.account-name small{display:block;margin-top:4px;color:var(--muted);font-size:10px}.quota-stack{min-width:210px;display:grid;gap:8px}.quota-line{display:grid;grid-template-columns:42px 1fr 38px;align-items:center;gap:7px;font-size:10px;color:var(--muted)}progress{width:100%;height:7px;border:0;border-radius:99px;overflow:hidden;background:#e7eef3}progress::-webkit-progress-bar{background:#e7eef3;border-radius:99px}progress::-webkit-progress-value{background:var(--cyan);border-radius:99px}progress::-moz-progress-bar{background:var(--cyan);border-radius:99px}.status-stack{display:flex;gap:6px;flex-wrap:wrap}.tag.success{background:#e8f7f1;color:var(--green)}.tag.failed{background:#fff0f2;color:var(--red)}.tag.waiting{background:#fff0d9;color:#9c5c09}.tag.local{background:#e8f1fa;color:#32658f}.empty-state{padding:48px 20px;text-align:center;color:var(--muted)}.empty-state.account-request{margin:24px;border:2px solid #f0b5bd;border-radius:16px;background:#fff2f4;color:#8d2334;box-shadow:0 12px 30px rgba(167,44,64,.1)}.empty-state.account-request strong{display:block;margin-bottom:9px;font-size:16px}.empty-state.account-request span{display:block;font-size:13px;line-height:1.7}.table-meta{color:var(--muted);font-size:10px;line-height:1.55}.spin{display:inline-block;animation:turn 1s linear infinite}@keyframes turn{to{transform:rotate(360deg)}}\n@media(max-width:980px){.shell{grid-template-columns:78px 1fr}.rail{padding:18px 10px}.brand div:last-child,.nav button span:first-child,.rail-foot p,.rail-foot strong{display:none}.brand{justify-content:center}.nav button{justify-content:center}.card,.card.wide{grid-column:span 6}.hero{grid-template-columns:1fr}.session-track{display:none}}\n@media(max-width:680px){.shell{display:block}.rail{height:auto;position:static;flex-direction:row;align-items:center;padding:10px 14px;overflow-x:auto}.brand{padding:0;margin-right:auto;flex:0 0 auto}.nav{display:flex}.nav button{padding:9px;flex:0 0 auto}.rail-foot{display:none}.topbar{padding:0 18px}.content{padding:20px 14px}.hero{padding:23px}.hero h2{font-size:25px}.card,.card.wide{grid-column:1/-1}.form-grid,.command-list{grid-template-columns:1fr}.form-grid .span-2{grid-column:auto}.user-chip div:not(.avatar){display:none}.sync-board{grid-template-columns:1fr}.sync-link{height:32px;transform:rotate(90deg)}.table-head{align-items:flex-start;flex-direction:column}}\n@media(prefers-reduced-motion:no-preference){.card,.hero{animation:arrive .35s ease both}@keyframes arrive{from{opacity:0;transform:translateY(7px)}to{opacity:1;transform:none}}}\n";
3
+ export declare const CONSOLE_JS = "\nconst app=document.getElementById('app');let state=null;let csrf='';let active='overview';let output='\u9009\u62E9\u4E00\u6761\u547D\u4EE4\u6216\u8F93\u5165\u53C2\u6570\u540E\u8FD0\u884C\u3002';let chatgptLocal=null;let chatgptRemote=null;let chatgptLoading=false;const noAvailableAccountGuidance='\u5F53\u524D\u7528\u6237\u6CA1\u6709\u7ED1\u5B9A\u53EF\u7528\u7684 ChatGPT \u8D26\u53F7\u3002\u8BF7\u524D\u5F80 OA \u7CFB\u7EDF\u63D0\u4EA4 IT11 \u5DE5\u5355\uFF0C\u7533\u8BF7\u72EC\u4EAB\u6216\u5171\u4EAB\u7684 ChatGPT \u4E2A\u4EBA\u8D26\u53F7\u3002';\nconst esc=(v)=>String(v??'').replace(/[&<>\"']/g,(c)=>({'&':'&amp;','<':'&lt;','>':'&gt;','\"':'&quot;',\"'\":'&#39;'}[c]));\nasync function api(path,init={}){const headers={'Accept':'application/json',...(init.body?{'Content-Type':'application/json'}:{}),...(csrf?{'x-numa-console-csrf':csrf}:{})};const response=await fetch(path,{...init,headers:{...headers,...(init.headers||{})},credentials:'same-origin'});const body=await response.json().catch(()=>({error:{message:'\u54CD\u5E94\u4E0D\u662F JSON'}}));if(!response.ok)throw new Error(body.error?.message||body.stderr||body.stdout||('HTTP '+response.status));return body}\nasync function bootstrap(attempt=0){try{state=await api('/api/bootstrap');csrf=state.csrfToken;const callbackState=new URLSearchParams(location.search).get('login');const waitingForSuccess=callbackState==='complete'&&!state.loggedIn&&attempt<40;const waitingForFailure=callbackState==='failed'&&!state.loginError&&attempt<8;if(waitingForSuccess||waitingForFailure){app.innerHTML='<div class=\"boot\"><div class=\"boot-mark\">N</div><p>'+(callbackState==='complete'?'\u767B\u5F55\u6210\u529F\uFF0C\u6B63\u5728\u5EFA\u7ACB\u672C\u673A\u4F1A\u8BDD\u2026':'\u6B63\u5728\u8BFB\u53D6\u767B\u5F55\u5931\u8D25\u4FE1\u606F\u2026')+'</p></div>';setTimeout(()=>bootstrap(attempt+1),250);return}if(callbackState==='complete'&&!state.loggedIn&&!state.loginError)state.loginError='\u767B\u5F55\u51ED\u636E\u4EA4\u6362\u5C1A\u672A\u5B8C\u6210\uFF0C\u8BF7\u91CD\u8BD5\u767B\u5F55\u3002';if(callbackState==='failed'&&!state.loginError)state.loginError='Keycloak \u767B\u5F55\u672A\u5B8C\u6210\uFF0C\u8BF7\u91CD\u8BD5\u3002';if(callbackState)history.replaceState({},'',location.pathname);render()}catch(error){app.innerHTML='<div class=\"login-gate\"><div class=\"login-card\"><span class=\"tag role\">\u8FDE\u63A5\u5931\u8D25</span><h2>\u672C\u5730\u63A7\u5236\u53F0\u4E0D\u53EF\u7528</h2><p>'+esc(error.message)+'</p></div></div>'}}\nfunction navButton(id,label,mark){return '<button data-nav=\"'+id+'\" class=\"'+(active===id?'active':'')+'\"><span>'+label+'</span><span class=\"mono\">'+mark+'</span></button>'}\nfunction shell(content){const user=state.user||{};const label=user.username||user.email||'\u672A\u767B\u5F55';return '<div class=\"shell\"><aside class=\"rail\"><div class=\"brand\"><div class=\"brand-mark\">N</div><div><strong>Numa CLI</strong><small>Local control plane</small></div></div><nav class=\"nav\">'+navButton('overview','\u8FD0\u884C\u6982\u89C8','01')+navButton('chatgpt','ChatGPT \u8D26\u53F7','02')+navButton('config','\u57FA\u7840\u914D\u7F6E','03')+navButton('commands','\u547D\u4EE4\u80FD\u529B','04')+navButton('runner','\u6267\u884C\u5668','05')+'</nav><div class=\"rail-foot\"><strong><span class=\"pulse\"></span>\u4EC5\u76D1\u542C\u672C\u673A</strong><p>Token \u4E0D\u4F1A\u53D1\u9001\u7ED9\u7F51\u9875\u811A\u672C\uFF0C\u4E5F\u4E0D\u4F1A\u51FA\u73B0\u5728\u547D\u4EE4\u8F93\u51FA\u4E2D\u3002</p></div></aside><main class=\"main\"><header class=\"topbar\"><div><div class=\"eyebrow\">Numa / Web console</div><h1>'+sectionTitle()+'</h1></div><div class=\"user-chip\"><div class=\"avatar\">'+esc(label.slice(0,1).toUpperCase())+'</div><div><strong>'+esc(label)+'</strong><br><small>'+esc(state.loggedIn?'Keycloak \u4F1A\u8BDD\u6709\u6548':'\u9700\u8981\u767B\u5F55')+'</small></div></div></header>'+content+'</main></div>'}\nfunction sectionTitle(){return {overview:'\u8FD0\u884C\u6982\u89C8',chatgpt:'ChatGPT \u8D26\u53F7',config:'\u57FA\u7840\u914D\u7F6E',commands:'\u547D\u4EE4\u80FD\u529B',runner:'\u5B89\u5168\u6267\u884C\u5668'}[active]||'\u63A7\u5236\u53F0'}\nfunction loginGate(){const error=state?.loginError?'<div class=\"notice error\">'+esc(state.loginError)+'</div>':'';return '<div class=\"login-gate\"><div class=\"login-card\"><span class=\"tag role\">Keycloak PKCE</span><h2>\u767B\u5F55\u540E\u8FDB\u5165\u672C\u5730\u63A7\u5236\u53F0</h2><p>\u6D4F\u89C8\u5668\u53EA\u8D1F\u8D23\u5B8C\u6210\u8BA4\u8BC1\u548C\u64CD\u4F5C\u672C\u673A API\u3002\u8BBF\u95EE\u4EE4\u724C\u4FDD\u5B58\u5728 CLI \u7684\u79C1\u6709\u7F13\u5B58\u4E2D\uFF0C\u4E0D\u5199\u5165 localStorage\uFF0C\u4E5F\u4E0D\u8FD4\u56DE\u7ED9\u9875\u9762\u3002</p><div class=\"actions\"><button class=\"button primary\" data-action=\"login\">\u4F7F\u7528 Keycloak \u767B\u5F55</button></div><div id=\"notice\">'+error+'</div></div></div>'}\nfunction overview(){const u=state.user||{};const roles=[...(u.realmRoles||[]),...Object.values(u.clientRoles||{}).flat()];return '<div class=\"content\"><section class=\"hero\"><div><div class=\"eyebrow\">Authenticated workstation</div><h2>\u672C\u673A\u4F1A\u8BDD\u5DF2\u63A5\u5165\u7814\u53D1\u63A7\u5236\u9762</h2><p>\u4ECE\u540C\u4E00\u5904\u68C0\u67E5\u8EAB\u4EFD\u3001\u8C03\u6574 CLI \u914D\u7F6E\uFF0C\u5E76\u4EE5\u7ED3\u6784\u5316\u53C2\u6570\u8FD0\u884C\u53D7\u652F\u6301\u547D\u4EE4\u3002\u6240\u6709\u7F51\u7EDC\u8BF7\u6C42\u7EE7\u7EED\u7531 CLI \u6CE8\u5165 Bearer Token\u3002</p></div><div class=\"session-track\"><div class=\"track-node live\"><span>\u8EAB\u4EFD</span><strong>'+esc(u.username||'\u5DF2\u767B\u5F55')+'</strong></div><div class=\"track-node\"><span>API</span><strong>'+esc(state.config.apiBaseUrl?'\u5DF2\u914D\u7F6E':'\u672A\u914D\u7F6E')+'</strong></div><div class=\"track-node\"><span>\u89D2\u8272</span><strong>'+roles.length+'</strong></div></div></section><section class=\"grid\"><article class=\"card\"><div class=\"eyebrow\">Session</div><div class=\"metric\">'+esc(state.expiresAt?new Date(state.expiresAt*1000).toLocaleTimeString('zh-CN',{hour:'2-digit',minute:'2-digit'}):'\u2014')+' <small>\u8BBF\u95EE\u4EE4\u724C\u5230\u671F</small></div><p>\u9700\u8981\u65F6\u7531 CLI \u4F7F\u7528 refresh token \u81EA\u52A8\u7EED\u671F\u3002</p></article><article class=\"card\"><div class=\"eyebrow\">Commands</div><div class=\"metric\">'+state.commands.length+' <small>\u6761\u80FD\u529B\u5951\u7EA6</small></div><p>\u7F51\u9875\u6267\u884C\u5668\u53EA\u63A5\u53D7\u76EE\u5F55\u4E2D\u58F0\u660E\u7684\u547D\u4EE4\u3002</p></article><article class=\"card\"><div class=\"eyebrow\">Endpoint</div><div class=\"metric\">'+(state.config.apiBaseUrl?'READY':'SETUP')+'</div><p>'+esc(state.config.apiBaseUrl||'\u8BF7\u5728\u57FA\u7840\u914D\u7F6E\u4E2D\u586B\u5199\u5E73\u53F0 API \u5730\u5740')+'</p></article><article class=\"card wide\"><h3>\u5F53\u524D\u8EAB\u4EFD</h3><p>'+esc(u.displayName||u.username||'-')+' \u00B7 '+esc(u.email||'-')+'</p><div class=\"actions\">'+roles.slice(0,8).map((r)=>'<span class=\"tag\">'+esc(r)+'</span>').join('')+(roles.length>8?'<span class=\"tag public\">+'+(roles.length-8)+'</span>':'')+'</div></article><article class=\"card\"><h3>\u4F1A\u8BDD\u64CD\u4F5C</h3><p>\u5F3A\u5236\u5237\u65B0\u8EAB\u4EFD\u8D44\u6599\uFF0C\u6216\u6E05\u9664\u672C\u673A Keycloak \u7F13\u5B58\u3002</p><div class=\"actions\"><button class=\"button\" data-action=\"reload\">\u5237\u65B0\u72B6\u6001</button><button class=\"button danger\" data-action=\"logout\">\u9000\u51FA\u767B\u5F55</button></div></article></section></div>'}\nfunction instant(value){if(!value)return null;const number=typeof value==='number'?(value<1000000000000?value*1000:value):Date.parse(value);return Number.isFinite(number)?number:null}\nfunction timeText(value){const at=instant(value);return at?new Date(at).toLocaleString('zh-CN',{month:'2-digit',day:'2-digit',hour:'2-digit',minute:'2-digit'}):'\u2014'}\nfunction windowName(window,fallback){const minutes=window?.windowMinutes;if(!minutes)return fallback;if(minutes%1440===0)return (minutes/1440)+'d';if(minutes%60===0)return (minutes/60)+'h';return minutes+'m'}\nfunction quotaWindowHasData(window){if(!window)return false;const minutes=window.windowMinutes;const reset=window.resetAt;const hasMinutes=typeof minutes==='number'&&Number.isFinite(minutes)&&minutes>0;const hasReset=(typeof reset==='number'&&Number.isFinite(reset)&&reset>0)||(typeof reset==='string'&&Number.isFinite(Date.parse(reset)));const hasUsage=typeof window.usedPercent==='number'&&Number.isFinite(window.usedPercent)&&window.usedPercent>0;return hasMinutes||hasReset||hasUsage}\nfunction quotaLine(window,fallback){if(!quotaWindowHasData(window)||typeof window.usedPercent!=='number')return '';const remain=Math.max(0,Math.min(100,100-window.usedPercent));return '<div class=\"quota-line\" title=\"\u989D\u5EA6\u91CD\u7F6E\u65F6\u95F4 '+esc(timeText(window.resetAt))+'\"><span>'+esc(windowName(window,fallback))+'</span><progress max=\"100\" value=\"'+remain.toFixed(1)+'\"></progress><strong>'+remain.toFixed(0)+'%</strong></div>'}\nfunction quotaCell(quota){if(!quota)return '<span class=\"table-meta\">\u6682\u65E0\u989D\u5EA6\u91C7\u6837</span>';const lines=quotaLine(quota.primary,'\u4E3B\u7A97\u53E3')+quotaLine(quota.secondary,'\u6B21\u7A97\u53E3');const detail=[quota.planType,quota.model,quota.activeLimit!=null?'limit '+quota.activeLimit:null].filter(Boolean).join(' \u00B7 ');return '<div class=\"quota-stack\">'+(lines||'<span class=\"table-meta\">\u989D\u5EA6\u7A97\u53E3\u6682\u65E0\u6570\u636E</span>')+'<div class=\"table-meta\">'+esc(detail||'\u5DF2\u91C7\u6837')+'<br>\u91C7\u6837 '+esc(timeText(quota.updatedAt))+'</div></div>'}\nfunction newerQuota(localQuota,remoteQuota){if(!localQuota)return remoteQuota;if(!remoteQuota)return localQuota;return (instant(remoteQuota.updatedAt)||0)>=(instant(localQuota.updatedAt)||0)?remoteQuota:localQuota}\nfunction mergedChatgptAccounts(){const local=chatgptLocal?.accounts||[];const remote=chatgptRemote?.accounts||[];const used=new Set();const rows=local.map((item)=>{const index=remote.findIndex((candidate,i)=>!used.has(i)&&item.accountId&&candidate.accountId===item.accountId);const match=index>=0?remote[index]:null;if(index>=0)used.add(index);return {key:item.id,local:item,remote:match,label:item.label,email:item.email,accountId:item.accountId||match?.accountId,enabled:item.enabled,selected:item.selected,quota:newerQuota(item.quota,match?.quota)}});remote.forEach((item,index)=>{if(!used.has(index))rows.push({key:'remote_'+item.id,local:null,remote:item,label:item.label,email:null,accountId:item.accountId,enabled:true,selected:item.isDefault,quota:item.quota})});return rows}\nfunction syncTag(row){if(chatgptRemote?.status==='LOADING')return '<span class=\"tag waiting\">\u6B63\u5728\u540C\u6B65</span>';if(chatgptRemote?.status==='FAILED')return '<span class=\"tag failed\">\u8FDC\u7A0B\u540C\u6B65\u5931\u8D25</span>';if(chatgptRemote?.status==='NOT_CONFIGURED')return '<span class=\"tag waiting\">\u672A\u914D\u7F6E\u5E73\u53F0</span>';if(row.local&&row.remote)return '<span class=\"tag success\">\u5DF2\u540C\u6B65</span>';if(row.local)return '<span class=\"tag local\">\u4EC5\u672C\u5730</span>';return '<span class=\"tag success\">\u5E73\u53F0\u53EF\u7528</span>'}\nfunction remoteStage(){const remote=chatgptRemote;if(!remote||remote.status==='LOADING')return {tag:'<span class=\"tag waiting\"><span class=\"spin\">\u21BB</span>&nbsp;\u8FDE\u63A5\u4E2D</span>',title:'\u6B63\u5728\u8FDE\u63A5\u5E73\u53F0',detail:'\u672C\u5730\u8D26\u53F7\u5DF2\u7ECF\u53EF\u89C1\uFF0C\u6B63\u5728\u8BFB\u53D6\u8FDC\u7A0B\u53EF\u7528\u8D26\u53F7\u3002'};if(remote.status==='SUCCESS')return {tag:'<span class=\"tag success\">\u540C\u6B65\u6210\u529F</span>',title:remote.accounts.length+' \u4E2A\u5E73\u53F0\u8D26\u53F7',detail:'\u5B8C\u6210\u4E8E '+timeText(remote.syncedAt)};if(remote.status==='FAILED')return {tag:'<span class=\"tag failed\">\u8FDC\u7A0B\u540C\u6B65\u5931\u8D25</span>',title:'\u4FDD\u7559\u672C\u5730\u7ED3\u679C',detail:remote.error?.message||'\u65E0\u6CD5\u8FDE\u63A5\u8FDC\u7A0B\u8D26\u53F7\u670D\u52A1'};return {tag:'<span class=\"tag waiting\">\u672A\u914D\u7F6E</span>',title:'\u672A\u914D\u7F6E\u5E73\u53F0\u5730\u5740',detail:'\u53EF\u5728\u57FA\u7840\u914D\u7F6E\u4E2D\u586B\u5199\u5E73\u53F0 API \u5730\u5740\u3002'}}\nfunction accountRows(rows){return rows.map((row)=>'<tr><td><div class=\"account-name\"><strong>'+esc(row.label)+'</strong><small>'+esc(row.email||row.accountId||row.key)+'</small></div></td><td><div class=\"status-stack\">'+(row.enabled?'<span class=\"tag success\">\u53EF\u7528</span>':'<span class=\"tag failed\">\u5DF2\u505C\u7528</span>')+(row.selected?'<span class=\"tag role\">\u5BA2\u6237\u7AEF\u5DF2\u9009</span>':'')+'</div></td><td>'+quotaCell(row.quota)+'</td><td><div class=\"table-meta\">Token '+esc(row.local?'\u672C\u5730\u53EF\u7528':'\u6309\u9700\u4ECE\u5E73\u53F0\u83B7\u53D6')+'<br>\u5230\u671F '+esc(timeText(row.local?.accessExpiresAt||row.remote?.accessExpiresAt))+'</div></td><td><div class=\"status-stack\">'+syncTag(row)+'</div></td></tr>').join('')}\nfunction chatgptPage(){const rows=mergedChatgptAccounts();const remote=remoteStage();const localReady=chatgptLocal?.status==='READY';const localCount=chatgptLocal?.available??0;const failure=chatgptRemote?.status==='FAILED'?'<div class=\"notice error\"><strong>\u8FDC\u7A0B\u540C\u6B65\u5931\u8D25\u3002</strong> '+esc(chatgptRemote.error?.message||'\u5E73\u53F0\u6682\u65F6\u4E0D\u53EF\u7528')+'\uFF1B\u672C\u5730\u8D26\u53F7\u6570\u636E\u4ECD\u53EF\u6B63\u5E38\u67E5\u770B\u3002</div>':'';return '<div class=\"content\"><section class=\"hero\"><div><div class=\"eyebrow\">Local first / Remote second</div><h2>ChatGPT \u8D26\u53F7\u8FD0\u884C\u89C6\u56FE</h2><p>\u5148\u8BFB\u53D6 codex-multi-auth \u672C\u5730\u8D26\u53F7\u4E0E\u989D\u5EA6\u7F13\u5B58\uFF0C\u518D\u8FDE\u63A5\u5E73\u53F0\u8865\u5145\u5F53\u524D\u7528\u6237\u53EF\u7528\u8D26\u53F7\u3002\u9875\u9762\u6C38\u4E0D\u63A5\u6536 access token \u6216 refresh token\u3002</p></div><div class=\"session-track\"><div class=\"track-node live\"><span>\u672C\u5730\u53EF\u7528</span><strong>'+localCount+'</strong></div><div class=\"track-node\"><span>\u6C47\u603B\u8D26\u53F7</span><strong>'+rows.length+'</strong></div><div class=\"track-node\"><span>\u8FDC\u7A0B</span><strong>'+esc(chatgptRemote?.status||'WAITING')+'</strong></div></div></section><section class=\"sync-board\"><article class=\"sync-stage\"><div class=\"eyebrow\">01 / Local pool</div><strong>'+(localReady?localCount+' \u4E2A\u672C\u5730\u53EF\u7528\u8D26\u53F7':'\u6B63\u5728\u8BFB\u53D6\u672C\u5730\u8D26\u53F7')+'</strong><p>'+(localReady?'\u8BFB\u53D6\u5B8C\u6210\u4E8E '+timeText(chatgptLocal.readAt):'\u4F18\u5148\u8BFB\u53D6 codex-multi-auth \u5B89\u5168\u6458\u8981\u3002')+'</p></article><div class=\"sync-link\" aria-label=\"\u7136\u540E\u8FDE\u63A5\u8FDC\u7A0B\"></div><article class=\"sync-stage\"><div class=\"eyebrow\">02 / Platform service</div>'+remote.tag+'<strong>'+esc(remote.title)+'</strong><p>'+esc(remote.detail)+'</p></article></section>'+failure+'<section class=\"table-card\"><header class=\"table-head\"><div><h3>\u53EF\u7528\u8D26\u53F7\u4E0E\u5269\u4F59\u989D\u5EA6</h3><p>\u989D\u5EA6\u4F18\u5148\u5C55\u793A\u672C\u5730\u6216\u670D\u52A1\u5668\u7AEF\u66F4\u65B0\u8F83\u65B0\u7684\u5B89\u5168\u5FEB\u7167\u3002</p></div><button class=\"button\" data-action=\"chatgpt-refresh\" '+(chatgptLoading?'disabled':'')+'>'+(chatgptLoading?'<span class=\"spin\">\u21BB</span> \u540C\u6B65\u4E2D':'\u21BB \u91CD\u65B0\u540C\u6B65')+'</button></header>'+(rows.length?'<div class=\"account-table-wrap\"><table class=\"account-table\"><thead><tr><th>\u8D26\u53F7</th><th>\u53EF\u7528\u72B6\u6001</th><th>\u5269\u4F59 limit</th><th>\u51ED\u636E\u65F6\u6548</th><th>\u540C\u6B65\u72B6\u6001</th></tr></thead><tbody>'+accountRows(rows)+'</tbody></table></div>':'<div class=\"empty-state'+(chatgptLoading?'':' account-request')+'\">'+(chatgptLoading?'\u6B63\u5728\u8BFB\u53D6\u672C\u5730\u8D26\u53F7\u2026':'<strong>\u9700\u8981\u7533\u8BF7 ChatGPT \u8D26\u53F7</strong><span>'+esc(noAvailableAccountGuidance)+'</span>')+'</div>')+'</section></div>'}\nfunction configPage(){const c=state.config;return '<div class=\"content\"><section class=\"grid\"><article class=\"card full\"><div class=\"eyebrow\">Configuration file</div><h3>\u57FA\u7840\u914D\u7F6E</h3><p>\u4E0E <code>numa config --set</code> \u4F7F\u7528\u540C\u4E00\u4EFD\u914D\u7F6E\u548C\u6821\u9A8C\u903B\u8F91\u3002</p><form id=\"config-form\" class=\"form-grid\"><div class=\"field\"><label>\u754C\u9762\u8BED\u8A00</label><select name=\"locale\"><option '+(c.locale==='zh-CN'?'selected':'')+'>zh-CN</option><option '+(c.locale==='en-US'?'selected':'')+'>en-US</option></select></div><div class=\"field\"><label>\u9ED8\u8BA4\u8F93\u51FA</label><select name=\"output\"><option '+(c.output==='text'?'selected':'')+'>text</option><option '+(c.output==='json'?'selected':'')+'>json</option></select></div><div class=\"field span-2\"><label>\u5E73\u53F0 API \u5730\u5740</label><input name=\"apiBaseUrl\" value=\"'+esc(c.apiBaseUrl)+'\" placeholder=\"https://platform.example/api\"></div><div class=\"field span-2\"><label>npm registry</label><input name=\"registryUrl\" value=\"'+esc(c.registryUrl)+'\"></div><label class=\"field span-2\"><span>\u66F4\u65B0\u68C0\u67E5</span><select name=\"checkUpdates\"><option value=\"true\" '+(c.checkUpdates?'selected':'')+'>\u542F\u7528</option><option value=\"false\" '+(!c.checkUpdates?'selected':'')+'>\u5173\u95ED</option></select></label><div class=\"actions span-2\"><button class=\"button primary\" type=\"submit\">\u4FDD\u5B58\u914D\u7F6E</button></div></form><div id=\"notice\"></div></article></section></div>'}\nfunction commandsPage(){return '<div class=\"content\"><section class=\"card full\"><div class=\"command-toolbar\"><div class=\"field grow\"><label>\u8FC7\u6EE4\u547D\u4EE4</label><input id=\"command-search\" placeholder=\"\u4F8B\u5982 codex\u3001media\u3001auth\"></div></div><div id=\"command-list\" class=\"command-list\">'+commandCards('')+'</div></section></div>'}\nfunction commandCards(query){const q=query.toLowerCase();return state.commands.filter((c)=>(c.command+' '+c.summary).toLowerCase().includes(q)).map((c)=>'<article class=\"command\"><div class=\"command-head\"><code>'+esc(c.command)+'</code><span class=\"tag '+esc(c.access)+'\">'+esc(c.access)+'</span></div><p>'+esc(c.summary)+'</p><small>'+esc(c.examples[0]||'')+'</small><div class=\"actions mt-10\"><button class=\"button\" data-load=\"'+esc(JSON.stringify(commandPrefix(c.command)))+'\">\u8F7D\u5165\u6267\u884C\u5668</button></div></article>').join('')||'<p>\u6CA1\u6709\u5339\u914D\u547D\u4EE4\u3002</p>'}\nfunction commandPrefix(command){return command.split(/s+/).filter((part)=>!part.startsWith('[')&&!part.startsWith('<')&&!part.startsWith('--'))}\nfunction runnerPage(){return '<div class=\"content\"><section class=\"grid\"><article class=\"card\"><div class=\"eyebrow\">Structured argv</div><h3>\u5B89\u5168\u6267\u884C\u5668</h3><p>\u4F7F\u7528 JSON \u6570\u7EC4\u4F20\u5165\u53C2\u6570\uFF0C\u4E0D\u7ECF\u8FC7 shell\u3002\u957F\u9A7B\u6216\u4EA4\u4E92\u547D\u4EE4\u9700\u8981\u5728\u7EC8\u7AEF\u8FD0\u884C\u3002</p><form id=\"runner-form\"><div class=\"field\"><label>\u547D\u4EE4\u53C2\u6570</label><textarea id=\"argv\" class=\"mono\">[\"doctor\"]</textarea></div><label class=\"field mt-12\"><span>\u5371\u9669\u64CD\u4F5C\u786E\u8BA4</span><select id=\"confirm\"><option value=\"false\">\u672A\u786E\u8BA4</option><option value=\"true\">\u786E\u8BA4\u6267\u884C\u5220\u9664/\u91CD\u7F6E</option></select></label><div class=\"actions mt-14\"><button class=\"button primary\" type=\"submit\">\u8FD0\u884C\u547D\u4EE4</button></div></form></article><article class=\"card wide\"><div class=\"eyebrow\">Result stream</div><h3>\u7ED3\u6784\u5316\u8F93\u51FA</h3><pre id=\"output\" class=\"output\">'+esc(output)+'</pre></article></section></div>'}\nasync function loadChatgpt(){if(chatgptLoading)return;chatgptLoading=true;chatgptLocal=null;chatgptRemote={status:'LOADING',accounts:[]};render();try{chatgptLocal=await api('/api/chatgpt/local')}catch(error){chatgptLocal={status:'FAILED',accounts:[],available:0,total:0,error:{message:error.message}}}render();try{chatgptRemote=await api('/api/chatgpt/remote')}catch(error){chatgptRemote={status:'FAILED',accounts:[],syncedAt:Date.now(),error:{message:error.message}}}finally{chatgptLoading=false;render()}}\nfunction render(){if(!state.loggedIn){app.innerHTML=loginGate();bind();return}const page=active==='overview'?overview():active==='chatgpt'?chatgptPage():active==='config'?configPage():active==='commands'?commandsPage():runnerPage();app.innerHTML=shell(page);bind()}\nfunction notice(message,type='success'){const target=document.getElementById('notice');if(target)target.innerHTML='<div class=\"notice '+type+'\">'+esc(message)+'</div>'}\nfunction bindCommandLoaders(){document.querySelectorAll('[data-load]').forEach((b)=>b.addEventListener('click',()=>{const argv=JSON.parse(b.dataset.load);active='runner';render();document.getElementById('argv').value=JSON.stringify(argv)}))}\nfunction bind(){document.querySelectorAll('[data-nav]').forEach((b)=>b.addEventListener('click',()=>{active=b.dataset.nav;render();if(active==='chatgpt'&&!chatgptLocal&&!chatgptLoading)void loadChatgpt()}));document.querySelector('[data-action=\"chatgpt-refresh\"]')?.addEventListener('click',()=>void loadChatgpt());document.querySelector('[data-action=\"login\"]')?.addEventListener('click',async()=>{try{notice('\u6B63\u5728\u542F\u52A8\u767B\u5F55\u2026');const result=await api('/api/auth/login',{method:'POST',body:'{}'});location.href=result.authorizationUrl}catch(e){notice(e.message,'error')}});document.querySelector('[data-action=\"reload\"]')?.addEventListener('click',()=>bootstrap());document.querySelector('[data-action=\"logout\"]')?.addEventListener('click',async()=>{if(!confirm('\u6E05\u9664\u672C\u673A Keycloak \u767B\u5F55\u7F13\u5B58\uFF1F'))return;await api('/api/auth/logout',{method:'POST',body:'{}'});location.reload()});document.getElementById('config-form')?.addEventListener('submit',async(e)=>{e.preventDefault();const data=Object.fromEntries(new FormData(e.currentTarget));data.checkUpdates=data.checkUpdates==='true';try{const result=await api('/api/config',{method:'PUT',body:JSON.stringify(data)});state.config=result.config;notice('\u914D\u7F6E\u5DF2\u4FDD\u5B58')}catch(err){notice(err.message,'error')}});document.getElementById('command-search')?.addEventListener('input',(e)=>{document.getElementById('command-list').innerHTML=commandCards(e.target.value);bindCommandLoaders()});bindCommandLoaders();document.getElementById('runner-form')?.addEventListener('submit',async(e)=>{e.preventDefault();try{const argv=JSON.parse(document.getElementById('argv').value);const confirmed=document.getElementById('confirm')?.value==='true';output='\u8FD0\u884C\u4E2D\u2026';render();const result=await api('/api/commands/run',{method:'POST',body:JSON.stringify({argv,confirm:confirmed})});output=result.stdout||result.stderr||JSON.stringify(result,null,2);render()}catch(err){output='\u9519\u8BEF: '+err.message;render()}})}\nbootstrap();\n";
@@ -17,13 +17,13 @@ export const CONSOLE_CSS = `
17
17
  .shell{min-height:100vh;display:grid;grid-template-columns:260px 1fr}.rail{position:sticky;top:0;height:100vh;padding:24px 18px;background:var(--navy);color:#d7e6f3;display:flex;flex-direction:column}.brand{display:flex;align-items:center;gap:12px;padding:8px 8px 26px}.brand-mark{width:38px;height:38px;border-radius:12px}.brand strong{display:block;letter-spacing:.04em}.brand small{display:block;margin-top:4px;color:#708aa3;font-size:10px;letter-spacing:.18em;text-transform:uppercase}.nav{display:grid;gap:7px}.nav button{border:0;background:transparent;color:#8da4b8;border-radius:11px;text-align:left;padding:11px 13px;cursor:pointer;display:flex;justify-content:space-between}.nav button:hover,.nav button.active{background:var(--navy-2);color:white}.nav button.active{box-shadow:inset 3px 0 var(--cyan)}.rail-foot{margin-top:auto;border:1px solid #203b55;border-radius:14px;padding:14px}.rail-foot .pulse{display:inline-block;width:8px;height:8px;border-radius:50%;background:var(--cyan);box-shadow:0 0 12px var(--cyan);margin-right:7px}.rail-foot p{margin:7px 0 0;color:#7791a8;font-size:11px;line-height:1.5}
18
18
  .main{min-width:0;min-height:100vh;display:flex;flex-direction:column}.topbar{height:76px;padding:0 34px;background:rgba(251,253,255,.94);border-bottom:1px solid var(--line);display:flex;align-items:center;justify-content:space-between;position:sticky;top:0;z-index:3;backdrop-filter:blur(12px)}.topbar h1{font-size:17px;margin:0}.eyebrow{font:700 10px/1.2 "SFMono-Regular",monospace;text-transform:uppercase;letter-spacing:.16em;color:var(--cyan)}.user-chip{display:flex;align-items:center;gap:10px}.avatar{width:34px;height:34px;border-radius:50%;display:grid;place-items:center;background:var(--cyan-soft);color:#087d84;font-weight:800}.user-chip small{color:var(--muted)}.content{width:100%;max-width:1420px;flex:1;margin:0 auto;padding:30px 34px 56px}.hero{background:var(--navy);color:white;border-radius:22px;padding:28px 30px;display:grid;grid-template-columns:1fr auto;gap:24px;position:relative;overflow:hidden;box-shadow:var(--shadow)}.hero:after{content:"";position:absolute;right:-45px;top:-90px;width:320px;height:240px;border:34px solid rgba(14,183,191,.09);transform:rotate(-18deg);border-radius:48px}.hero h2{font-size:32px;line-height:1.08;margin:10px 0}.hero p{max-width:720px;color:#91aac0;margin:0;line-height:1.6}.session-track{align-self:center;display:flex;gap:0;position:relative;z-index:1}.track-node{min-width:112px;border:1px solid #2a4661;padding:13px 15px;background:#0b1e33}.track-node:first-child{border-radius:13px 0 0 13px}.track-node:last-child{border-radius:0 13px 13px 0}.track-node span{display:block;color:#7690a7;font-size:9px;text-transform:uppercase;letter-spacing:.12em}.track-node strong{display:block;margin-top:6px;font-size:13px}.track-node.live strong{color:#58e0df}
19
19
  .grid{display:grid;grid-template-columns:repeat(12,1fr);gap:18px;margin-top:20px}.card{grid-column:span 4;background:var(--paper);border:1px solid var(--line);border-radius:17px;padding:20px;box-shadow:0 10px 30px rgba(25,54,79,.05)}.card.wide{grid-column:span 8}.card.full{grid-column:1/-1}.card h3{margin:0;font-size:15px}.card p{color:var(--muted);font-size:12px;line-height:1.6}.metric{font-size:28px;font-weight:750;margin-top:16px}.metric small{font-size:11px;color:var(--muted);font-weight:500}.tag{display:inline-flex;border-radius:999px;padding:5px 8px;font:700 9px/1 "SFMono-Regular",monospace;text-transform:uppercase;letter-spacing:.05em;background:var(--cyan-soft);color:#087d84}.tag.public{background:#edf1f5;color:#5d7082}.tag.role{background:#fff0d9;color:#9c5c09}.actions{display:flex;gap:8px;flex-wrap:wrap}.button{border:1px solid var(--line);border-radius:10px;background:white;color:var(--ink);padding:9px 12px;cursor:pointer;font-weight:700;font-size:12px}.button:hover{border-color:#9ab6c9;background:#f7fbfd}.button.primary{background:#0b949b;border-color:#0b949b;color:white}.button.danger{color:var(--red);border-color:#f0bec4}.button:disabled{opacity:.45;cursor:not-allowed}.field{display:grid;gap:6px}.field label{font-size:11px;color:var(--muted);font-weight:700}.field input,.field select,.field textarea{width:100%;border:1px solid var(--line);border-radius:10px;background:white;padding:10px 11px;color:var(--ink);outline:none}.field input:focus,.field textarea:focus{border-color:var(--cyan);box-shadow:0 0 0 3px rgba(14,183,191,.12)}.field textarea{min-height:110px;resize:vertical}.form-grid{display:grid;grid-template-columns:1fr 1fr;gap:14px}.form-grid .span-2{grid-column:1/-1}.command-toolbar{display:flex;gap:10px;margin-bottom:15px}.grow{flex:1}.mt-10{margin-top:10px}.mt-12{margin-top:12px}.mt-14{margin-top:14px}.command-list{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:11px}.command{border:1px solid var(--line);border-radius:13px;padding:14px;background:white}.command-head{display:flex;gap:8px;align-items:center;justify-content:space-between}.command code{font-size:11px;color:#0b6f76}.command p{margin:9px 0}.command small{display:block;color:#8a9bab;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.output{background:#071522;color:#b8d1e2;border-radius:13px;padding:15px;min-height:170px;max-height:420px;overflow:auto;white-space:pre-wrap;font-size:11px;line-height:1.65}.notice{margin-top:14px;border-radius:11px;padding:11px 13px;font-size:12px}.notice.error{background:#fff0f2;color:#a52c3b;border:1px solid #f1c4ca}.notice.success{background:#e8f7f1;color:#176c54;border:1px solid #bce4d5}.login-gate{min-height:calc(100vh - 76px);display:grid;place-content:center;padding:30px}.login-card{width:min(520px,90vw);background:white;border:1px solid var(--line);border-radius:22px;padding:32px;box-shadow:var(--shadow)}.login-card h2{font-size:28px;margin:14px 0 9px}.login-card p{color:var(--muted);line-height:1.65}.hidden{display:none!important}
20
- .sync-board{display:grid;grid-template-columns:1fr 56px 1fr;align-items:stretch;margin-top:20px}.sync-stage{background:var(--paper);border:1px solid var(--line);border-radius:17px;padding:18px 20px;box-shadow:0 10px 30px rgba(25,54,79,.05)}.sync-stage strong{display:block;margin-top:8px;font-size:18px}.sync-stage p{margin:7px 0 0;color:var(--muted);font-size:11px}.sync-link{display:grid;place-items:center;color:var(--cyan);font-size:22px}.sync-link:before{content:"";height:2px;width:100%;background:linear-gradient(90deg,var(--cyan),#bad8dc)}.table-card{margin-top:18px;background:var(--paper);border:1px solid var(--line);border-radius:17px;box-shadow:0 10px 30px rgba(25,54,79,.05);overflow:hidden}.table-head{padding:18px 20px;display:flex;align-items:center;justify-content:space-between;gap:16px;border-bottom:1px solid var(--line)}.table-head h3{margin:0}.table-head p{margin:5px 0 0;color:var(--muted);font-size:11px}.account-table-wrap{overflow:auto}.account-table{width:100%;border-collapse:collapse;min-width:920px}.account-table th,.account-table td{text-align:left;padding:14px 16px;border-bottom:1px solid #e7eef3;vertical-align:middle}.account-table th{background:#f5f9fb;color:#6c8094;font-size:10px;text-transform:uppercase;letter-spacing:.08em}.account-table tr:last-child td{border-bottom:0}.account-name strong{display:block;font-size:13px}.account-name small{display:block;margin-top:4px;color:var(--muted);font-size:10px}.quota-stack{min-width:210px;display:grid;gap:8px}.quota-line{display:grid;grid-template-columns:42px 1fr 38px;align-items:center;gap:7px;font-size:10px;color:var(--muted)}progress{width:100%;height:7px;border:0;border-radius:99px;overflow:hidden;background:#e7eef3}progress::-webkit-progress-bar{background:#e7eef3;border-radius:99px}progress::-webkit-progress-value{background:var(--cyan);border-radius:99px}progress::-moz-progress-bar{background:var(--cyan);border-radius:99px}.status-stack{display:flex;gap:6px;flex-wrap:wrap}.tag.success{background:#e8f7f1;color:var(--green)}.tag.failed{background:#fff0f2;color:var(--red)}.tag.waiting{background:#fff0d9;color:#9c5c09}.tag.local{background:#e8f1fa;color:#32658f}.empty-state{padding:48px 20px;text-align:center;color:var(--muted)}.table-meta{color:var(--muted);font-size:10px;line-height:1.55}.spin{display:inline-block;animation:turn 1s linear infinite}@keyframes turn{to{transform:rotate(360deg)}}
20
+ .sync-board{display:grid;grid-template-columns:1fr 56px 1fr;align-items:stretch;margin-top:20px}.sync-stage{background:var(--paper);border:1px solid var(--line);border-radius:17px;padding:18px 20px;box-shadow:0 10px 30px rgba(25,54,79,.05)}.sync-stage strong{display:block;margin-top:8px;font-size:18px}.sync-stage p{margin:7px 0 0;color:var(--muted);font-size:11px}.sync-link{display:grid;place-items:center;color:var(--cyan);font-size:22px}.sync-link:before{content:"";height:2px;width:100%;background:linear-gradient(90deg,var(--cyan),#bad8dc)}.table-card{margin-top:18px;background:var(--paper);border:1px solid var(--line);border-radius:17px;box-shadow:0 10px 30px rgba(25,54,79,.05);overflow:hidden}.table-head{padding:18px 20px;display:flex;align-items:center;justify-content:space-between;gap:16px;border-bottom:1px solid var(--line)}.table-head h3{margin:0}.table-head p{margin:5px 0 0;color:var(--muted);font-size:11px}.account-table-wrap{overflow:auto}.account-table{width:100%;border-collapse:collapse;min-width:920px}.account-table th,.account-table td{text-align:left;padding:14px 16px;border-bottom:1px solid #e7eef3;vertical-align:middle}.account-table th{background:#f5f9fb;color:#6c8094;font-size:10px;text-transform:uppercase;letter-spacing:.08em}.account-table tr:last-child td{border-bottom:0}.account-name strong{display:block;font-size:13px}.account-name small{display:block;margin-top:4px;color:var(--muted);font-size:10px}.quota-stack{min-width:210px;display:grid;gap:8px}.quota-line{display:grid;grid-template-columns:42px 1fr 38px;align-items:center;gap:7px;font-size:10px;color:var(--muted)}progress{width:100%;height:7px;border:0;border-radius:99px;overflow:hidden;background:#e7eef3}progress::-webkit-progress-bar{background:#e7eef3;border-radius:99px}progress::-webkit-progress-value{background:var(--cyan);border-radius:99px}progress::-moz-progress-bar{background:var(--cyan);border-radius:99px}.status-stack{display:flex;gap:6px;flex-wrap:wrap}.tag.success{background:#e8f7f1;color:var(--green)}.tag.failed{background:#fff0f2;color:var(--red)}.tag.waiting{background:#fff0d9;color:#9c5c09}.tag.local{background:#e8f1fa;color:#32658f}.empty-state{padding:48px 20px;text-align:center;color:var(--muted)}.empty-state.account-request{margin:24px;border:2px solid #f0b5bd;border-radius:16px;background:#fff2f4;color:#8d2334;box-shadow:0 12px 30px rgba(167,44,64,.1)}.empty-state.account-request strong{display:block;margin-bottom:9px;font-size:16px}.empty-state.account-request span{display:block;font-size:13px;line-height:1.7}.table-meta{color:var(--muted);font-size:10px;line-height:1.55}.spin{display:inline-block;animation:turn 1s linear infinite}@keyframes turn{to{transform:rotate(360deg)}}
21
21
  @media(max-width:980px){.shell{grid-template-columns:78px 1fr}.rail{padding:18px 10px}.brand div:last-child,.nav button span:first-child,.rail-foot p,.rail-foot strong{display:none}.brand{justify-content:center}.nav button{justify-content:center}.card,.card.wide{grid-column:span 6}.hero{grid-template-columns:1fr}.session-track{display:none}}
22
22
  @media(max-width:680px){.shell{display:block}.rail{height:auto;position:static;flex-direction:row;align-items:center;padding:10px 14px;overflow-x:auto}.brand{padding:0;margin-right:auto;flex:0 0 auto}.nav{display:flex}.nav button{padding:9px;flex:0 0 auto}.rail-foot{display:none}.topbar{padding:0 18px}.content{padding:20px 14px}.hero{padding:23px}.hero h2{font-size:25px}.card,.card.wide{grid-column:1/-1}.form-grid,.command-list{grid-template-columns:1fr}.form-grid .span-2{grid-column:auto}.user-chip div:not(.avatar){display:none}.sync-board{grid-template-columns:1fr}.sync-link{height:32px;transform:rotate(90deg)}.table-head{align-items:flex-start;flex-direction:column}}
23
23
  @media(prefers-reduced-motion:no-preference){.card,.hero{animation:arrive .35s ease both}@keyframes arrive{from{opacity:0;transform:translateY(7px)}to{opacity:1;transform:none}}}
24
24
  `;
25
25
  export const CONSOLE_JS = `
26
- const app=document.getElementById('app');let state=null;let csrf='';let active='overview';let output='选择一条命令或输入参数后运行。';let chatgptLocal=null;let chatgptRemote=null;let chatgptLoading=false;
26
+ const app=document.getElementById('app');let state=null;let csrf='';let active='overview';let output='选择一条命令或输入参数后运行。';let chatgptLocal=null;let chatgptRemote=null;let chatgptLoading=false;const noAvailableAccountGuidance='当前用户没有绑定可用的 ChatGPT 账号。请前往 OA 系统提交 IT11 工单,申请独享或共享的 ChatGPT 个人账号。';
27
27
  const esc=(v)=>String(v??'').replace(/[&<>"']/g,(c)=>({'&':'&amp;','<':'&lt;','>':'&gt;','"':'&quot;',"'":'&#39;'}[c]));
28
28
  async function api(path,init={}){const headers={'Accept':'application/json',...(init.body?{'Content-Type':'application/json'}:{}),...(csrf?{'x-numa-console-csrf':csrf}:{})};const response=await fetch(path,{...init,headers:{...headers,...(init.headers||{})},credentials:'same-origin'});const body=await response.json().catch(()=>({error:{message:'响应不是 JSON'}}));if(!response.ok)throw new Error(body.error?.message||body.stderr||body.stdout||('HTTP '+response.status));return body}
29
29
  async function bootstrap(attempt=0){try{state=await api('/api/bootstrap');csrf=state.csrfToken;const callbackState=new URLSearchParams(location.search).get('login');const waitingForSuccess=callbackState==='complete'&&!state.loggedIn&&attempt<40;const waitingForFailure=callbackState==='failed'&&!state.loginError&&attempt<8;if(waitingForSuccess||waitingForFailure){app.innerHTML='<div class="boot"><div class="boot-mark">N</div><p>'+(callbackState==='complete'?'登录成功,正在建立本机会话…':'正在读取登录失败信息…')+'</p></div>';setTimeout(()=>bootstrap(attempt+1),250);return}if(callbackState==='complete'&&!state.loggedIn&&!state.loginError)state.loginError='登录凭据交换尚未完成,请重试登录。';if(callbackState==='failed'&&!state.loginError)state.loginError='Keycloak 登录未完成,请重试。';if(callbackState)history.replaceState({},'',location.pathname);render()}catch(error){app.innerHTML='<div class="login-gate"><div class="login-card"><span class="tag role">连接失败</span><h2>本地控制台不可用</h2><p>'+esc(error.message)+'</p></div></div>'}}
@@ -43,7 +43,7 @@ function mergedChatgptAccounts(){const local=chatgptLocal?.accounts||[];const re
43
43
  function syncTag(row){if(chatgptRemote?.status==='LOADING')return '<span class="tag waiting">正在同步</span>';if(chatgptRemote?.status==='FAILED')return '<span class="tag failed">远程同步失败</span>';if(chatgptRemote?.status==='NOT_CONFIGURED')return '<span class="tag waiting">未配置平台</span>';if(row.local&&row.remote)return '<span class="tag success">已同步</span>';if(row.local)return '<span class="tag local">仅本地</span>';return '<span class="tag success">平台可用</span>'}
44
44
  function remoteStage(){const remote=chatgptRemote;if(!remote||remote.status==='LOADING')return {tag:'<span class="tag waiting"><span class="spin">↻</span>&nbsp;连接中</span>',title:'正在连接平台',detail:'本地账号已经可见,正在读取远程可用账号。'};if(remote.status==='SUCCESS')return {tag:'<span class="tag success">同步成功</span>',title:remote.accounts.length+' 个平台账号',detail:'完成于 '+timeText(remote.syncedAt)};if(remote.status==='FAILED')return {tag:'<span class="tag failed">远程同步失败</span>',title:'保留本地结果',detail:remote.error?.message||'无法连接远程账号服务'};return {tag:'<span class="tag waiting">未配置</span>',title:'未配置平台地址',detail:'可在基础配置中填写平台 API 地址。'}}
45
45
  function accountRows(rows){return rows.map((row)=>'<tr><td><div class="account-name"><strong>'+esc(row.label)+'</strong><small>'+esc(row.email||row.accountId||row.key)+'</small></div></td><td><div class="status-stack">'+(row.enabled?'<span class="tag success">可用</span>':'<span class="tag failed">已停用</span>')+(row.selected?'<span class="tag role">客户端已选</span>':'')+'</div></td><td>'+quotaCell(row.quota)+'</td><td><div class="table-meta">Token '+esc(row.local?'本地可用':'按需从平台获取')+'<br>到期 '+esc(timeText(row.local?.accessExpiresAt||row.remote?.accessExpiresAt))+'</div></td><td><div class="status-stack">'+syncTag(row)+'</div></td></tr>').join('')}
46
- function chatgptPage(){const rows=mergedChatgptAccounts();const remote=remoteStage();const localReady=chatgptLocal?.status==='READY';const localCount=chatgptLocal?.available??0;const failure=chatgptRemote?.status==='FAILED'?'<div class="notice error"><strong>远程同步失败。</strong> '+esc(chatgptRemote.error?.message||'平台暂时不可用')+';本地账号数据仍可正常查看。</div>':'';return '<div class="content"><section class="hero"><div><div class="eyebrow">Local first / Remote second</div><h2>ChatGPT 账号运行视图</h2><p>先读取 codex-multi-auth 本地账号与额度缓存,再连接平台补充当前用户可用账号。页面永不接收 access token 或 refresh token。</p></div><div class="session-track"><div class="track-node live"><span>本地可用</span><strong>'+localCount+'</strong></div><div class="track-node"><span>汇总账号</span><strong>'+rows.length+'</strong></div><div class="track-node"><span>远程</span><strong>'+esc(chatgptRemote?.status||'WAITING')+'</strong></div></div></section><section class="sync-board"><article class="sync-stage"><div class="eyebrow">01 / Local pool</div><strong>'+(localReady?localCount+' 个本地可用账号':'正在读取本地账号')+'</strong><p>'+(localReady?'读取完成于 '+timeText(chatgptLocal.readAt):'优先读取 codex-multi-auth 安全摘要。')+'</p></article><div class="sync-link" aria-label="然后连接远程"></div><article class="sync-stage"><div class="eyebrow">02 / Platform service</div>'+remote.tag+'<strong>'+esc(remote.title)+'</strong><p>'+esc(remote.detail)+'</p></article></section>'+failure+'<section class="table-card"><header class="table-head"><div><h3>可用账号与剩余额度</h3><p>额度优先展示本地或服务器端更新较新的安全快照。</p></div><button class="button" data-action="chatgpt-refresh" '+(chatgptLoading?'disabled':'')+'>'+(chatgptLoading?'<span class="spin">↻</span> 同步中':'↻ 重新同步')+'</button></header>'+(rows.length?'<div class="account-table-wrap"><table class="account-table"><thead><tr><th>账号</th><th>可用状态</th><th>剩余 limit</th><th>凭据时效</th><th>同步状态</th></tr></thead><tbody>'+accountRows(rows)+'</tbody></table></div>':'<div class="empty-state">'+(chatgptLoading?'正在读取本地账号…':'未发现本地或平台可用账号')+'</div>')+'</section></div>'}
46
+ function chatgptPage(){const rows=mergedChatgptAccounts();const remote=remoteStage();const localReady=chatgptLocal?.status==='READY';const localCount=chatgptLocal?.available??0;const failure=chatgptRemote?.status==='FAILED'?'<div class="notice error"><strong>远程同步失败。</strong> '+esc(chatgptRemote.error?.message||'平台暂时不可用')+';本地账号数据仍可正常查看。</div>':'';return '<div class="content"><section class="hero"><div><div class="eyebrow">Local first / Remote second</div><h2>ChatGPT 账号运行视图</h2><p>先读取 codex-multi-auth 本地账号与额度缓存,再连接平台补充当前用户可用账号。页面永不接收 access token 或 refresh token。</p></div><div class="session-track"><div class="track-node live"><span>本地可用</span><strong>'+localCount+'</strong></div><div class="track-node"><span>汇总账号</span><strong>'+rows.length+'</strong></div><div class="track-node"><span>远程</span><strong>'+esc(chatgptRemote?.status||'WAITING')+'</strong></div></div></section><section class="sync-board"><article class="sync-stage"><div class="eyebrow">01 / Local pool</div><strong>'+(localReady?localCount+' 个本地可用账号':'正在读取本地账号')+'</strong><p>'+(localReady?'读取完成于 '+timeText(chatgptLocal.readAt):'优先读取 codex-multi-auth 安全摘要。')+'</p></article><div class="sync-link" aria-label="然后连接远程"></div><article class="sync-stage"><div class="eyebrow">02 / Platform service</div>'+remote.tag+'<strong>'+esc(remote.title)+'</strong><p>'+esc(remote.detail)+'</p></article></section>'+failure+'<section class="table-card"><header class="table-head"><div><h3>可用账号与剩余额度</h3><p>额度优先展示本地或服务器端更新较新的安全快照。</p></div><button class="button" data-action="chatgpt-refresh" '+(chatgptLoading?'disabled':'')+'>'+(chatgptLoading?'<span class="spin">↻</span> 同步中':'↻ 重新同步')+'</button></header>'+(rows.length?'<div class="account-table-wrap"><table class="account-table"><thead><tr><th>账号</th><th>可用状态</th><th>剩余 limit</th><th>凭据时效</th><th>同步状态</th></tr></thead><tbody>'+accountRows(rows)+'</tbody></table></div>':'<div class="empty-state'+(chatgptLoading?'':' account-request')+'">'+(chatgptLoading?'正在读取本地账号…':'<strong>需要申请 ChatGPT 账号</strong><span>'+esc(noAvailableAccountGuidance)+'</span>')+'</div>')+'</section></div>'}
47
47
  function configPage(){const c=state.config;return '<div class="content"><section class="grid"><article class="card full"><div class="eyebrow">Configuration file</div><h3>基础配置</h3><p>与 <code>numa config --set</code> 使用同一份配置和校验逻辑。</p><form id="config-form" class="form-grid"><div class="field"><label>界面语言</label><select name="locale"><option '+(c.locale==='zh-CN'?'selected':'')+'>zh-CN</option><option '+(c.locale==='en-US'?'selected':'')+'>en-US</option></select></div><div class="field"><label>默认输出</label><select name="output"><option '+(c.output==='text'?'selected':'')+'>text</option><option '+(c.output==='json'?'selected':'')+'>json</option></select></div><div class="field span-2"><label>平台 API 地址</label><input name="apiBaseUrl" value="'+esc(c.apiBaseUrl)+'" placeholder="https://platform.example/api"></div><div class="field span-2"><label>npm registry</label><input name="registryUrl" value="'+esc(c.registryUrl)+'"></div><label class="field span-2"><span>更新检查</span><select name="checkUpdates"><option value="true" '+(c.checkUpdates?'selected':'')+'>启用</option><option value="false" '+(!c.checkUpdates?'selected':'')+'>关闭</option></select></label><div class="actions span-2"><button class="button primary" type="submit">保存配置</button></div></form><div id="notice"></div></article></section></div>'}
48
48
  function commandsPage(){return '<div class="content"><section class="card full"><div class="command-toolbar"><div class="field grow"><label>过滤命令</label><input id="command-search" placeholder="例如 codex、media、auth"></div></div><div id="command-list" class="command-list">'+commandCards('')+'</div></section></div>'}
49
49
  function commandCards(query){const q=query.toLowerCase();return state.commands.filter((c)=>(c.command+' '+c.summary).toLowerCase().includes(q)).map((c)=>'<article class="command"><div class="command-head"><code>'+esc(c.command)+'</code><span class="tag '+esc(c.access)+'">'+esc(c.access)+'</span></div><p>'+esc(c.summary)+'</p><small>'+esc(c.examples[0]||'')+'</small><div class="actions mt-10"><button class="button" data-load="'+esc(JSON.stringify(commandPrefix(c.command)))+'">载入执行器</button></div></article>').join('')||'<p>没有匹配命令。</p>'}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@numa-tech/numa",
3
- "version": "1.11.11",
3
+ "version": "1.11.13",
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": [
@@ -26,7 +26,7 @@
26
26
  "clean": "node scripts/clean.mjs",
27
27
  "build": "npm run clean && tsc -p tsconfig.build.json",
28
28
  "typecheck": "tsc --noEmit",
29
- "test": "node --import tsx --test src/branding.test.ts src/app-config.test.ts src/identity.test.ts src/backend.test.ts src/oauth.test.ts src/web-console.test.ts src/chatgpt-console.test.ts src/cli-options.test.ts src/media/client.test.ts src/media/commands.test.ts src/media/transfers.test.ts src/codex-auth-agent.test.ts src/codex-legacy-cleanup.test.ts src/codex-process.test.ts src/codex-service-client.test.ts src/codex-shortcuts.test.ts src/codex-tui.test.ts src/codex-integration.test.ts scripts/publish-all.test.mjs",
29
+ "test": "node --import tsx --test src/branding.test.ts src/app-config.test.ts src/identity.test.ts src/backend.test.ts src/oauth.test.ts src/web-console.test.ts src/chatgpt-console.test.ts src/cli-options.test.ts src/media/client.test.ts src/media/commands.test.ts src/media/transfers.test.ts src/codex-auth-agent.test.ts src/codex-legacy-cleanup.test.ts src/codex-login.test.ts src/codex-process.test.ts src/codex-service-client.test.ts src/codex-shortcuts.test.ts src/codex-tui.test.ts src/codex-integration.test.ts scripts/publish-all.test.mjs",
30
30
  "check": "npm run typecheck && npm test",
31
31
  "start": "node dist/cli.js serve",
32
32
  "dev": "tsx src/cli.ts serve",