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.
browser_url opens the branded player document with the
recording name, audio controls, and response text; audio_url
serves the recording directly.--output remains the exact requested destination. When it is
outside the managed recordings directory, a private copy is made for HTTP
delivery; no symlink is created.127.0.0.1, prefers port
8779, falls back to a free port when needed, and serves only
the managed recordings directory.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>
browser_url from both an IDE terminal and a normal terminal.
Both should show the branded document, audio controls, and response text.audio_url. It should play or download the real audio file.--format wav.--output /tmp/my-recording.mp3. Confirm that exact file
exists and the HTTP copy in delivery.recording_path also works.viewer stop; old links should stop. The next JSON recording
should restart the viewer on port 8779 unless it is occupied.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.