os: format-and-install on blank SSDs (`w` in devices view)
Adds a true install path for unformatted disks the user just plugged
in (no GPT, no partitions, fully blank).
Three coordinated changes:
1. js-bindings.c flashTargets: enumerate whole disks (/dev/nvme0n1,
/dev/sda, /dev/mmcblk0, /dev/sdb) when the disk node exists but
its first partition does NOT. Tagged `blank: true` so the UI can
render them differently.
2. js-bindings.c flash_thread_fn: when the flash target is a whole
disk (no /sys/class/block/<dev>/partition file), partition + format
it first — wipe first 16 MiB, sfdisk single GPT ESP spanning the
disk (type C12A7328-…), poke kernel for partition reread, wait up
to 5s for the new partition node, mkfs.vfat. Then redirect
flash_device at the new partition and continue the existing
mount + copy flow. Uses the bundled initramfs sfdisk + mkfs.vfat
already present (no new tools).
3. os.mjs devices view: render blank disks with a yellow "blank" badge
instead of "usb"/"boot". Add `w` key handler that prompts confirmation
then routes through the existing clone-confirm UI. Clone-confirm
passes /mnt/initramfs.cpio.gz alongside the kernel so the freshly
flashed disk has both files (without the initramfs the new install
would panic with "no init" on first boot).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>