* fix(cli): non-interactive-safe prompts + singular `context` alias
Two CLI-polish follow-ups (the third — an async-warn refactor for #2807 — is moot:
#4373 replaced the Gemini remote-URL drop+warn with fileData pass-through, so no
async warn remains).
1) createPrompt (io.mjs) — the shared interactive helper used rl.question with no
EOF guard, so a non-interactive stdin (pipe, CI, `< /dev/null`) left the await
pending and Node warned about an 'unsettled top-level await' while the command
hung. ask/askSecret now resolve on the readline `close` event (fired on EOF)
with the default / empty string. A genuinely piped line still arrives via the
question callback first, so `echo value | omniroute …` keeps working — only the
no-input EOF case falls back. This fixes every command that prompts, centrally
(mirrors the contexts `confirm()` fix from #4397).
2) `contexts` gains a singular `context` alias — the connect output and older docs
said `omniroute context current`; the alias keeps that muscle-memory working.
Tests: cli-io.test.ts (ask default/empty + askSecret resolve on EOF, no hang) and a
cli-contexts.test.ts case asserting the `context` alias is registered. 11/11.
* test(cli): mock .alias() in the fake program for the contexts subcommand test
The existing 'registers a current subcommand' test uses a minimal fake commander
program; registerContexts now calls .alias("context"), so the fake needs an alias()
stub (returns this) or the chain throws. Add it. (Self-introduced by the alias in
this branch; my 4 new tests already pass in CI.)
Hide admin password entry during setup, make doctor degrade to warnings
when source-only runtime checks are unavailable, and improve stop
behavior by attempting graceful shutdown before force killing ports.
Also use SQLite's backup API for safer snapshots under WAL, align CLI
key writes with the current provider_connections schema, and include
follow-on compatibility fixes for GLM provider detection, stream error
sanitization, and auth-aware test coverage.