458ff3fd88
leo 08-06 用共用資料夾實測,兩張圖把最後一個病逼出來:
「第一次直接跑可以,**清空再來一次,就不跑了**」。
## 真兇:restartWatch 第一行就早退
全新使用者的順序是:
① 打開程式(**還沒有任何設定**)⇒ startSupervisor 早退,`sup` 是 nil
② 連上知識庫、加資料夾 ⇒ restartWatch
③ 舊版:`if sup == nil { return }` ⇒ **什麼都沒發生**
⇒ 引擎永遠不啟動,畫面叫人「請結束 Arcrun 再重新開啟」
「不算錯」(重開真的會好),但等於要求剛裝好的人自己想到去重開程式。
**每一個第一次用的人都會撞到**;開發機永遠有設定,所以永遠測不到。
修:`sup == nil` 時**現場建立**(設定剛出現,正是該啟動的時機)。
新測試 `TestFirstRunStartsEngineAfterConnect` 從「沒有設定」開始走完整順序;
反向驗證拿掉即紅。
## 順帶把那句沒用的話拿掉
「請結束 Arcrun 再重新開啟」=把系統的無能推給使用者。
改成「正在啟動同步引擎,請稍候…」;還沒連知識庫時說
「按『新增知識庫帳號』就會開始」。
## log 不再說謊(今天第三次同一個主題)
啟動訊息印 `cfg.triggerURL(...)`=用**根層**的 cypher_url/namespace 組的,
而多帳號設定根層是空的 ⇒ 印出 `→ /webhooks/named//rag_ingest/trigger`
(沒網域、雙斜線)**看起來像設定壞了,其實功能正常**。
改印每個帳號真正會用到的網址。
## 實測證據(共用資料夾自動收回來的 log,非截圖轉述)
19:13:54 設定檔缺必填欄位,已自動補上 manifest=C:\Users\leo21\.arcrun-rag\manifest.json
19:13:55 collector direct daemon 啟動:監看 …\win_on_mac_test_lib {"phase":"start"}
⇒ v0.18.13 的自我修復在真機生效,config 已補上 manifest,collector 真的跑起來。
56 lines
1.7 KiB
Go
56 lines
1.7 KiB
Go
package main
|
|
|
|
import (
|
|
"os"
|
|
"testing"
|
|
)
|
|
|
|
// TestFirstRunStartsEngineAfterConnect 釘住 leo 2026-08-06 實測的最後一個病:
|
|
//
|
|
// 「第一次直接跑可以,**清空再來一次,就不跑了**」
|
|
//
|
|
// 全新使用者的真實順序是:
|
|
//
|
|
// ① 打開程式(**這時還沒有任何設定**)⇒ startSupervisor 早退,sup 仍是 nil
|
|
// ② 連上知識庫、加資料夾 ⇒ 呼叫 restartWatch
|
|
// ③ 舊版的 restartWatch 第一行是 `if sup == nil { return }` ⇒ **什麼都沒發生**
|
|
// ⇒ 引擎永遠不啟動,畫面叫人「請結束 Arcrun 再重新開啟」
|
|
//
|
|
// 這條路只有「**先沒有設定、之後才有**」才會走到——
|
|
// 開發機永遠有設定,所以永遠測不到。這支測試刻意從「沒有設定」開始。
|
|
func TestFirstRunStartsEngineAfterConnect(t *testing.T) {
|
|
home := t.TempDir()
|
|
t.Setenv("HOME", home)
|
|
t.Setenv("USERPROFILE", home)
|
|
sup = nil
|
|
t.Cleanup(func() { stopSupervisor(); sup = nil })
|
|
|
|
// ① 打開程式:還沒有設定
|
|
startSupervisor()
|
|
if sup != nil {
|
|
t.Fatal("沒有設定時不該啟動引擎(會一直失敗刷 log)")
|
|
}
|
|
|
|
// ② 使用者連上知識庫、加資料夾(=寫出設定)
|
|
cfg := &directConfig{
|
|
Accounts: []accountCfg{{
|
|
CypherURL: "https://example.workers.dev",
|
|
Namespace: "abc123",
|
|
APIKey: "abc123",
|
|
}},
|
|
Extractor: "workers-ai",
|
|
}
|
|
if err := saveCfg(cfg); err != nil {
|
|
t.Fatalf("存檔失敗:%v", err)
|
|
}
|
|
if _, err := os.Stat(configPath()); err != nil {
|
|
t.Fatalf("設定沒寫出來:%v", err)
|
|
}
|
|
|
|
// ③ 這一步以前是死巷
|
|
restartWatch()
|
|
if sup == nil {
|
|
t.Fatal("設定出現後仍沒建立引擎 ⇒ 使用者得自己想到重開程式(leo 撞到的那個)")
|
|
}
|
|
}
|