jim800121chen c54f16fca0 Initial commit: visionA monorepo with local-tool subproject
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>
2026-04-11 22:10:38 +08:00

13 KiB
Raw Permalink Blame History

4. 功能清單與 API 對照(對照原 edge-ai-platform

本章節列出 visionA-local 相對於原 edge-ai-platform 的功能取捨。所有 / / ⚠️ 決定都已依使用者 Q1-Q15 與三方第一輪分析定案。

4.1 後端 API 對照表

API 群組 Endpoint 去留 說明
系統 / 健康 GET /api/system/health 保留 基本健康檢查
GET /api/system/info 保留 顯示版本、平台、執行目錄
GET /api/system/metrics 保留(簡化) local 版可省略 prometheus 整合,回傳簡單 JSON
GET /api/system/deps 保留 顯示依賴狀態Python / ffmpeg / KneronPLUS
GET /api/system/update-check Q6 決定不做 auto-update
POST /api/system/restart 保留 Settings 頁「重啟服務」按鈕會用到(原 Tray 用途已取消)
模型管理 GET /api/models 保留 列出所有模型
GET /api/models/:id 保留
POST /api/models/upload 保留 支援拖放上傳
DELETE /api/models/:id 保留
GET /api/models/:id/download 保留
裝置管理 GET /api/devices 保留
POST /api/devices/scan 保留 USB 掃描
POST /api/devices/:id/connect 保留
POST /api/devices/:id/disconnect 保留
POST /api/devices/:id/flash Q9 決定砍掉韌體燒錄
POST /api/devices/:id/inference/start 保留
POST /api/devices/:id/inference/stop 保留
攝影機 GET /api/camera 保留 列出 webcam
POST /api/camera/:id/start 保留
POST /api/camera/:id/stop 保留
GET /api/camera/:id/stream 保留 MJPEG 串流
媒體上傳 POST /api/media/upload/image 保留
POST /api/media/upload/video 保留
POST /api/media/upload/batch 保留
POST /api/media/url 保留 Q10 決定保留(打包 yt-dlp
Cluster /api/clusters/*(全部 endpoint 全砍
WebSocket /ws/clusters/*
/ws/devices/* 保留 裝置狀態即時推送
/ws/server-logs 保留 Server log 顯示(供進階 / 設定頁使用,非 tray
認證 / Relay POST /auth/token relay tokenlocalhost 不需要
relay / tunnel 中介層

4.2 前端頁面對照表

對照 frontend/src/app/

路由 去留 說明
/Dashboard 保留(重新設計) 拿掉 cluster 統計,首頁改為「快速開始 + 裝置狀態 + 最近活動」
/devices 保留 裝置列表 + connect / disconnect
/models 保留 模型庫
/workspace/workspace/[deviceId] 保留(升為 sidebar 一級 核心頁面:單裝置推論工作區。第三輪 Q-E2 決策Workspace 從「進入 Device 後的子頁」升級為 sidebar 一級入口,讓使用者不需要先挑裝置就能進工作區(內部可顯示「請先連線裝置」狀態)
/workspace/cluster
/clusters
/settings 保留(重新設計) 清掉 relay / cluster 設定。第三輪 Q-E3 決策:取消「外觀」分頁(深色模式跟隨系統不需獨立分頁)、將「語言」併入「一般」分頁。最終分頁結構:一般(含語言)/ 硬體 / 模型 / 進階,共 4 個分頁

4.3 元件對照表

對照 frontend/src/components/

分類 元件 去留
camera/ camera-feed, camera-controls, camera-overlay, source-selector, camera-inference-view, batch-image-thumbnails 全保留
devices/ device-card, device-list, device-health-card, device-connection-log, device-status 保留
flash-dialog, flash-progress Q9
models/ model-card, model-grid, model-filters, model-upload-dialog, model-detail, model-comparison-dialog 全保留
inference/ inference-panel, classification-result, confidence-slider, performance-metrics, video-progress 全保留
cluster/ cluster-card, cluster-list, cluster-create-dialog, cluster-performance 全砍
dashboard/ stat-card, activity-timeline, connected-devices-list 保留(拿掉 cluster 欄位)
layout/ sidebar, header, connection-status, help-button 保留但改寫sidebar 為 4 個主導航 + Settings底部獨立區用 divider 分隔)Dashboard / Devices / Models / Workspace + ── divider ── + Settings。對應 Design spec/01-IA §1.2
onboarding-dialog, guided-tour 保留並強化First-Run
relay-token-sync
server-log-viewer, server-status-dashboard 保留(桌面 app 需要)
theme-sync, lang-sync, store-hydration 保留

4.4 Server 內部模組對照表

對照 server/internal/

模組 去留
api/ 改寫(刪除 cluster / tunnel / relay handler 與 route
camera/ 直接複製
device/ 直接複製
model/ 直接複製
inference/ 直接複製
config/ 改寫(砍掉 RelayURL / RelayToken / GiteaURL / GUIMode
deps/ 直接複製
cluster/ 整包刪除
tunnel/ 整包刪除
flash/ 整包刪除Q9
update/ 整包刪除Q6
relay/ 整包刪除
tray/ 整包刪除(第三輪 Q-A 決策砍掉 tray

server/main.go 需移除的 import 與初始化:

  • internal/clusterinternal/tunnelpkg/hwidinternal/flashinternal/updateinternal/tray
  • cfg.RelayURL / RelayToken / GiteaURL flag
  • tunnelClient.Start()clusterMgrrelayWebURL()trayMgr 等呼叫
  • --gui mode、relay-server cmd、tray init

4.5 新增的功能(相對於原專案)

新功能 說明
First-Run 歡迎流程 歡迎畫面 → 模式選擇(真實 / Mock→ 硬體偵測(真實模式)→ 完成
內嵌依賴解壓流程 首次啟動時把 Python wheels / ffmpeg / nef 從 Wails payload 解壓到 OS 慣例資料目錄macOS~/Library/Application Support/visiona-local/Windows / Linux 依各自慣例,由 Architect TDD 定義)
Python fallback 策略 優先使用內嵌 PythonQ1 決定 A + B找不到時 fallback 到系統 Python
原生 menu barmacOS / Win / Linux 釋放 ⌘N / ⌘W / ⌘Q 等桌面快捷鍵;快速動作(新增裝置 / 上傳模型 / 開啟工作區)改走 menu bar不再透過 tray
拖放 .nef / 圖片 / 影片到視窗任意處 桌面 app 慣例
Mac Gatekeeper 警告引導頁 因為不做 notarization
Windows SmartScreen 警告引導頁 因為不做 EV cert
Mock 模式視覺標記 主視窗標題列 + 首頁徽章 + sidebar 底部狀態列(不再含 tray badge

4.6 原專案要刪除的檔案清單(具體路徑)

server/internal/cluster/           ← 整包刪
server/internal/tunnel/            ← 整包刪
server/internal/flash/             ← 整包刪Q9
server/internal/update/            ← 整包刪Q6
server/internal/tray/              ← 整包刪(第三輪 Q-A
server/cmd/relay-server/           ← 整包刪
server/pkg/hwid/                   ← relay token 用的,可刪
docker/                            ← 整包刪
scripts/deploy-aws.sh              ← 刪
scripts/deploy-ec2.sh              ← 刪
frontend/src/app/clusters/         ← 整包刪
frontend/src/app/workspace/cluster/← 整包刪
frontend/src/components/cluster/   ← 整包刪
frontend/src/components/relay-token-sync.tsx ← 刪
frontend/src/components/devices/flash-*.tsx  ← 刪

第三輪 Q-C 決策M1即 MVP階段必須一次把前端 cluster / relay / tray 相關 UI 全部清乾淨,不允許「先留著不動」。若開發過程中發現 legacy 相依讓清理成本很高,也必須在 M1 內解決。

4.7 RICE 優先級(簡化版)

因為 MVP 範圍已定案(一次到位),此處 RICE 僅用於開發順序而非功能取捨。

功能 Reach內部人數 Impact0.25-3 Confidence Effort人週 RICE 建議開發順序
Wails 殼 + payload 解壓流程 10 3 100% 2 15 1阻斷性
Go server 瘦身(刪 cluster / relay / tray 10 3 100% 1 30 2
前端 sidebar / 路由 / 首頁改寫(含 Workspace 升一級 + 清 cluster/relay/tray UI 10 2.5 100% 1.5 16.7 3
Python runtime + wheels 內嵌 10 3 80% 2 12 4R1/R3 風險)
裝置偵測 + connect核心推論路徑 10 3 100% 1 30 5
First-Run 歡迎流程 + Mock 模式入口 10 2 100% 1 20 6
攝影機串流 + 推論 overlay 10 2.5 100% 1 25 7
媒體上傳image / video / URL 7 1.5 100% 1 10.5 8
中英雙語 + 深色模式跟隨系統Settings 語言併入一般) 10 1 100% 0.5 20 9
打包輸出dmg / exe / AppImage 10 3 70% 2 10.5 10阻斷性發佈

第三輪 Q-A 決策:原排序第 6 的「Tray三平台」已移除後續項目依序向前遞補。

注意Reach 取「預計內部使用人數 × 次數」近似值,因為是內部工具沒有市場規模概念。

4.8 第三方依賴的授權宣告(第四輪新增)

visionA-local 內嵌以下第三方工具,對應授權與宣告責任如下:

依賴 用途 授權 宣告要求
ffmpegLGPL build 攝影機 / 影片處理 LGPL v2.1+ ⚠️ 必須宣告(1) 在安裝檔內附 LICENSE-ffmpeg.txt(含完整 LGPL 條文與 copyright notice(2) About 對話框顯示 Powered by FFmpeg (LGPL) 與連結;(3) 若未來改用 GPL build 的 ffmpeg整個 visionA-local 必須改為 GPL 授權,本 MVP 只能用 LGPL build(4) 動態連結 ffmpeg binary不靜態連結成 Go binary符合 LGPL 的 "user can replace the library" 條款
yt-dlp /api/media/url YouTube 影片下載 Unlicensepublic domain-equivalent+ MIT fork 歷史 建議宣告About 對話框列出 yt-dlp (Unlicense);內附 LICENSE-yt-dlp.txt。無強制要求但好習慣
KneronPLUS SDKwheel 裝置 / 推論 Kneron 專有授權re-distribution 待確認,見 R5 / R9 ⚠️ 發佈前 gateR5授權允許後才能正式對外發佈內嵌時必須保留 Kneron 的 copyright notice 與 LICENSE-KneronPLUS.txt
Python runtimepython-build-standalone 執行 KneronPLUS PSF License 2.0Python 本體)+ 各組件授權 必須宣告:內附 LICENSE-python.txtAbout 對話框列出 Python 版本與授權
Python wheelsnumpy / opencv / pyusb 等) 推論依賴 各 wheel 不同(多為 BSD / MIT / Apache 2.0 必須宣告:內附 third_party_licenses.txt,列出每個 wheel 的授權條文
Wails v2 GUI 殼 MIT About 對話框列出
Next.js / React / shadcn / Radix / Tailwind / Zustand 前端 MIT 為主(個別 check About 對話框列出主要依賴;前端 build 時由 webpack-license-plugin 自動產出 frontend-licenses.txt

4.8.1 授權檔案落點

所有授權檔案放在安裝後的 <APPDATA>/licenses/ 目錄:

<APPDATA>/licenses/
├── LICENSE-visionA-local.txt      (本產品 — 內部工具,待定)
├── LICENSE-ffmpeg.txt              (LGPL v2.1+)
├── LICENSE-yt-dlp.txt              (Unlicense)
├── LICENSE-KneronPLUS.txt          (Kneron 專有)
├── LICENSE-python.txt              (PSF)
├── third_party_licenses.txt        (Python wheels 合併)
├── frontend-licenses.txt           (前端 npm 依賴合併)
└── README.md                       (宣告總覽與對應表)

About 對話框提供「檢視第三方授權」按鈕 → 開啟上述目錄或彈出瀏覽器檢視。

4.8.2 架構責任分工

  • Architect:在 04-architecture/dependency-bundling.md / packaging.md 補實作細節檔案來源、打包流程、ffmpeg 必須動態連結而非靜態)
  • Frontend:在 Settings > 進階 或 Help > About 對話框加「第三方授權」入口
  • DevOpsCI build 流程加入授權檔案收集腳本,確保每次 release 都帶齊

4.8.3 MVP 邊界聲明

本 MVP 是內部工具,不對外商業發佈,因此:

  • 授權宣告做到位LGPL 強制項目必做)
  • 不做 OSS license compliance tool 的正式掃描(如 FOSSA、Black Duck
  • 不做 SBOMSoftware Bill of Materials產出
  • 若未來對外商業發佈需補上述合規流程