Rebuild & Deploy / rebuild (push) Successful in 50s
Hope often starts an already-downloaded song from a voice command, with no click on the player. Two things could leave it paused at 0: - The <audio> element sits outside the LiveKit room's audio-unlock flow, so autoplay policy rejected the poll-driven play(). Capture the first page gesture (pointerdown/keydown/touchstart) and play the current src inside it to whitelist the element for autoplay. - Player state is scoped per LiveKit room, but mediaScope() could return a stale shell room after a reconnect. Derive it from the connected room.name so the browser polls exactly the room the agent joined, and a "play X" request can never land in a scope the browser isn't watching. Add an in-container regression test (test_media_play_resolves_cached_ready_track) pinning the server-side resolve: an already-ready track plays without a re-download and serves a stable audio_url.
Hope test suite
End-to-end tests that drive the actual running container — no mocks. They run on the host and hit the live web UI, token endpoint, LLM API, MCP tool servers, and agent process.
Prerequisites
- The container is up:
docker compose up -d(and healthy) - Host deps installed:
pip install -r tests/requirements.txt(oruv pip install -r tests/requirements.txt) - The LLM at
LLM_BASE_URL(defaulthttp://192.168.86.2:3005/api, OpenWebUI) is reachable - Internet access for the weather tool tests (wttr.in)
Run
cd /home/shane/dev/voice
python -m pytest tests/ -v # everything
python -m pytest tests/ -v -m "not slow" # skip LLM/network-heavy tests
What each file covers
| File | Target | Notes |
|---|---|---|
test_web_ui.py |
nginx HTTPS UI (:9178) + token endpoint (:8091) | static assets, /token (direct + via nginx), /livekit/ proxy |
test_llm_api.py |
LLM API directly | completion, tool calling, enable_thinking=false latency, streaming |
test_mcp_tools.py |
MCP servers via docker exec |
weather/time, authenticated remote memory save/recall/delete, and local skills — probes are cleaned up |
test_media.py |
media server API + player UI + media MCP | library/player state flow, Range proxy, static mp3 Range, live YT Music search (-m slow), gated full download (HOPE_RUN_YTDLP_DOWNLOAD=1) |
test_agent_integration.py |
running container | agent process alive, worker registered with LiveKit, all 4 supervised processes up, container health, LiveKit HTTP API |
test_compaction.py |
HopeLLM._compact_context in-container |
compaction triggers >24 items, system prompt preserved, short context untouched |
Notes
- LLM and MCP tests are marked
@pytest.mark.slow(1–30s each). - The token endpoint is POST
/token→{"token": "<JWT>"}. - Process checks use
/proc/*/cmdlinebecause the container image has nops, and the supervisorctl unix socket is not exposed in this build.