local-tool/: visionA-local desktop app
- M1: Wails shell + Go server + Next.js UI + Mock mode (macOS dmg ready)
- M2: i18n (zh-TW/en) + Settings 4-tab refactor
- M3: Embedded Python 3.12 runtime (python-build-standalone) + KneronPLUS wheels
- M4: Windows Inno Setup script (build on Windows runner)
- M5: Linux AppImage script + udev rule (build on Linux runner)
- M6: ffmpeg (GPL, pending legal review) + yt-dlp bundled
- Lifecycle: watchServer health check, fatal native dialog,
Wails IPC raise endpoint, stale process cleanup
.autoflow/: full PRD / Design Spec / Architecture / Testing docs
(4 rounds tri-party discussion + cross review)
.github/workflows/: macOS / Windows / Linux build CI
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
151 lines
11 KiB
Markdown
151 lines
11 KiB
Markdown
# visionA-local — Design Doc(索引)
|
||
|
||
> 本檔案為設計文件總索引,各章節摘要 + 子檔連結。
|
||
> 專案:visionA-local(edge-ai-platform 的本地桌面版)
|
||
> Bundle ID:`com.innovedus.visiona-local`
|
||
> 作者:Architect Agent | 版本:1.0 | 日期:2026-04-11
|
||
|
||
---
|
||
|
||
## 0. 文件地圖
|
||
|
||
| 面向 | 檔案 |
|
||
|------|------|
|
||
| 架構總覽與程序模型 | [`architecture-overview.md`](./architecture-overview.md) |
|
||
| 依賴內嵌策略(Python / Kneron / ffmpeg / yt-dlp / 模型) | [`dependency-bundling.md`](./dependency-bundling.md) |
|
||
| 打包流程(mac dmg / win Inno Setup / linux AppImage) | [`packaging.md`](./packaging.md) |
|
||
| Build pipeline / Makefile / CI 骨架 | [`build-pipeline.md`](./build-pipeline.md) |
|
||
| 生命週期(port 衝突、single-instance;tray 已砍) | [`tray-and-lifecycle.md`](./tray-and-lifecycle.md) |
|
||
| 多語系(中英雙語) | [`i18n.md`](./i18n.md) |
|
||
| 風險與緩解(R1–R12) | [`risks-and-mitigations.md`](./risks-and-mitigations.md) |
|
||
| Plan B(R9 contingency,線上下載預置模型) | [`plan-b-online-download.md`](./plan-b-online-download.md) |
|
||
| 技術設計文件(索引) | [`TDD.md`](./TDD.md) |
|
||
|
||
TDD 底下還拆分:
|
||
- [`api-endpoints.md`](./api-endpoints.md) — 保留 / 刪除 / 新增的 API 清單
|
||
- [`code-reuse-plan.md`](./code-reuse-plan.md) — 從 edge-ai-platform 哪些檔案複製、改寫、新寫
|
||
- [`removed-code.md`](./removed-code.md) — 要砍掉的目錄 / 檔案 / import 清單
|
||
|
||
---
|
||
|
||
## 1. 產品定位(一段話)
|
||
|
||
visionA-local 是 `edge-ai-platform` 的**單機桌面版**,把原本需要 EC2 + Docker + nginx 的 web 工具改造為「雙擊即用」的 GUI 應用,目標體驗對標 Docker Desktop / Ollama。所有依賴(Python runtime、KneronPLUS SDK、ffmpeg、yt-dlp、預置 .nef 模型)**全部內嵌**在安裝檔中,使用者機器**完全不需要**預先安裝任何東西,且**完全離線**即可運作。支援 **macOS 14/15、Windows 10/11、Ubuntu 22.04/24.04**,僅 x86_64(Apple Silicon 用 Rosetta)。
|
||
|
||
---
|
||
|
||
## 2. 高層架構(一句話 + 圖)
|
||
|
||
**Wails 殼(Go + WebView)→ spawn → Go server 子行程(Gin + 內嵌 Next.js)→ spawn → Python sidecar(KneronPLUS bridge)**
|
||
|
||
```
|
||
┌──────────────────────────────────────────────────┐
|
||
│ visionA-local (Wails app — 使用者看到的殼) │
|
||
│ ├─ 首次執行:安裝精靈(解壓 payload → 建 venv) │
|
||
│ ├─ 一般模式:Dashboard(關閉視窗 = 結束程式) │
|
||
│ └─ 內嵌 WebView → http://127.0.0.1:3721/ │
|
||
│ │ │
|
||
│ spawn ▼ │
|
||
│ ┌────────────────────────────────────────┐ │
|
||
│ │ visiona-local-server (Go binary) │ │
|
||
│ │ - Gin HTTP + WebSocket │ │
|
||
│ │ - go:embed Next.js 靜態檔 │ │
|
||
│ │ - REST: /api/devices, /api/models, ... │ │
|
||
│ │ - WS: /ws/devices, /ws/server-logs │ │
|
||
│ │ │ │ │
|
||
│ │ spawn ▼ │ │
|
||
│ │ ┌─────────────────────────────────┐ │ │
|
||
│ │ │ python3 kneron_bridge.py │ │ │
|
||
│ │ │ - KneronPLUS SDK │ │ │
|
||
│ │ │ - 推論 / 裝置列舉 / 模型載入 │ │ │
|
||
│ │ └─────────────────────────────────┘ │ │
|
||
│ │ spawn (on demand) │ │
|
||
│ │ ┌─────────────────────────────────┐ │ │
|
||
│ │ │ ffmpeg / yt-dlp │ │ │
|
||
│ │ └─────────────────────────────────┘ │ │
|
||
│ └────────────────────────────────────────┘ │
|
||
└──────────────────────────────────────────────────┘
|
||
```
|
||
|
||
詳見 [`architecture-overview.md`](./architecture-overview.md)。
|
||
|
||
---
|
||
|
||
## 3. 最重要的 5 個架構決策(摘要)
|
||
|
||
| # | 決策 | 為什麼 |
|
||
|---|------|-------|
|
||
| **D1** | **三層程序模型**(Wails 殼 + Go server 子行程 + Python sidecar),**不**合併成 single binary | Go server 要長時間跑、UI 殼可獨立崩潰重啟;KneronPLUS 必須用真的 Python interpreter;`installer/app.go` 已驗證此模型可行(894 行成熟程式碼) |
|
||
| **D2** | **Python runtime 雙策略**:主策略 A = 內嵌 [python-build-standalone](https://github.com/astral-sh/python-build-standalone)(完全離線);備策略 B = 偵測系統 `python3` 作為 fallback / 開發模式 | 使用者決策:要完全離線,但要保留 fallback。A 確保第一次執行就能跑(符合「一鍵安裝」),B 用在 `--dev` 模式與 standalone runtime 壞掉時的救援 |
|
||
| **D3** | **完全放棄程式碼簽章**:macOS 用 ad-hoc sign、Windows 無 Authenticode、Linux AppImage 無簽章 | 使用者決定不買憑證,接受 Gatekeeper / SmartScreen 警告。但**必須**寫清楚首次啟動 workaround 文件(見 [`packaging.md`](./packaging.md) §6) |
|
||
| **D4** | **x86_64 only**,三平台都不做 ARM / Universal Binary | 使用者是 Intel Mac;目標受眾也是內部 FAE + 客戶 demo 機,多為 x86_64。Apple Silicon 走 Rosetta 2。這大幅簡化 build pipeline(不用 `lipo`、不用雙架構 wheel) |
|
||
| **D5** | **預置模型全部打包**(~73MB),**不做** auto-update、**不收** telemetry | 符合「完全離線、零踩坑」原則。auto-update 對內部工具不值得投入(見 R6),且每次升級都會放 SmartScreen 警告重新觸發 |
|
||
|
||
---
|
||
|
||
## 4. 程式碼來源策略(摘要)
|
||
|
||
新專案 `local_tool/` 從零建立,但可以自由從 `edge-ai-platform/` 取用程式碼:
|
||
|
||
- **直接複製(~60% 程式碼)**:`installer/`、`server/internal/{api,camera,config,deps,device,driver,inference,model}`、`server/scripts/kneron_bridge.py`、`server/data/`、`server/pkg/logger`
|
||
- **改寫(~20%)**:`server/main.go`(移除 cluster / tunnel / relay)、`server/internal/api/router.go`(刪 cluster routes)、`server/internal/config/config.go`(刪 relay / gitea flags)、`installer/app.go`(改名 + 加入 Python runtime 雙策略)、`frontend/`(刪 cluster / relay UI)
|
||
- **新寫(~20%)**:Python runtime 偵測與 fallback 邏輯、i18n 系統、新版 Makefile / build 腳本、Inno Setup 腳本、AppImage 腳本
|
||
- **刪除**:`server/internal/{cluster,tunnel,update}`、`server/cmd/relay-server`、`server/pkg/hwid`、`docker/`、`scripts/deploy-*.sh`、`server/scripts/firmware/` + `update_kl720_firmware.py`(flash 砍掉)
|
||
|
||
詳見 [`code-reuse-plan.md`](./code-reuse-plan.md) 與 [`removed-code.md`](./removed-code.md)。
|
||
|
||
---
|
||
|
||
## 5. 第一個 Milestone 範圍建議(M1:End-to-End Skeleton)
|
||
|
||
**目標:從零起一個可以在 macOS 跑通的最小可行版本。其他平台與功能後續 milestone 處理。**
|
||
|
||
| # | 任務 | 說明 | 預估大小 |
|
||
|---|------|------|---------|
|
||
| M1-1 | 建立 repo 骨架 | `local_tool/` 目錄結構 + go.mod + Makefile 骨架 | S |
|
||
| M1-2 | 複製 server core | 從 edge-ai-platform 複製 `server/internal/{api,camera,config,deps,device,model,inference}` + `pkg/logger` | S |
|
||
| M1-3 | 清理 main.go | 改寫 `server/main.go`:移除 cluster / tunnel / relay / hwid / GiteaURL | M |
|
||
| M1-4 | 清理 config.go | 砍 relay / tunnel / gitea / GUIMode 相關 flags | S |
|
||
| M1-5 | 清理 router.go | 刪除 `/api/clusters/*`、`/ws/clusters/*`、`/auth/token` | S |
|
||
| M1-6 | 複製 frontend | 複製 `frontend/` 進 local_tool | S |
|
||
| M1-7 | **清理前端 UI**(Q-C=C2) | **M1 必做**:刪除 `src/app/clusters/`、`src/app/workspace/cluster/`、`src/components/cluster/`、`relay-token-sync.tsx`、`lib/api/{clusters,tunnel,update}.ts`;修改 sidebar(移除 Clusters 導航項)、Dashboard(移除 cluster 卡片)、Settings(移除 relay / cluster 區塊);最終 `pnpm build` 通過且 UI 乾淨、沒有殘留的 cluster / relay / tunnel 入口 | M |
|
||
| M1-8 | Go server 本地 build | `make build` 產出 `visiona-local-server`(含 embedded Next.js),可直接 `./visiona-local-server` 跑起來 | S |
|
||
| M1-9 | 複製 installer shell | 從 `installer/` 複製 `app.go` + `main.go` + `embed.go` + platform_*.go,改名為 `visiona-local` | M |
|
||
| M1-10 | 改寫 installer | 移除 relay/dashboard 欄位、加入 Python runtime 雙策略的**空殼**(先走 B — 系統 Python) | M |
|
||
| M1-11 | payload 打包 | `make payload-macos`:把 `dist/visiona-local-server` + `data/` + `scripts/` 塞進 `visiona-local/payload/` | S |
|
||
| M1-12 | macOS installer build | `wails build` → `.app` → ad-hoc sign → 手動打包 dmg(dmgbuild) | M |
|
||
| M1-13 | End-to-end 驗證 | 全新 mac 上雙擊 .dmg → 裝起來 → Mock 模式看到 3 台假裝置跑推論,且 UI 完全沒有 cluster / relay / tunnel 入口 | M |
|
||
|
||
**M1 不做:** Python runtime 內嵌(策略 A)、Windows、Linux、打包最佳化、i18n、新 Logo、yt-dlp 內嵌。
|
||
**M1 必做(與前一版差異):** 前端清理已從 M2 提前到 M1(使用者決策 Q-C=C2),tray 整條從計畫中移除(使用者決策 Q-A=A3)。
|
||
|
||
**M1 產出物:** macOS x86_64 `.dmg`,可在全新機器上(只要系統有 python3)跑通 Mock 模式,且前端 UI 已清乾淨。
|
||
|
||
### 後續 milestone 建議(M2~M6 概覽)
|
||
|
||
- **M2**:i18n 中英切換 + Settings 分頁調整(前端 cluster / relay UI 清理已於 M1 完成;tray 已砍)
|
||
- **M3**:Python runtime 策略 A(內嵌 python-build-standalone)+ KneronPLUS wheel 離線安裝
|
||
- **M4**:Windows Inno Setup + WinUSB driver 安裝
|
||
- **M5**:Ubuntu AppImage + udev rules
|
||
- **M6**:ffmpeg / yt-dlp 內嵌 + 完整依賴離線化 + 打包最佳化
|
||
|
||
---
|
||
|
||
## 6. 與 PRD / 設計規格的對應
|
||
|
||
- PRD US-1(第一次安裝 < 3 分鐘)→ 見 [`packaging.md`](./packaging.md) §3(首次啟動解壓流程)
|
||
- PRD US-2(Mock 模式零門檻試玩)→ 已內建於 `deviceMgr` 的 `mockMode` flag,沿用
|
||
- PRD US-3(插 USB 裝置自動偵測)→ 見 [`dependency-bundling.md`](./dependency-bundling.md) §2(KneronPLUS wheel + driver)
|
||
- Design 生命週期(關閉視窗 = 結束、single-instance)→ 見 [`tray-and-lifecycle.md`](./tray-and-lifecycle.md)(lifecycle 章節)
|
||
- Design 中英雙語 → 見 [`i18n.md`](./i18n.md)
|
||
|
||
---
|
||
|
||
## 7. 審閱紀錄
|
||
|
||
| 日期 | 審閱者 | 結論 |
|
||
|------|-------|------|
|
||
| 2026-04-11 | PM Agent | 待審 |
|
||
| 2026-04-11 | Design Agent | 待審 |
|
||
| 2026-04-11 | 使用者 | 待確認 |
|