A 階段第二個 milestone、銜接 M9-1 bridge.py、暴露 service layer 給 M9-3 API/WebSocket。 New module `server/internal/firmware/`: - types.go: 123 行(FirmwareVersion / FirmwareProgress / ActiveTaskInfo / UpgradeDriver interface / 8 reason const) - progress.go: 147 行(仿 flash pattern 的 Tracker、Task.cancel 預留 SIGTERM force-cancel godoc) - service.go: 373 行(核心 service:UpgradeFirmware / HasActiveTask / GetActiveTaskInfo / RequestShutdown / WaitForActiveTasks / ListBundledVersions / GetCurrentVersion) - service_test.go: 676 行、13 個 test 含 MultiDeviceParallel Driver layer: - kl720_driver.go: 697 → 1054 行(+357、新 UpgradeFirmware method + tryRouteFirmwareEvent + sendCommandForUpgrade snapshot pattern) - kl720_driver_test.go: 360 行、11 個 test(含 InfoNotBlockedDuringUpgrade / CtxCancelReleasesBridge / StderrEventAfterCtxCancel 100 round stress) 關鍵設計: - flash 與 firmware 模組分離(不 import flash) - UpgradeDriver interface 隔離 driver 細節、DeviceLookup interface 隔離 device manager - 中介 channel pattern(service ↔ driver)方便 service 補欄位(DeviceID / Direction / BeforeVersion) - timeout 雙保險:chip timeout + 30s margin - 8 reason enum 對齊 bridge.py、stage 採 Design 命名 Concurrency race 修復(M9-2 Reviewer round 1 → round 2): - Major 1(mutex deadlock):新 fwUpgradeMu 獨立鎖 + sendCommandForUpgrade snapshot stdin/stdout pattern、避開 d.mu field-level race + 升級期間 Info/Disconnect 不被卡 + timeout 路徑無死鎖 - Major 2(close-channel race):tryRouteFirmwareEvent 持 fwMu 整段、配合 defer setFirmwareProgressCh(nil) 提供 happen-before、絕無 send on closed channel panic Reviewer 兩輪審查: - Round 1: 0 Critical / 2 Major / 5 Minor / 5 Suggestion - Round 2: 0 Critical / 0 Major / 2 Minor / 2 Suggestion(11/12 issue 修到位、Suggestion 4 留 follow-up) M9-1 follow-up 順手清: - m5(test 死碼 _firmware_upgrade_start_ts 殘留兩行)已清 - s5(test 註解 idempotent shape 說明)已加 測試: - go test ./... -race -count=1: 全綠(28s、無 regression) - Python: 36 tests + 22 subtests 全綠(0.31s) - go vet / build: 0 output 下一步:M9-3 API handler + WebSocket progress(CI 建議 `go test -race -count=3` 提升 race 偵測強度) Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
visionA
Innovedus visionA monorepo — Edge AI 開發平台(離線版 + 雲端版)。
開發環境快速啟動
make dev-up # 起 backend + Member Center(OIDC)+ Postgres
make frontend-dev # 另開 terminal:起 frontend dev server(pnpm dev)
# 開瀏覽器 http://localhost:3000
完整流程(含 OAuth client 手動註冊、port 對照、疑難排解)見 docs/DEV-SETUP.md。
其他 target:make help。
子專案
| 專案 | 角色 | 狀態 |
|---|---|---|
local-tool/ |
離線版 桌面工具(Wails + Go + Next.js) | 穩定維護 |
visionA-frontend/ |
雲端版 web 前端(Next.js) | ✅ Phase 0 雛形 |
visionA-backend/ |
雲端版後端(Go,雙 binary:api-server + remote-proxy) | ✅ Phase 0 雛形 |
local-agent/ |
visionA Agent — 雲端版 local 端代理(Wails + Go + Next.js) | ✅ Phase 0.5 雛形 |
架構關係
離線模式(local-tool 單獨)
使用者瀏覽器 → localhost:3721 (local-tool server) → Kneron 裝置
雲端模式(visionA 雲端版 + visionA Agent)
使用者瀏覽器 → visionA-frontend (CDN) → visionA-backend (api-server)
↓ internal HTTP
visionA-backend (remote-proxy)
↓ WebSocket + yamux tunnel
使用者電腦上的 visionA Agent
↓ 本機 HTTP
Agent 的內部 server → Kneron 裝置
兩種模式可在同一台電腦共存(local-tool 和 visionA Agent 獨立安裝、不衝突)。
產品線原則
- local-tool 不動,需要時 fork
- 雲端 vs 本機差異只在前端部署位置
- 雲端 agent 的 server ≈ local-tool 的 server(差別在沒本機操作 UI)
- 雲端 web UI 先抄 local-tool,之後再加新功能
文件
完整產品文件見 .autoflow/:
- 產品需求:
.autoflow/02-prd/PRD.md - 設計規格:
.autoflow/03-design/design-spec.md - 架構總覽:
.autoflow/04-architecture/design-doc.md - 交付總結:
.autoflow/07-delivery/project-summary.md
License
TBD(內部使用)
Description
Languages
Go
54.6%
TypeScript
33.4%
Python
3.8%
Makefile
1.8%
JavaScript
1.8%
Other
4.6%