visionA/local-tool
jim800121chen f5655e38b1 feat(local-tool): hard timeout 5min + Stage 6 隱藏到 header + 全屏 splash
回應使用者三項需求:

1. 整體 hard timeout 180s → 300s(5 分鐘)
   每個 stage 已有 soft timeout 20s 提示機制,整體 budget 不需緊湊。
   5 分鐘是「使用者點完一杯咖啡都還沒好」的心理上限。pause 機制
   (Stage 1 seed / Stage 2 Python bootstrap / Stage 3 waitHealthy)
   仍維持作為「一次性 bootstrap 完全不算 budget」的快速通道。
   - 同步更新 i18n 紅 banner 文案 180 → 5 分鐘
   - 同步更新 unit tests(HardTimeout 用 -305s,SkipBypass 用 -320s,
     PreventsHardTimeout 註解 effective<300s)

2. Stage 6「等待 Web UI 連線」從 6 階段面板隱藏到 header 連線指示燈
   Go 端 pipeline 仍保持 6 階段(不動),前端 UI 只顯示 5 階段:
   - startup-panel.js: TOTAL_STAGES=5 顯示用,PIPELINE_STAGES=6 內部
     state 用。renderStages / paintProgressBar / 進度數字都用 5。
   - updateStage 仍會收 stage 6 events 更新內部 state(控 collapse 時機)
     但 stage 6 不 paint UI(n > TOTAL_STAGES early return)
   - 新增 onConnectionStatusChange listener 機制:stage 6 status 變化
     時通知外層
   - control-panel.js: setWebUIStatus 把連線狀態 (pending/running/
     completed/failed) 渲染到 header 的 meta-webui 指示燈:圓點顏色
     + 文字 (等待連線/已連線/未連線)
   - index.html: server-meta 新增 <dd id="meta-webui"> 指示燈位置
   - i18n: control.meta.webui / control.webui.{connected,waiting,disconnected}
   - style.css: .webui-status::before 圓點 + pulse 動畫 + 顏色對應
     state (pending=灰 / running=warning+pulse / connected=success / failed=destructive)
   - app.js: 註冊 onConnectionStatusChange listener,初始化呼叫
     setWebUIStatus('pending')

3. 全屏 spinner splash 取代「啟動中...」三個字
   原本 app 啟動最一開始的「啟動中」狀態只有 header 上三個字很不
   明顯,使用者體感像沒反應。改為 DOM ready 時就顯示 fullscreen
   spinner overlay,收到第一個 startup:progress event 才隱藏。
   - index.html: <div id="boot-splash"> 內含 logo + spinner-lg + 文字
   - style.css: .boot-splash position:fixed inset:0 z-index:1000,
     .boot-splash.hidden { display:none } 用 class 控制(避免和
     [hidden]!important 衝突)
   - app.js: hideBootSplash() helper,4 個 hide 觸發點:
     (a) 收到 startup:progress event
     (b) snapshot 補漏發現 pipeline 已啟動
     (c) 收到 startup:error event(即使失敗也要看到錯誤)
     (d) handleServerStatus 收到非 idle 狀態(restart wails app
         server 還活著的情境)

更新 fix marker 為「d946561+ (5min hard timeout + 5-stage UI + fullscreen splash)」

驗證:
- visiona-local 套件 go build / vet / test -race 全綠
- macOS dmg 163MB 重 build OK

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-16 01:23:55 +08:00
..

visionA-local

裝起來像一般 app離線也能跑接上 Kneron 就推論。edge-ai-platform 的 Kneron AI 邊緣推論能力,打包成單機桌面應用。

macOS x86_64 Windows x86_64 Linux x86_64 License


這是什麼

visionA-local 是 edge-ai-platform(原本要部署到 EC2 + Docker 的 Kneron 邊緣推論平台)的單機桌面衍生版本。為「帶著筆電做 Kneron demo 的人」而生 —— 主要服務 Innovedus 內部 FAE 與外部 Kneron 開發者。

三個核心承諾:

  • 🎒 零依賴Python runtime、KneronPLUS SDK、ffmpeg、預置 .nef 模型全部內嵌
  • ✈️ 零網路:下載一次後完全離線可用(適合客戶現場 IT 鎖得死緊的場景)
  • 🖱️ 零學習成本:雙擊安裝 → 開啟 → 插上 Kneron 裝置 30 秒內跑出第一幀推論

對標產品Docker Desktop、Ollama。


安裝(使用者)

macOSx86_64beta

  1. 從內部 Gitea Releases 下載 visiona-local.dmg
  2. 雙擊開啟 dmg → 把 visionA-local.app 拖到 Applications/
  3. 第一次啟動因為未做程式碼簽章Gatekeeper 會警告「來自未識別開發者」
    • 在 Finder 中右鍵點 visionA-local.app → 選「開啟」(不是雙擊)
    • 對話框出現「仍要開啟」時點確認
    • 往後直接雙擊即可
  4. 首次啟動會花 3060 秒解壓內嵌的 Python runtime 並離線安裝 wheels 這是預期行為,不是卡住。之後啟動只要幾秒

📁 資料目錄:~/Library/Application Support/visiona-local/ 包含 log、lock、ipc-port、自上傳模型

Windows / Linux

