* feat(web-shell): show the qwen-code version in the sidebar footer
The Web Shell had no visible version. Show the running qwen-code version (from the daemon capabilities) in the sidebar footer, inline with the Settings button so it stays visible without taking its own row.
Render the version consistently wherever it appears:
- Prefix "v" only for a real semver release; a non-semver fallback such as "unknown" is shown as-is, so we never render a bogus "vunknown". Applied to the Web Shell badge and the TUI header.
- Dev builds (scripts/dev.js) now report the real package version instead of the "dev" sentinel, matching scripts/start.js, so the UI shows the actual version (e.g. v0.19.4). DEV=true / NODE_ENV=development remain the signals that mark a dev build.
* test: add readFileSync to node:fs mock in dev.test.js
scripts/dev.js now reads package.json via readFileSync at module load to
report the real CLI_VERSION, but the node:fs mock in dev.test.js did not
export readFileSync, causing vitest to throw "No readFileSync export is
defined on the node:fs mock" and failing the suite.
The two Windows-targeted dev.js launcher tests added in #4728 mock
existsSync with forward-slash suffix matching and assert spawn args via
forward-slash stringContaining. On a real windows-latest runner dev.js
builds these paths with path.join, which yields backslashes, so the
existsSync mock never matches, dev.js takes the bare tsx.cmd shell
fallback, and both tests fail. On macOS/Linux the platform() mock plus
real forward-slash joins keep them green, which is why main CI has been
red only on the Windows job since 423cac110.
Normalize separators in both the existsSync mocks and the received
spawn arguments before asserting, so the tests pass on every host OS.
Same content as the fix bundled into #4840's merge commit 0e104e179,
extracted into a standalone test-only change so main recovers without
waiting on a core-behavior PR; both merge cleanly in either order.
Co-authored-by: qqqys <qys177@gmail.com>