t194:托盤收成 Google Drive 式(點 icon 開視窗/右鍵只有結束)+同綑 collector
leo 2026-08-05:「依照 google drive,托盤裡只剩下按右鍵會結束, 其他設定都在這個頁面,點擊托盤的 icon 就立刻展開界面」 ## 托盤 Wails v2 沒有內建托盤 ⇒ 用 energye/systray(Wails 相容分支,支援左鍵事件)。 - 左鍵:直接展開主視窗,**不彈選單** - 右鍵:只有一項「結束 Arcrun」 - 設定全部留在視窗裡,托盤不再是第二套 UI (fyne 版把設定塞下拉選單,leo 早說過「不可能統統塞在下拉選單」) - 關窗=隱藏不結束(daemon 常駐;按 × 就停止同步不符預期) - Dock 不出現 icon:Wails v2.13 的 mac.ActivationPolicy 還沒開放(原始碼是註解掉的) ⇒ 改走 Info.plist 的 LSUIElement,與 fyne 版同一個做法 ## 🔴 順手抓到自己的大漏:這個 App 根本沒有啟動 collector daemon 的**本體**是 `collector direct`(監看/萃卡/上傳),Wails 版我一路沒接 ⇒ 照這樣出貨會是「裝了也不會同步」的空殼。 修:新增 supervise.go,**複用既有 supervisor 套件**(重起退避/狀態機/ t191 的 phase:start/done ⇒「同步中…」),不複製一份(複製=會漂移)。 go.mod 用 replace 指回 collector 主模組。 加/刪資料夾、改 AI 設定後都會 restartWatch(),設定立刻生效。 ## 打包 新增 build-mac.sh:編 collector → wails build → **同綑進 .app** → ad-hoc 重簽。 沒同綑就等於沒有 daemon。 實測(v0.18.0):collector 同綑 15M ✅/LSUIElement=true ✅/版本注入 ✅/已簽 ✅ 兩支機械閘全過。 ⚠️ 未驗:托盤左右鍵的實際行為要真機點(我開不了視窗)。
This commit is contained in:
@@ -0,0 +1,56 @@
|
||||
package main
|
||||
|
||||
// supervise.go — 看守 collector 子行程(t194)
|
||||
//
|
||||
// 🔴 沒有這一段,這個 App 就只是個「會顯示設定的空殼」——
|
||||
// daemon 的本體是 `collector direct`,它才在監看資料夾、萃卡、上傳。
|
||||
// (寫 Wails 版時我一度漏了它,等於做出一個裝了也不會同步的東西。)
|
||||
//
|
||||
// 邊界:**複用既有的 supervisor 套件**(重起退避、狀態機、round 解析都在裡面,
|
||||
// 含 t191 的 phase:start/done ⇒ 「同步中…」)。這裡只做「找到執行檔、拉起來」。
|
||||
import (
|
||||
"os"
|
||||
"path/filepath"
|
||||
"runtime"
|
||||
|
||||
"arcrun-rag/collector/supervisor"
|
||||
)
|
||||
|
||||
var sup *supervisor.Supervisor
|
||||
|
||||
// collectorBinPath 找同綑的 collector 執行檔。
|
||||
// 規則與 arcrun-tray 一致:跟 App 執行檔同層(build 時會複製進 .app)。
|
||||
func collectorBinPath() string {
|
||||
name := "arcrun-collector"
|
||||
if runtime.GOOS == "windows" {
|
||||
name += ".exe"
|
||||
}
|
||||
exe, err := os.Executable()
|
||||
if err != nil {
|
||||
return name
|
||||
}
|
||||
if p, err := filepath.EvalSymlinks(exe); err == nil {
|
||||
exe = p
|
||||
}
|
||||
return filepath.Join(filepath.Dir(exe), name)
|
||||
}
|
||||
|
||||
// startSupervisor 在 App 啟動時拉起 collector;沒有 config 就先不啟動
|
||||
// (使用者還沒連知識庫,啟動只會一直失敗刷 log)。
|
||||
func startSupervisor() {
|
||||
sup = supervisor.New(collectorBinPath(), configPath())
|
||||
if _, err := os.Stat(configPath()); err == nil {
|
||||
sup.Start()
|
||||
}
|
||||
}
|
||||
|
||||
// restartWatch 在設定變更後重起看守,讓新設定立刻生效。
|
||||
func restartWatch() {
|
||||
if sup == nil {
|
||||
return
|
||||
}
|
||||
sup.Stop()
|
||||
if _, err := os.Stat(configPath()); err == nil {
|
||||
sup.Start()
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user