Coming soon — build script 已經寫好,等 CI runner 齊備後就會釋出。

  • WindowsInno Setup .exe installer
  • Linux.AppImage + udev rules需 root 裝 99-kneron.rules

系統需求

平台 最低版本 架構
macOS 14 Sonoma x86_64 ¹
Windows 10 1809 x86_64
Ubuntu 22.04 x86_64

¹ Apple Silicon 理論上可透過 Rosetta 2 執行,但未經測試

離線可用:安裝後所有核心功能(包含 Python sidecar、推論、模型管理、攝影機、影片解碼完全不需要網路。


功能總覽

有的功能

  • 裝置管理USB 自動偵測 Kneron KL520 / KL72010 秒內連線
  • 攝影機推論MJPEG 串流 + 即時 overlay首次延遲 ≤ 250ms穩定後 ≤ 150ms
  • 模型管理8 個預置 .nef 模型(分類 / 偵測 / 臉辨)+ 自上傳切換
  • 核心推論引擎image classification、object detection、face recognition
  • 媒體推論支援圖片與影片檔本機上傳R5 決策後不支援 URL 推論)
  • 中英雙語,跟隨系統 Dark Mode

不做的事(明確排除)

為了聚焦「個人工具」,以下功能從 edge-ai-platform 全數砍掉:

  • Cluster多裝置叢集
  • Relay / Tunnel遠端連線、反向代理
  • 韌體燒錄firmware flash
  • 系統列 Tray 常駐
  • Auto-update
  • Telemetry / 崩潰回報
  • License 啟用、憑證簽章
  • Mac App Store / Microsoft Store / Snap Store 上架

開發者區

專案結構

local-tool/
├── .autoflow/        PRD / 設計 / 架構 / 進度文件
├── server/           Go 1.26 後端Gin + go:embed
├── frontend/         Next.js 16 + React 19 + shadcn
├── visiona-local/    Wails 應用殼installer
├── payload/          打包暫存區
├── vendor/           第三方依賴make vendor-sync 下載,不進 git
├── dist/             最終安裝檔(.dmg / .exe / .AppImage
├── installer/        Inno Setup / AppImage script
├── scripts/          build 與維運腳本
└── Makefile

開發流程

# 1. 下載全部第三方依賴到 vendor/
make vendor-sync

# 2. 本機 build 並產出 dmgmacOS
make dmg

# 查看所有可用 targets
make help

主要 make targets

Target 作用
vendor-sync 下載 python-build-standalone、wheels、ffmpeg
build-server 編譯 Go server binary先 build frontend + embed
build-frontend pnpm build Next.js 靜態產物
payload-macos 準備 macOS payloadbinary + python + wheels + ffmpeg + 模型)
wails-macos Wails build + ad-hoc codesign
dmg 產出 dist/visiona-local.dmg
exe Windows installer需在 Windows runner 執行)
appimage Linux AppImage需在 Linux runner 執行)

三方平台 build

平台 指令 執行環境
macOS make dmg 本機Intel Mac
Windows make exe Windows runner + Inno Setup 6
Linux make appimage Ubuntu 22.04+ runner + appimagetool

vendor-*-windows / vendor-*-linux 可在 macOS 上跑通(只有 wails-* 和最後一步 installer 需要對應平台)。

文件位置

所有設計與架構文件在 .autoflow/

類型 路徑
產品需求PRD .autoflow/02-prd/PRD.md
設計規格 .autoflow/03-design/
架構設計 .autoflow/04-architecture/design-doc.md
TDD .autoflow/04-architecture/TDD.md
進度 .autoflow/progress.md

已知限制與 TODO

  • 🟡 Kneron 預置模型 re-distribution 授權:開發階段假設可用,正式發佈前需與 Kneron 官方確認
  • 🟡 Windows / Linux 安裝檔build script 就緒,等 CI runner 齊備
  • 🟡 Apple Silicon 未經測試(理論上 Rosetta 2 可跑)
  • 🟡 Linux Kneron USB vendor IDinstaller/linux/99-kneron.rules 需最終確認
  • 🟡 程式碼簽章Developer ID / EV cert不做,使用者需手動繞過 Gatekeeper / SmartScreen
  • 🟡 無 auto-update:新版需手動從 Gitea 下載

授權

License: TBD(內部工具 / MIT / proprietary 待定,發佈前確認)

第三方元件授權

元件 授權 備註
ffmpeg LGPL v3(方案 B 混合macOS 自 build decoder-only / Windows & Linux 用 BtbN n7.1 LGPL v2 TDD §2.2
KneronPLUS SDK Kneron 商用條款 再次確認 re-distribution 權利
python-build-standalone MPL 2.0 / PSFL
Python 標準函式庫 PSFL
shadcn/ui MIT
Next.js / React MIT
Wails MIT
Gin MIT

完整第三方授權清單於 .autoflow/02-prd/PRD.md §4.8。


致謝 / 起源

visionA-local 衍生自 Innovedus 內部專案 edge-ai-platform(原為部署於 EC2 + Docker 的多人共享平台)。本專案將其改造為單機桌面版本,聚焦「一個人帶一台筆電」的使用場景。

感謝 Kneron、python-build-standaloneastral-sh、shadcn 等開源社群。