Bug 1 — writer.shutdown() kills Node socket before response:
Rust called shutdown() on the write half immediately after writing
the command. This sent EOF to the Node.js daemon, whose safeWrite()
checks socket.destroyed and silently bails. Fixed by dropping writer
instead.
Bug 2 — daemon has zero macro support:
The daemon's execute() never handles macro_name/query. Only url
matters for the navigate action. Fixed search() to resolve all 12
macros (@google_search, @youtube_search, etc.) to actual search URLs
in Rust before sending navigate with cmd.url set.