Frontend regex required a .iso suffix that the backend does not enforce.
Changed from /^[a-zA-Z0-9_-]+:iso\/.+\.iso$/ to
/^[a-zA-Z0-9_-]+:iso\/[^,]+$/ to match the backend rule: must start
with storage:iso/ and contain no commas. Updated hint and error text
accordingly.
- Cores max aligned to backend limit (128→512)
- MigrationDialog shows loading state while node list fetches
- CreateVmDialog validates ISO format client-side on change, blocks
submit and highlights field on invalid input
Issue 1 — VM actions silently doing nothing:
The root cause was a missing <Toaster> mount in App.tsx. All
toast.success/error calls were no-ops because the sonner Toaster
component was never rendered. Added it at the App root.
Also added dialog:allow-confirm capability (was missing, caused VM
delete confirmation to throw silently).
Issue 2 — Remove Disk column:
PVE cluster/resources returns only static disk allocation, not actual
usage, making the column misleading. Removed from VMList header, row,
and the diskPercent calculation.
Issue 3 — Add VM creation:
- New list_proxmox_nodes Tauri command (GET /nodes) for real node list
- New create_proxmox_vm Tauri command with server-side input validation:
vmid range, numeric bounds, node/storage/bridge path-safety check,
ISO volume-ID format check to prevent comma-property injection
- CreateVmDialog component with node/storage discovery on open
- "Add VM" button wired into VMsPage
MigrationDialog now fetches real cluster nodes via list_proxmox_nodes
instead of inferring them from the VMs already in the list.
Added suspendProxmoxVm, resumeProxmoxVm, listProxmoxNodes,
createProxmoxVm client wrappers to proxmoxClient.ts.
Tests: 446 Rust + 405 frontend, all pass. 19 new VMList tests (TDD),
7 new Rust tests for security validation logic.