t184:自更新蓋回「正在跑的那個 .app」——修 Oscar 更新完又跳回舊版
leo 08-04 實撞(Oscar 截圖):托盤顯示「🟢 新版 v0.15.6 已就緒」, 點下去重啟後**版本又是 v0.15.4**。同一套機制在 leo 機器正常。 真兇=`selfupdate.go` 寫死 `/Applications/Arcrun RAG.app`: · leo 有把 app 放進 /Applications ⇒ 剛好蓋對他正在跑的那份 ⇒ 一直正常 · Oscar 從下載資料夾直接跑 ⇒ 蓋到一個他沒在跑的路徑 · 而且 **ditto 會自動建出該目錄並回傳成功**(實測 exit 0,非報錯) ⇒ 畫面說「更新完成」、版本卻永遠是舊的=**靜默失敗** ⇒ 不是新舊 Mac 的差別,是 **app 放置位置**的差別(leo 機器實查證實)。 修法:改用 os.Executable() 往上推 .app(runningAppBundlePath), 更新**當前真的在跑的那份**——放哪都能更新,也不再無中生有 /Applications 副本。 找不到 .app 結構時誠實回錯,不猜路徑亂蓋(蓋錯比不更新更難查)。 ⚠️ 「檢查更新」這條路**保留且必須修好**——leo:「這是我解決每次都要撞 沒簽章問題的解法,不能說它無用」。本次是修它,不是繞過它。 測試:新增 t184_test.go(不得回傳寫死 /Applications/.app 推導對三種放置位置 /ditto 靜默建目錄的認知回歸);順手把 t182 的 TestAccountEngineLabel 改寫成 新判準(explicit 決定,非 config 殘留字串)。兩模組全綠。 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -486,33 +486,45 @@ func TestAddOrUpdateAccountPreservesMachineLayer(t *testing.T) {
|
||||
|
||||
// ── t126:每帳號獨立引擎設定 ──────────────────────────────────────────────────
|
||||
|
||||
// t126①:accountEngineLabel 依帳號或 defaultExtractor 顯示引擎名(帳號層優先)。
|
||||
// t126①→t182 改版:accountEngineLabel 的判準是 **explicit(使用者主動選過沒有)**,
|
||||
// 不是 config 裡殘留什麼字串。
|
||||
//
|
||||
// 為什麼改(leo 08-04 實撞):更新到 v0.15.5 後托盤**兩個帳號都還顯示 Gemini**,
|
||||
// 因為他 config 的帳號層留著 extractor="gemma"、而 explicit 沒設。
|
||||
// t178 只把 `claude` 這一個殘留值導向 Gemini,殘留 `gemma` 一樣脫鉤 ⇒ t182 改成通則:
|
||||
// **沒主動選過就一律念「雲端 AI」(空字串),與 direct.go 的預設邏輯同一條判準。**
|
||||
func TestAccountEngineLabel(t *testing.T) {
|
||||
cases := []struct {
|
||||
name string
|
||||
acc accountCfg
|
||||
defaultEx string
|
||||
explicit bool
|
||||
want string
|
||||
}{
|
||||
{"帳號有gemma", accountCfg{Extractor: "gemma"}, "", " · Gemini"},
|
||||
// t178(leo 08-04 實撞:朋友托盤顯示「oscar · Claude」但他根本沒有 Claude):
|
||||
// **claude 也顯示 Gemini**——因為 direct.go 早就把 claude 正規化成 gemma(t176)。
|
||||
// 標籤照 config 舊字串念會與實際行為不符:用戶看到 Claude、卻收到「Gemini 金鑰是空的」。
|
||||
// 這兩則若變回「· Claude」,代表標籤又和萃取實際走的路脫鉤了。
|
||||
{"帳號有claude→仍顯示 Gemini(實際就是走 gemma)", accountCfg{Extractor: "claude"}, "", " · Gemini"},
|
||||
{"帳號空退回default-gemma", accountCfg{}, "gemma", " · Gemini"},
|
||||
{"帳號空退回default-claude→仍顯示 Gemini", accountCfg{}, "claude", " · Gemini"},
|
||||
// t181:兩者皆空=新用戶=走 workers-ai(免金鑰預設)⇒ **不顯示標籤**
|
||||
// (leo 08-04:「上方如果用 workers AI 就不顯示」——預設路徑是常態,不佔版面)
|
||||
{"兩者皆空=預設雲端 AI=不顯示", accountCfg{}, "", ""},
|
||||
{"t181 明確 workers-ai 也不顯示", accountCfg{Extractor: "workers-ai"}, "", ""},
|
||||
{"帳號層優先於default", accountCfg{Extractor: "gemma"}, "claude", " · Gemini"},
|
||||
// ── 沒主動選過(explicit=false):不管殘留什麼,一律不顯示(=走 workers-ai)──
|
||||
// 這一組就是 leo 實撞的情境:config 殘留 gemma/claude,但他從沒去「AI 設定…」選過。
|
||||
{"殘留gemma但沒選過→不顯示", accountCfg{Extractor: "gemma"}, "", false, ""},
|
||||
{"殘留claude但沒選過→不顯示", accountCfg{Extractor: "claude"}, "", false, ""},
|
||||
{"default殘留gemma但沒選過→不顯示", accountCfg{}, "gemma", false, ""},
|
||||
{"兩者皆空=新用戶→不顯示", accountCfg{}, "", false, ""},
|
||||
|
||||
// ── 主動選過(explicit=true):照實顯示 ──
|
||||
// Gemini 是選配(leo:「客戶說他要用 Gemini,但現在變成選配」)⇒ 選了就要標出來。
|
||||
{"主動選gemma→顯示 Gemini", accountCfg{Extractor: "gemma"}, "", true, " · Gemini"},
|
||||
// t178 保留:claude 也念 Gemini——direct.go 早把 claude 正規化成 gemma(t176)。
|
||||
// 若這則變回「· Claude」,代表標籤又和萃取實際走的路脫鉤了。
|
||||
{"主動選過但殘留claude→仍顯示 Gemini", accountCfg{Extractor: "claude"}, "", true, " · Gemini"},
|
||||
{"帳號空退回default-gemma", accountCfg{}, "gemma", true, " · Gemini"},
|
||||
{"帳號層優先於default", accountCfg{Extractor: "gemma"}, "claude", true, " · Gemini"},
|
||||
// t181:明確選 workers-ai 也不顯示(leo:「用 workers AI 就不顯示」)
|
||||
{"主動選 workers-ai→不顯示", accountCfg{Extractor: "workers-ai"}, "", true, ""},
|
||||
}
|
||||
for _, c := range cases {
|
||||
t.Run(c.name, func(t *testing.T) {
|
||||
got := accountEngineLabel(c.acc, c.defaultEx)
|
||||
got := accountEngineLabel(c.acc, c.defaultEx, c.explicit)
|
||||
if got != c.want {
|
||||
t.Errorf("accountEngineLabel(%+v, %q) = %q, want %q", c.acc, c.defaultEx, got, c.want)
|
||||
t.Errorf("accountEngineLabel(%+v, %q, explicit=%v) = %q, want %q",
|
||||
c.acc, c.defaultEx, c.explicit, got, c.want)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user