diff --git a/console-ui/public/portal/index.html b/console-ui/public/portal/index.html index fa5f21c..c47c0e1 100644 --- a/console-ui/public/portal/index.html +++ b/console-ui/public/portal/index.html @@ -667,13 +667,70 @@ function taipeiMonthDay(ms) { var d = new Date(ms + TAIPEI_OFFSET_MS); return { }) .catch(function (e) { $('login-submit').disabled = false; $('login-status').textContent = friendlyErr(e); }); } + // t72 OS 分流(2026-07-27,leo:「客戶是用 windows 的」)——在此之前四處寫死「下載 Mac 版」, + // Windows 客戶按下去會拿到 Mac 的 .app=按了連到錯的東西(leo 判準:那不算友善)。 + // 判不出 OS 時**兩個都給**,不替用戶猜;且無論判成哪個,頁面都留「不是這個系統?」的另一版連結 + // ——UA 會判錯,判錯時用戶要有路可走(施工圖 §3 注意事項 1、3)。 + var DAEMON_BASE_DEFAULT = 'https://raw.githubusercontent.com/youlinhsieh/arcrun-rag-bundles/main/daemon/'; + var DAEMON_MAC = 'ArcrunRAG-mac-unsigned.zip'; + var DAEMON_WIN = 'ArcrunRAG-win-unsigned.zip'; + // Mac 那顆 21MB > jsDelivr 單檔 20MB 上限(實測回 "File size exceeded...")→ 一律走 raw; + // Windows 13MB 雖在限內,同走 raw 保持單一來源、少一個會壞的地方。 + function daemonBase() { + var cfg = (window.ARCRUN_CONFIG || {}); + if (cfg.daemonBase) return String(cfg.daemonBase).replace(/\/?$/, '/'); + // 舊 key 相容(施工圖 §3 注意事項 2):daemonDownload 是「單一檔案網址」, + // 有設就尊重它當 Mac 版網址,並由它推出目錄給 Windows 版用。 + if (cfg.daemonDownload) { + var s = String(cfg.daemonDownload); + return s.slice(0, s.lastIndexOf('/') + 1) || DAEMON_BASE_DEFAULT; + } + return DAEMON_BASE_DEFAULT; + } + function daemonPick() { + var base = daemonBase(); + var ua = navigator.userAgent || ''; + // 手機/平板先排除:iOS 的 UA 含 "Mac OS X",不排除會把 iPhone 判成 Mac, + // 讓手機用戶下載一個裝不起來的桌面 app(測到才發現,2026-07-27)。 + // 手機=判不出桌面 OS → 落到「兩個都給」,用戶回桌機再選。 + var isMobile = /iPhone|iPad|iPod|Android|Mobile/i.test(ua); + var isWin = !isMobile && /Windows NT/i.test(ua); + var isMac = !isMobile && /Macintosh|Mac OS X/i.test(ua) && !/Windows/i.test(ua); + var mac = { os: 'mac', label: '下載 Mac 版', url: base + DAEMON_MAC }; + var win = { os: 'win', label: '下載 Windows 版', url: base + DAEMON_WIN }; + if (isWin) return { pick: win, other: mac, sure: true }; + if (isMac) return { pick: mac, other: win, sure: true }; + return { pick: null, other: null, sure: false, mac: mac, win: win }; + } + // 封測期第一次開啟的擋關提示(未簽章)——Mac/Windows 攔法不同,話術也不同。 + function daemonHint(os) { + if (os === 'win') return '(封測版未簽章,Windows 第一次會跳藍色視窗擋下來——點「更多資訊」→「仍要執行」就好)'; + return '(封測版未簽章,第一次請右鍵→打開)'; + } // 07-27:設定頁的常駐入口(下載小幫手/換 AI 金鑰)——與一次性卡片同一組 API (function () { var dl = $('st-daemon-dl'); if (dl) { - var u = (window.ARCRUN_CONFIG && window.ARCRUN_CONFIG.daemonDownload) - || 'https://raw.githubusercontent.com/youlinhsieh/arcrun-rag-bundles/main/daemon/ArcrunRAG-mac-unsigned.zip'; - dl.setAttribute('href', u); + var d = daemonPick(); + if (d.sure) { + dl.setAttribute('href', d.pick.url); + dl.textContent = d.pick.label; + // 判對了也要留另一版的路(UA 會判錯) + var alt = document.createElement('span'); + alt.className = 'muted'; + alt.style.cssText = 'font-size:12.5px;margin-left:8px'; + alt.innerHTML = '不是這個系統?' + d.other.label + ''; + if (dl.parentNode) dl.parentNode.insertBefore(alt, dl.nextSibling); + } else { + // 判不出來=兩個都給,不預設 Mac + dl.setAttribute('href', d.mac.url); + dl.textContent = d.mac.label; + var both = document.createElement('span'); + both.className = 'muted'; + both.style.cssText = 'font-size:12.5px;margin-left:8px'; + both.innerHTML = '或 ' + d.win.label + ''; + if (dl.parentNode) dl.parentNode.insertBefore(both, dl.nextSibling); + } } var kb = $('st-key-save'); if (kb) kb.addEventListener('click', function () { @@ -719,7 +776,8 @@ function taipeiMonthDay(ms) { var d = new Date(ms + TAIPEI_OFFSET_MS); return { var s = setupSteps(); if (s.daemon && s.key) return; // t54 起只剩兩件:設定改由小幫手輸入帳密自取,不再下載檔案 var cfg = window.ARCRUN_CONFIG || {}; - var daemonUrl = cfg.daemonDownload || 'https://raw.githubusercontent.com/youlinhsieh/arcrun-rag-bundles/main/daemon/ArcrunRAG-mac-unsigned.zip'; + var dpick = daemonPick(); // t72 OS 分流(同一組判定,見上面 daemonPick) + var daemonUrl = dpick.sure ? dpick.pick.url : dpick.mac.url; var row = function (done, id, html) { return '