feat: couple broadcast to voice + voice-controlled broadcast toggle
Completes the STREAM_BROWSER=true behaviour:
- handleJoin auto-starts the broadcast on voice join and wires the session to
the guild streamer; each turn reports the live state to the brain so search
routes Chrome (live) vs Gemini (off).
- New setBroadcast tool lets the user toggle the broadcast by voice ("방송
켜줘/꺼줘") via the LLM (no hardcoded phrases); it refuses when
STREAM_BROWSER=false. The directive flows brain -> bridge (broadcast_action)
-> bot streamer.start/stop, guarded by isActive() so it's idempotent.
- Per-turn IPC uses a thread-local (reply/turn_state.py) instead of threading
params through the whole engine chain: bridge sets broadcasting in, tool
records the directive out; Tool.execute exposes broadcasting on ToolContext.
Bot typecheck clean; brain covered by tests/test_set_broadcast.py (+ existing
routing tests). Specs + docs updated.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -111,6 +111,14 @@ class Tool(ABC):
|
||||
This method creates the context and calls the tool's run method.
|
||||
Tools should implement run(), not this method.
|
||||
"""
|
||||
# Live broadcast state for this turn is carried in request-scoped
|
||||
# thread-local state (set by the bridge) rather than threaded through
|
||||
# the whole engine call chain. Absent (eval / unit test) -> None.
|
||||
try:
|
||||
from jarvis.reply.turn_state import get_broadcasting
|
||||
broadcasting = get_broadcasting()
|
||||
except Exception:
|
||||
broadcasting = None
|
||||
context = ToolContext(
|
||||
db=db,
|
||||
cfg=cfg,
|
||||
@@ -120,5 +128,6 @@ class Tool(ABC):
|
||||
max_retries=max_retries,
|
||||
user_print=user_print,
|
||||
language=language,
|
||||
broadcasting=broadcasting,
|
||||
)
|
||||
return self.run(tool_args, context)
|
||||
|
||||
Reference in New Issue
Block a user