fix(arcrun-rag#59): 額度卡與雲端連線兩則假訊息改口

leo21c 畫面同時說「今天已經幫你整理了 0 份」與「額度用完,可以換一個模型,
或升級 Cloudflare」——一份都沒成功,額度其實是被同帳號正在做的向量化
(嵌入固定走 Workers AI,與萃取共用同一份每日免費額度)吃光的,換萃取模型
救不了。改法:buildQuotaNotice 在 dailyCount==0(本輪一份都沒吃到額度就先
撞牆)時換一套出口/保證句——不再建議換模型、不再無條件承諾「明天會自動
接著跑」,只留「升級 Cloudflare」這個結構上真的有效的出口;dailyCount>0
(單純量大用完)維持原三句話不動。

同批修另一則真因已被頂層 wiki 鎖定的假訊息:leo 三個帳號 /health 全部 200,
畫面卻顯示「沒連上雲端」——direct.go 寫 status.json 頂層 cloud_check_ok 時
以前只有剛好一個帳號才會填,2+ 帳號(leo 的常態)時恆為 Go 零值 false。
改成不論帳號數,任一帳號連得上就標頂層為 true。

兩者都有回歸測試:對修改前的程式碼跑會 FAIL(多帳號 CloudCheckOK 案例已
用 git stash 實測驗證),修完後 PASS。額度卡文案另外用真正的 frontend/dist
+ 假 window.go 灌 leo21c 現場資料,Claude Browser 實際開起來看過,確認新
文案正確渲染、不再出現「可以換一個模型」、console 無紅字。

未做:兩者都只在原始碼層修好,尚未重打 daemon bundle 出貨(0.18.25 用戶
手上還看不到);頂層 cloud_check_ok 的實際消費端(除已知的舊版 tray)未
完全追出,留給下一輪核實。詳見 system-dev/docs/3-specs/daemon-beta/tasks.md
t216/t217。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-11 12:28:49 +08:00
parent 3862a1a877
commit 4cbc7ebe11
6 changed files with 209 additions and 18 deletions
+25 -6
View File
@@ -792,12 +792,31 @@ func RunDirectOnce(cfg *DirectConfig, dryRun bool) ([]DirectResult, int, *Trigge
if len(st.Failures) > MaxSkippedListed {
st.Failures = st.Failures[:MaxSkippedListed]
}
// 單帳號時把 cloud version 也填頂層(向後相容)
if len(accountDetails) == 1 {
for _, v := range accountDetails {
st.CloudVersion = v.CloudVersion
st.CloudCheckOK = v.CloudCheckOK
break
// 頂層 cloud versioncloud_check_ok 給「只認得到一份版本號」的舊消費端
// (向後相容;t103 時代單帳號才有這兩個頂層欄位)。
//
// 🔴 arcrun-rag#59 相關實查(2026-08-10,總管/leo 對照 curl,三台 /health 全部 200
// 詳見頂層 wiki `system-dev/wiki/status.md`「畫面在說謊」段):以前這裡**只有剛好
// 一個帳號**才填,2+ 帳號(leo 自己的常態)時 `st.CloudCheckOK` 停在 Go 零值
// `false` 沒人填過 ⇒ 讀這個頂層欄位的地方會看到「沒連上雲端」,**即使每一個
// 帳號都連得上**。改成:不論帳號數,只要**任一**帳號連得上就算連得上;
// `CloudVersion` 取第一個非空版本代表(按 key 排序,同一份輸入永遠同一個輸出),
// 不是宣稱所有帳號版本一致——**多帳號時真正該看的是各帳號自己的
// AccountDetails,這裡只是不讓頂層欄位繼續說反話**。
if len(accountDetails) > 0 {
hosts := make([]string, 0, len(accountDetails))
for h := range accountDetails {
hosts = append(hosts, h)
}
sort.Strings(hosts)
for _, h := range hosts {
v := accountDetails[h]
if v.CloudCheckOK {
st.CloudCheckOK = true
}
if st.CloudVersion == "" && v.CloudVersion != "" {
st.CloudVersion = v.CloudVersion
}
}
}
// 🔴 2026-08-05(leo:「自始至終都顯示『等待中』…實際上已經做完了,這個 status 是壞的」):