feat(vocero): add linked content and TALKFIRST greetings (#2)

Opening a report or podcast link now establishes an authenticated starting reference for the conversation. Users can select other accessible content or compare reports while retaining the original link, and TALKFIRST greetings can name the verified report or podcast.

Release notes:

- Added authenticated report and episode link resolution with bounded lookups and unavailable-content handling
- Added explicit conversation selection without restricting searches or changing the reference during comparisons
- Added contextual TALKFIRST greetings through both voice-proxy and HTTP reasoning paths
- Preserved backend permission checks, conversation isolation, cancellation, and the existing speech protocol

Reviewed-on: AquaPortal/s2s#2
This commit is contained in:
2026-10-08 09:34:16 -04:00
parent 96895996d9
commit 4b0108ecf0
21 changed files with 946 additions and 66 deletions
+9
View File
@@ -123,11 +123,20 @@ checks reject stale HTTP results and speech callbacks even if cancellation is la
With MCP enabled, `services/conversations.py` owns bounded server-side caller
credentials. `providers/mcp.py` owns the official SDK transport, while
`services/mcp_tools.py` validates selections and enforces per-turn limits.
`services/content_context.py` resolves linked metadata and implements the local
`select_content` action. Each conversation retains separate original-link and
current-selection references; reading or comparing reports does not change the
selection. The current podcast is passed as an MCP request header, with every
retrieval still subject to backend authorization. TALKFIRST uses the verified
title in the opening instructions after link resolution completes.
`services/mcp_reasoning.py` and `realtime/mcp_proxy.py` share that executor for
HTTP and voice reasoning respectively. The browser stores only its conversation
ID in memory and uses an HttpOnly owner cookie. Legacy public content preloads
are disabled in this mode; the AquaPortal backend remains the authority for
content access. The speech pipeline and its audio protocol are unchanged.
In OPENAI mode, MCP TALKFIRST greetings enter the HTTP reasoning path after the
speech connection is ready, and use the existing external-answer playback and
cancellation lifecycle.
Read [reasoning](reasoning.md), [context injection](context-injection.md), and
[tool calling](tool-calling.md) for the conditions and limitations of each path.