console-ui: 修好壞了一個月的 build + 具名部署目標(個人版/企業版)

🔴 根因:5a16484 把 UI 搬 CF Pages 時「移出 → console-ui/」實際上只搬了
build 產物(HTML),三支 renderer 原始檔被刪且沒搬 →
`npm run build` 從那天起 ENOENT 死掉,線上 HTML 是刪檔前烤好的,
一個月來無法重建(CONSOLE_PROFILE 改了也不會生效,因為 build 跑不起來)。

修法:
- 從 git 撈回 console.ts(1623)/portal-ui.ts(1390)/console-dashboard.ts(822)
  放進 console-ui/src/——UI 原始碼跟著 UI 專案走,才是那一刀的原意
- build.mjs 加 resolveSource():本地 src/ 優先,找不到才回退 cypher-executor

新增具名部署目標(deploy.targets.json + scripts/deploy.mjs):
一個目標=帳號+profile+apiBase 綁在一起,解決三次帶漏參數:
- demo 站漏 CONSOLE_PROFILE=rag → 顯示個人版 7 頁駕駛艙(leo「進去是 Mira 介面」的真因)
- 兩站漏 ARCRUN_API_BASE → apiBase 空 → 前端打自己 405 → 登不進去
- 兩帳號都有同名 arcrun-console-ui 專案且 wrangler OAuth 登入在 uncle6
  → 不指定帳號 deploy 會部到 demo 站(差點蓋掉,改用 API token 鎖帳號)

  npm run deploy:personal    → leo21c, profile=full(7頁), apiBase 指 leo21c worker
  npm run deploy:enterprise  → uncle6, profile=rag(4頁落地搜尋), apiBase 指 cypher.arcrun.dev

實測(用戶真的會走的路):
- mira.uncle6.me/console/ 200,VIEWS 7 頁,apiBase 對,CORS ACAO 通
- rag-demo.arcrun.dev 4 頁落地搜尋;登入 OK、搜「藍鯨導航儀」5 筆(未受部署影響)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
uncle6me-web
2026-07-22 19:09:29 +08:00
parent 5a164843ef
commit ad367e450d
12 changed files with 4011 additions and 25 deletions
+36 -5
View File
@@ -18,7 +18,7 @@
* 故注入 window.ARCRUN_API_BASE,並把 fetch 的相對路徑改成 API_BASE + path。
* 見下方 rewriteFetchPaths()。
*/
import { readFileSync, writeFileSync, mkdirSync } from 'node:fs';
import { readFileSync, writeFileSync, mkdirSync, existsSync } from 'node:fs';
import { dirname, join } from 'node:path';
import { fileURLToPath } from 'node:url';
@@ -30,13 +30,28 @@ const OUT = join(ROOT, 'public');
// ── 建置期組態(原本是 Worker 的 env var,現在是建置參數)────────────────
// Pages 是靜態站,沒有 per-request env;品牌/profile 這類「一個部署一個值」的
// 設定改在建置時決定(要換值=重跑 build 再部署,符合靜態站模型)。
// 具名部署目標(deploy.targets.json):一個目標=帳號+profileapiBase 綁在一起。
// 帶 DEPLOY_TARGET=personal|enterprise 就套用該組值;個別環境變數仍可覆蓋(除錯用)。
// 立此檔的原因見 deploy.targets.json 的 _readme——散在部署指令裡的參數帶漏過三次。
const TARGET_NAME = process.env.DEPLOY_TARGET || '';
let TARGET = {};
if (TARGET_NAME) {
const targets = JSON.parse(readFileSync(join(ROOT, 'deploy.targets.json'), 'utf8'));
TARGET = targets[TARGET_NAME];
if (!TARGET) {
const names = Object.keys(targets).filter((k) => !k.startsWith('_'));
throw new Error(`未知的 DEPLOY_TARGET"${TARGET_NAME}"。可用:${names.join(' / ')}`);
}
console.log(`部署目標:${TARGET_NAME}${TARGET.description}`);
}
const CFG = {
brand: process.env.CONSOLE_BRAND || 'Arcrun',
profile: process.env.CONSOLE_PROFILE || 'full',
brand: process.env.CONSOLE_BRAND || TARGET.brand || 'Arcrun',
profile: process.env.CONSOLE_PROFILE || TARGET.profile || 'full',
registryBase: process.env.REGISTRY_BASE || 'https://registry.arcrun.dev',
sourceWebBase: process.env.PORTAL_SOURCE_WEB_BASE || '',
// API base 走 runtime 注入(見 public/config.js),這裡只放預設值
apiBase: process.env.ARCRUN_API_BASE || '',
apiBase: process.env.ARCRUN_API_BASE || TARGET.apiBase || '',
};
/**
@@ -46,8 +61,24 @@ const CFG = {
* (如 console.ts 的 rag/views/home 由 profile 推導)。只搬模板=把那段推導邏輯
* 複製一份到本檔=雙份真相會漂移。連 body 一起求值 → 推導邏輯永遠只有一份。
*/
/**
* renderer 原始檔的位置:本專案 `console-ui/src/` 優先,找不到才回退 cypher-executor。
*
* 為什麼要這層(2026-07-22 修):`5a16484` 把 UI 搬出 cypher-executor 時,
* **刪了 console.ts / portal-ui.ts 卻只搬走 build 產物(HTML),原始檔沒跟著搬**
* → build.mjs 讀不到來源,`npm run build` 從那天起就 ENOENT 死掉,
* 線上 HTML 是刪檔前烤好的、之後再也無法重建(profile 改了也不會生效)。
* 現已從 git 撈回放進 console-ui/src/——UI 原始碼跟著 UI 專案走,才是那一刀的原意。
* console-dashboard.ts 仍在 cypher-executor(它同時含 API),故保留回退路徑。
*/
function resolveSource(file) {
const local = join(ROOT, 'src', file.replace(/^routes\//, ''));
if (existsSync(local)) return local;
return join(SRC, file);
}
function extractRendererBody(file, fnName) {
const code = readFileSync(join(SRC, file), 'utf8');
const code = readFileSync(resolveSource(file), 'utf8');
const start = code.indexOf(`function ${fnName}(`);
if (start < 0) throw new Error(`找不到 ${fnName} in ${file}`);
const braceStart = code.indexOf('{', code.indexOf(')', start));