6-step spotlight tour (Scan → Connect → Manage → Flash → Workspace → Inference)
with step completion validation, polling auto-detection, and i18n support (en/zh-TW).
Triggered from onboarding dialog or header help button.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace DiInstallDriverW (failed with 0xE000022F / no catalog) with
proven approach: create self-signed code signing cert via PowerShell
New-SelfSignedCertificate, install to TrustedPublisher + Root stores
via certutil, then use pnputil /add-driver /install which accepts
the unsigned INF when cert is trusted. Removes syscall/unsafe deps.
Tested successfully on Windows: KL520 + KL720 drivers installed.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
New flow: PowerShell New-SelfSignedCertificate → install to
TrustedPublisher/Root stores → create .cat via inf2cat/makecat/
New-FileCatalog → sign with signtool/Set-AuthenticodeSignature →
pnputil /install. Falls back to SetupAPI DIF_INSTALLDEVICE.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Parse MULTI_SZ hardware IDs correctly (was only reading first string)
- Add device listing step to show all Kneron devices with Hardware IDs
- Case-insensitive HWID matching
- Better debug output at each SetupAPI step
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Method 3 uses SetupDiGetClassDevs + SetupDiEnumDeviceInfo to find the
exact device node, then SetupDiBuildDriverInfoList + DIF_SELECTBESTCOMPATDRV
+ DIF_INSTALLDEVICE to install driver directly on the device, bypassing
the catalog signature check that blocks Methods 1 and 2.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Test both methods: UpdateDriverForPlugAndPlayDevicesW (with Hardware ID
matching) and DiInstallDriverW. Also includes go.mod and pre-built exe.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Build: already cross-compiled as test_driver_install.exe
Usage: .\test_driver_install.exe "C:\path\to\kneron_winusb.inf"
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
pnputil rejects unsigned INF, installer_x64.exe is not a CLI tool.
Switch to calling Windows DiInstallDriverW from newdev.dll directly,
which can install unsigned drivers with a user confirmation dialog.
Uses DIIRFLAG_FORCE_INF flag to force INF installation.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
pnputil rejects unsigned INF files ("does not contain digital signature
information"). Replace with installer_x64.exe (libwdi-based) from
Kneron SDK, which handles driver signing automatically with a
self-signed certificate.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
When connect fails, the partially-created DeviceGroup object could
trigger an access violation in __del__ during GC. Explicitly set
_device_group = None before each retry and in the except handler.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Bundle WinUSB driver INF + co-installer DLLs in installer payload.
During USB driver setup step, extract driver files and run pnputil to
install the WinUSB driver for all Kneron devices (KL520 VID_3231&PID_0100,
KL720 VID_3231&PID_0200, KL720v2 VID_3231&PID_0720).
This eliminates the need for manual Zadig installation, which was the
root cause of KP_ERROR_CONNECT_FAILED_28 on Windows.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Retry connect up to 3 times with 2s delay and re-scan between attempts
- Re-scan refreshes USB device handles which can resolve timing issues
- Add Windows-specific hint about Zadig/WinUSB driver in error message
- Firmware reload reconnect also gets retry + fallback to without_check
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add "Installing media tools" step to the installer that automatically
installs ffmpeg and yt-dlp if not already present on the system.
Uses winget (Windows), Homebrew (macOS), or apt-get (Linux).
Non-critical step — installation continues even if this fails.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
KL520 in USB Boot mode reports is_connectable=False, which is normal -
firmware must be loaded first. The previous code rejected the connection
attempt early. Now we use connect_devices_without_check() for devices
that are not yet connectable, then proceed with firmware loading.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The server's kneron_bridge.py requires the `kp` (KneronPLUS) module
to detect devices. Without it, HAS_KP=False and scan returns empty.
Changes:
- build-installer.ps1: copy KneronPLUS*.whl to payload/scripts/
- Makefile: same for macOS builds
- CI workflows: same for GitHub/Gitea Actions
- installer app.go: pip install the bundled wheel after requirements.txt
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Tray icon:
- Embed proper ICO files (green=running, red=stopped) instead of
generic IDI_APPLICATION icon
- Switch icon dynamically based on server state
Console window:
- FreeConsole() to fully detach from parent console
- CREATE_NO_WINDOW flag on child server process to prevent
black console window from appearing
Device detection:
- ResolvePython: add Windows venv paths (Scripts/python.exe) and
%LOCALAPPDATA%\EdgeAIPlatform\venv, fallback to exec.LookPath
- DetectDevices + startPython: prepend install dir to PATH so
libusb-1.0.dll is found by pyusb/kp SDK
- Also hide "cmd /c start" console when opening browser
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
kneron_detect.py now prepends the install directory to PATH before
importing pyusb, so libusb-1.0.dll in the install dir is found.
DetectHardware() also sets PATH in the subprocess environment.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- webgui.go: Native Windows tray icon + right-click popup menu using
pure syscall (Shell_NotifyIconW, CreatePopupMenu, etc.)
- No CGO required, no external dependencies
- Shows server status, Start/Stop, Open Dashboard, Quit
- Hides console window on startup
- Handles OS signals and Windows session end
- webgui_other.go: Stub for non-Windows notray builds
- Remove webgui_html.go (browser-based approach no longer needed)
- Fix auto-start: replace schtasks (fails on Chinese Windows) with
Registry Run key (HKCU\...\Run) which works without admin and
has no locale encoding issues
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add a CGO-free alternative to the systray-based --tray mode. When
launched with --gui, the server starts a lightweight HTTP control panel
in the browser where users can start/stop the server, open the dashboard,
and view relay status.
New files:
- server/tray/webgui.go: HTTP API backend + child process management
- server/tray/webgui_html.go: Embedded HTML control panel
Modified:
- config.go: Add --gui flag
- main.go: Route --gui to RunWebGUI()
- tray.go: Add RunWebGUI stub for tray-enabled builds
- installer: Windows uses --gui instead of bare launch
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Remove --tray flag from LaunchServer() on Windows (notray build)
- Switch schtasks from PowerShell Register-ScheduledTask to schtasks CLI
for Chinese Windows compatibility
- Remove /RL HIGHEST from schtasks (requires admin privileges)
- Add install log output to %TEMP%/edgeai-install.log
- Add critical flag to install steps (critical failures abort)
- Fix extractDir: create parent dirs before writing files
- Improve findPython3: skip Windows Store stub, auto-install via winget
- Enhance installLibusb: extract bundled DLL, fallback to winget
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- installLibusb now extracts libusb-1.0.dll from payload to install dir
- Falls back to winget, then shows Zadig download link
- checkLibusbInstalled also checks install directory
- CI workflow copies libusb-1.0.dll into payload during staging
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- findPython3: skip Windows Store stub (WindowsApps), search common
install locations (LocalAppData/Programs/Python/PythonXXX)
- installAutoRestart: use schtasks instead of PowerShell
Register-ScheduledTask to avoid XML parsing errors on non-English
(Chinese) Windows
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
extractDir was writing files without creating parent directories first,
causing "The system cannot find the path specified" errors on Windows
when models.json was walked before the data/ directory entry.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Installer now writes a detailed log to %TEMP%/edgeai-install.log
(or /tmp/edgeai-install.log on macOS/Linux) with OK/FAIL status for
each step. Log path is shown on completion and in error messages.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
When Python 3 is not found during installation on Windows, the installer
now automatically attempts to install it using winget (Python.Python.3.12).
Falls back to manual install prompt if winget is unavailable.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Previously all step errors were treated as warnings and installation
continued silently. Now critical steps (create dir, extract binary,
extract data/scripts, write config) will abort with an error message.
Non-critical steps (libusb, python venv, symlink, auto-start) still
warn and skip.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Added winget install commands and verification steps for Go, Node.js,
Git, pnpm, and Wails CLI in TDD section 11.7.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Section 8.5.14: added alternative architecture comparison table
(Wails v2 vs Go HTTP + embedded Web UI) for future cross-compile reference
- Section 11.7: added step-by-step Windows installer build guide
with PowerShell commands
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Prevents artifact storage quota issues from blocking the entire build.
Build jobs will succeed even if upload fails, allowing release job to proceed.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The frontend directory was incorrectly stored as a git submodule pointer
(160000 commit), causing CI checkout to produce an empty directory.
This converts it to a regular tracked directory.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Gitea Actions requires .gitea/workflows/ at repo root.
Updated all paths to use edge-ai-platform/ prefix.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Move all Edge AI Platform code into edge-ai-platform/ subdirectory
- Remove legacy local_service_win/ and relay-server-linux binary
- Keep docs/ and README.md at repo root
- Update docs to latest PRD v3.1 and TDD v2.0
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Merge installer improvements, CI workflow, and full frontend codebase.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
# Conflicts:
# README.md
- Auto-generate random relay token during installation
- Pre-fill relay URL and dashboard URL with EC2 defaults
- Fix hardware detection duplicate device parsing
- Add Dashboard URL field to relay config step
- Launch Server now auto-opens dashboard URL with token
- Add ad-hoc codesign to Makefile installer target
- Remove binary from git tracking
- Add Gitea Actions CI workflow for macOS + Windows builds
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Implemented a new script `video_inference_viewer.py` for processing video files and performing inference using a specified model.
- Added functionality to encode frames in various formats and send them to a specified inference server.
- Included methods for decoding model outputs, applying non-maximum suppression (NMS), and drawing bounding boxes on the video frames.
- Integrated command-line arguments for configuration, including model ID, input dimensions, and output options.
- Added a graphical file dialog for selecting video files.
- Added new images: bike_cars_street_224x224.bmp and one_bike_many_cars_800x800.bmp.
- Updated TEST_PAIRS.md to reflect new source paths for YOLOv5 and FCOS models.
- Introduced VERSION files for KL520 (2.2.0), KL630 (SDK-v2.5.7), and KL720 (2.2.0).
- Added firmware binaries for KL520, KL630, KL720, and KL730.
- Updated third-party Kneron_DFUT resources, including new binaries and translations.
- Added KneronPLUS-1.2.1.zip to third-party resources.