Agent Voice local viewer update

JSON recordings now include browser-friendly localhost links. They open as rendered audio controls even when a local file link would open as code in an IDE.

What changed

New commands

agent-voice viewer start --json
agent-voice viewer stop --json

agent-voice speak "Viewer smoke test." \
  --label viewer-smoke --service off

The receipt contains the generated path, plus:

delivery.browser_url
delivery.audio_url
delivery.recording_path

Routes normally use port 8779; use the reported port after a collision:

http://127.0.0.1:<port>/player/<recording>.html
http://127.0.0.1:<port>/recordings/<recording.ext>

What to test

  1. Open browser_url from both an IDE terminal and a normal terminal. Both should show the branded document, audio controls, and response text.
  2. Open audio_url. It should play or download the real audio file.
  3. Create the default MP3, then one alternate format such as --format wav.
  4. Use --output /tmp/my-recording.mp3. Confirm that exact file exists and the HTTP copy in delivery.recording_path also works.
  5. Run viewer stop; old links should stop. The next JSON recording should restart the viewer on port 8779 unless it is occupied.
  6. If the viewer cannot start, confirm the viewer URLs are absent. The installed skill should render its recording-delivery.md template using the receipt's top-level path and file_uri, omitting the unavailable viewer links.

Deliberate limit: links remain stable while port 8779 is available. A collision forces a temporary free port. Range requests and seeking optimizations are not added until needed.