visionA/local-agent/docs/BUILD-VERIFICATION.md
jim800121chen 3f0175f1a9 feat(local-agent): Phase 0.5 visionA Agent — Wails 桌面 + tunnel client + 配對 UI
從 local-tool 複製出獨立的「visionA Agent」桌面應用(A3 純橋樑:
tunnel client + 配對 UI + 設定,不開 HTTP port、不做本機裝置/推論 UI)。
Bundle ID 與 local-tool 不同(com.innovedus.visiona-agent vs visiona-local),
雙 app 可共存。fork 後不主動 sync,需要時手動 cherry-pick。

Backend / Wails Go(AB1-AB13):
- internal/tunnel:6 狀態機(Idle/Connecting/Connected/Reconnecting/Failed/Stopped)
  + Pair/Unpair/Reconnect/Disconnect binding + ClientHooks event
- internal/auth:encrypted file token store(AES-GCM + scrypt + machineID
  fallback salt + 13 tests)
- internal/config:YAML validation + atomic write + 11 tests
- internal/log:ring buffer + ExportLog 升級 zip
- visionA-backend /api/pairing/exchange:SessionTokenStore + 17 new tests
- 三平台 build 驗證(macOS DMG 160 MB / Windows EXE / Linux AppImage)
- end-to-end 5 milestone 全綠(pairing → tunnel → forward → reuse 防護
  → tunnel drop failover)

Frontend / Next.js(AF1-AF7,沿用 visionA-frontend 基礎):
- AppShell + Header + TabNav(StatusView / PairView / SettingsView 三 tab)
- ConnectionStatusBadge 5 種狀態
- TokenInput regex 驗證 + 7 種錯誤 + 0.5s auto-switch 到狀態頁
- 設定頁 4 區塊(含重新配對 AlertDialog)
- agent-api.ts 封裝 Wails bindings(mock/real 雙實作)+ 90 tests

Phase 0.7 review-driven fix(Round 2):
- A1 Session fixation 防護(RotateSessionID)
- A3 mock pairing 預設改 false(必須明確 opt-in)+ startup log
- A4 Pair 失敗後 state 清理矩陣(exchange/Save/Start fail 各自終態)
- A5 Pair/Unpair/Reconnect lifecycleMu + 50 goroutine race test
- F1 重新配對次按鈕 / F2 PairView Esc cancel / F3 Wails BrowserOpenURL
  / F4 Settings draft 持久 + 未儲存 badge

驗證:agent backend go test -race -count=3 ./... 4 packages 全綠 /
agent frontend pnpm test 119 tests 全綠

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-01 11:22:01 +08:00

8.2 KiB
Raw Blame History

visionA Agent — Build Pipeline 驗證報告

AB12 產出。驗證三平台 build pipeline 設定是否正確,以及 macOS 實際 build 結果。 最後驗證日期2026-04-22jimchen 的 macOS 13 開發機)

三平台預期輸出

平台 產出路徑 格式 參考大小 備註
macOS dist/visiona-agent.dmg zlib-compressed UDZO DMG ~160 MB x86_64 IntelLSMinimumSystemVersion 10.13
Windows dist/visiona-agent-<ver>-windows-x64.exe Inno Setup self-extracting EXE ~180 MB MinVersion 10.0.17763Win10 1809+
Linux dist/visiona-agent-<ver>-linux-x64.AppImage AppImageFUSE 可執行) ~180 MB glibc 2.35+Ubuntu 22.04 build

環境需求

共通

  • Go 1.26+
  • Node 22.x + pnpm 9或 10
  • Wails CLI v2.12+go install github.com/wailsapp/wails/v2/cmd/wails@latest
  • curl

macOS 專屬

  • Xcode Command Line Toolsclang、codesign
  • brew install create-dmg(美化 DMG未裝則 fallback 到 plain hdiutil DMG
  • (只有升級 ffmpeg 時)brew install pkg-config nasm

Windows 專屬(只在 Windows runner 上跑)

  • Inno Setup 6+choco install innosetup
  • Git Bash / MSYS用 bash 跑 Makefile
  • 真實 Python非 WindowsApps stub— 給 pip download 公開 wheels 用

Linux 專屬(只在 Linux runner 上跑)

  • libgtk-3-dev libwebkit2gtk-4.1-dev libusb-1.0-0-dev
  • fuse libfuse2AppImage 執行需要)
  • desktop-file-utils
  • appimagetool(從 AppImage releases 下載)

已驗證項目

項目 狀態 驗證方式
macOS DMG 本機 build 通過 本地 make dmg 跑過160 MB zlib UDZOhdiutil attach OK
macOS Info.plist Bundle ID 通過 com.innovedus.visiona-agent(與 local-tool 不衝突)
macOS App 內嵌 payload 完整 通過 Contents/Resources/ 下 bin / data / scripts / python / wheels 齊備
macOS App ad-hoc codesign 通過 codesign --verify 通過
Windows .iss 語法 + 路徑 審閱通過 檔案存在,visiona-local 字串已清除AppId GUID 固定
Linux build-appimage.sh 審閱通過 腳本存在,visiona-local 字串已清除
CI workflow build.yml 審閱通過 三 jobmacos-13 / windows-2022 / ubuntu-22.04)設定齊備
CI workflow cache key 通過 使用 visiona-agent 路徑與 artifact 名稱
Windows 實 build 待 CI macOS 無法交叉 build WebView2 + iscc依賴 .github/workflows/build.yml Windows runner
Linux 實 build 待 CI macOS 無法 build webkit2gtk + appimagetool依賴 .github/workflows/build.yml Linux runner
三平台安裝到乾淨環境 待人工 需要乾淨 macOS / Windows / Linux VM 或實機

