* fix(scripts): allow multiple dev:daemon instances by probing Vite port
The Vite dev server port was hardcoded to 5173 with --strictPort, so a
second npm run dev:daemon would crash immediately. Now the launcher
probes for an available port (starting from 5173) and passes it
explicitly via --port, matching how the daemon port is already handled.
* fix(scripts): fail cleanly when the dev Vite/daemon port probe is exhausted
The daemon and Vite port probes were bare top-level awaits, so an
exhausted range (e.g. 5173–5182 all taken by other dev:daemon instances)
rejected as an unhandled promise rejection — a raw stack instead of an
actionable message. Wrap both probes and print the launcher's usual
`[daemon-dev] <message>` before exiting 1, matching the validateLauncherArgs
handling. findAvailablePort already rejects with the exhausted range, so
the message names exactly which ports to free.
* fix(scripts): let Vite handle port selection atomically
Remove the probe-then-bind approach for the Vite port. The probe had a
TOCTOU race (two launchers could pick the same port before either
binds) and a host mismatch (probed 127.0.0.1 while Vite binds
localhost which may resolve to ::1).
Instead, drop --strictPort and let Vite auto-increment from its
configured port 5173. Vite's --open uses the actual bound port, so the
token URL is always correct.
* fix(scripts): don't print a potentially wrong Vite URL in banner
The banner hardcoded http://localhost:5173/ but with --strictPort
removed the actual port may differ. Point at Vite's own output instead,
which always prints the real bound port.
---------
Co-authored-by: wenshao <wenshao@example.com>