qwen-code/packages
Shaojin Wen 271664b34b
feat(cli): auto-retry next port when serve port is in use (#6513)
* feat(cli): auto-retry next port when serve port is in use

When `qwen serve` or `npm run dev:daemon` encounters EADDRINUSE on the
default port (4170), automatically try the next available port (up to 10
attempts) instead of failing immediately. This allows running multiple
daemon instances side-by-side without manual port management.

- run-qwen-serve.ts: replace single listen() with recursive tryListen()
  that retries on EADDRINUSE; --port 0 (ephemeral) skips retry
- daemon-dev.js: pre-scan for an available port via net probe before
  spawning the daemon child, ensuring health-poll and web-shell target
  the correct URL
- Tests: retry-then-succeed, non-EADDRINUSE immediate-fail, and existing
  all-ports-exhausted test all pass (138 tests)

* test(cli): fix EADDRINUSE mock to create fresh server per listen attempt

The existing test reused a single fakeServer across all retry attempts,
accumulating 10+ once('listening') listeners and triggering a
MaxListenersExceededWarning. Create a new server per call to match
production behavior where each tryListen creates a fresh server.

* fix: address review feedback on port retry

- daemon-dev.js: strip IPv6 brackets before probe (ENOTFOUND fix),
  add port range/NaN validation
- run-qwen-serve.ts: remove duplicate runtime error listener
  (onListening already installs one via removeAllListeners + on)
- tests: add exhaustion (all 10 ports), port 0 EADDRINUSE no-retry,
  and stderr retry message assertion (140 tests pass)

* fix: update stale comment referencing removed server.once('error', reject)

* fix: address R2 review — port cap, TLS reuse, exhaustion summary

- daemon-dev.js: cap probe at port 65535, skip probe when user
  specifies --port, add --compacted-replay-max-bytes to whitelist
- run-qwen-serve.ts: move https.createServer before tryListen (avoid
  recreating TLS context per retry), cap retry at 65535, log summary
  "all ports X–Y are in use" on exhaustion
- tests: verify exhaustion summary stderr message

* fix: clear stale listening listeners on httpsServer before retry
2026-07-08 10:31:52 +00:00
..
acp-bridge fix(memory): allow forget to remove user managed memory (#6432) 2026-07-08 09:51:36 +00:00
audio-capture chore(release): v0.19.7 (#6484) 2026-07-07 17:25:48 +00:00
channels fix(channel): Relay ACP permission requests (#6446) 2026-07-08 03:27:25 +00:00
chrome-extension chore(release): v0.19.7 (#6484) 2026-07-07 17:25:48 +00:00
cli feat(cli): auto-retry next port when serve port is in use (#6513) 2026-07-08 10:31:52 +00:00
core fix(core): omit deprecated temperature param for Claude 4.8+ (#6520) 2026-07-08 10:13:42 +00:00
cua-driver fix(cua-driver): migrate Windows scripts + README rewrite (#6515) 2026-07-08 06:07:11 +00:00
desktop fix(desktop): preserve glued automation history records (#6344) 2026-07-05 23:53:49 +00:00
mobile-mcp chore(release): v0.19.7 (#6484) 2026-07-07 17:25:48 +00:00
sdk-java fix(core): Align MCP OAuth guidance and docs (#5589) 2026-06-24 07:09:53 +08:00
sdk-python doc[sdk-python] Expand Python SDK usage documentation (#3995) 2026-05-12 15:27:00 +08:00
sdk-typescript feat(cli): Enable multi-workspace session routing (#6511) 2026-07-08 10:06:31 +00:00
vscode-ide-companion chore(release): v0.19.7 (#6484) 2026-07-07 17:25:48 +00:00
web-shell fix(web-shell): i18n for ~43 hardcoded English strings across 15 files (#6516) 2026-07-08 08:46:37 +00:00
web-templates chore(release): v0.19.7 (#6484) 2026-07-07 17:25:48 +00:00
webui feat(serve): Bound replay snapshot history (#6482) 2026-07-08 06:53:58 +00:00
zed-extension chore(deps): upgrade ink 6.2.3 → 7.0.2 + bump Node engine to 22 (#3860) 2026-05-11 17:29:50 +08:00