與 local-tool 共存對照表

兩個工具可同時安裝在同一台機器上,互不干擾。

項目 local-tool visionA Agent 結論
App Bundle IdentifiermacOS com.innovedus.visiona-local com.innovedus.visiona-agent 不衝突
App Bundle NamemacOS visionA-local visionA Agent 不衝突
App 安裝位置macOS /Applications/visiona-local.app /Applications/visiona-agent.app 不衝突
App 安裝位置Windows Program Files\visiona-local Program Files\visiona-agentDefaultDirName={autopf}\visiona-agent 不衝突
Inno Setup AppId GUIDWindows local-tool 自己的 {8671343F-815C-4AA5-891F-1C453CE14E82} 不同 GUID
Data dirmacOS ~/Library/Application Support/visiona-local ~/Library/Application Support/visiona-agentplatform_darwin.go + appName="visiona-agent" 不衝突
Data dirLinux ~/.local/share/visiona-local ~/.local/share/visiona-agent 不衝突
Single-instance lock 檔名 visiona-local.lock visiona-agent.lockapp.go:1580 不衝突
IPC port sentinel 檔名 visiona-local.ipc-port visiona-agent.ipc-portapp.go:1539 不衝突
對外網路 port 3721HTTP UI server 只 bind 127.0.0.1:random 無衝突
Tray icon 狀態列圖示 獨立 獨立 可同時常駐

macOS 雙安裝測試:本機已有 /Applications/visiona-local.appBundle ID com.innovedus.visiona-local),本次 build 的 DMG 掛載後顯示 visiona-agent.appBundle ID com.innovedus.visiona-agentLaunchServices 視為不同應用,可並存。

遇到的問題與處理

1. Wails build 因 visiona-agent/frontend 缺 package.json 而失敗

症狀:首次跑 make wails-macosWails 偵測 assetdir: ./frontend 後自動執行 frontend:install,在 visiona-agent/frontend/pnpm install,但該目錄只放 //go:embed 用的靜態產物,沒有 package.json,報錯:

ERR_PNPM_NO_IMPORTER_MANIFEST_FOUND  No package.json... was found in "visiona-agent/frontend".

修復Makefilewails-macos / wails-windows / wails-linux 三個 target 的 wails build 命令都加 -sSkip Frontend。理由前端產物已由 wails-sync-frontend target 從 frontend/out/ 同步過來Wails 不需要自己再跑 pnpm。

2. 殘留 visiona-local / visionA-local 字串

找到 3 處,已全部修正:

檔案 行數 原字串 修正後
installer/linux/99-kneron.rules 1 # Kneron USB devices — visionA-local # Kneron USB devices — visionA Agent
installer/macos/make-dmg-background.py 49 title = "Drag visionA-local to Applications" title = "Drag visionA Agent to Applications"
.github/workflows/release.yml 55 name: visionA-local ${{ github.ref_name }} name: visionA Agent ${{ github.ref_name }}

installer/windows/visiona-agent.iss:117edge-ai-platform 字串是註解(「未來若要偵測舊版 edge-ai-platform...」),保留。

3. go.mod Wails 版本警告(非致命)

Wails CLI 提示:

Warning: go.mod is using Wails '2.11.0' but the CLI is 'v2.12.0'.

Build 本身不受影響。可未來升級(wails build -u 或手動改 go.modAB12 不處理。

Makefile 變更摘要AB12

Target 變更
wails-macos wails build-s並加註解說明為何frontend 靜態產物由 wails-sync-frontend 處理)
wails-windows 同上
wails-linux 同上(兩個分支都加)

完整 build 流程macOS 本機)

# 一次性安裝
brew install create-dmg
go install github.com/wailsapp/wails/v2/cmd/wails@latest
export PATH="$HOME/go/bin:$PATH"

# vendor第一次約 5-10 分鐘,之後吃 cache
make vendor-sync

# build pipeline
make build-frontend          # → frontend/out/ (~1 MB)
make build-server            # → dist/visiona-agent-server (~31 MB)
make payload-macos           # → payload/darwin/ (~203 MB)
make wails-macos             # → visiona-agent/build/bin/visiona-agent.app (~216 MB)
make dmg                     # → dist/visiona-agent.dmg (~160 MB)

# 或一步到位
make clean-build-dmg

下一步建議

  1. 推到 GitHub 觸發 CI.github/workflows/build.yml 會在 Windows 與 Linux runner 上完整 build驗證 pipeline 在另兩個平台也能跑通。
  2. 乾淨環境安裝測試
    • macOS下載 dist/visiona-agent.dmg,在沒裝過 visionA Agent 的 Mac 上 drag-to-Applications首次啟動確認 tray icon 出現、Pair 流程可用。
    • WindowsCI 產出的 .exe 在 Win10/11 乾淨 VM 上跑,確認 Inno Setup 安裝流程、WinUSB driver 首次啟動提權。
    • LinuxCI 產出的 .AppImage 在 Ubuntu 22.04 上 chmod +x && ./visiona-agent-*.AppImage,確認 udev rule 提示可用。
  3. Code signing / notarizationPhase 2暫不做
    • macOSDeveloper ID + notarize否則使用者首次打開要在設定 > 安全性手動允許)
    • WindowsEV Code Signing 憑證(避免 SmartScreen 警告)
  4. 安裝與 local-tool 同機共存驗證:在已安裝 local-tool 的機器上安裝 Agent確認兩個 tray icon 同時出現、兩套 data dir 獨立、兩個 server 可同時運作。