Add heartbeat: reminders and delivered files reach Bolt Assistant
The client never called /desk/report_status, so Bolt's reminders and any files he delivered to this session sat in the server's outbox forever - the same dead-air failure the pet client showed when its heartbeat stopped. Now a heartbeat thread (HEARTBEAT_SECONDS, default 60; 0 disables) reports in, speaks announcements through the assistant's queue when the mic is idle, and downloads the outbox to BOLT_DOWNLOAD_DIR (default ~/Downloads/Bolt) via .part-then-rename, never overwriting. A startup health probe warns loudly when the server refuses the DESK_API_KEY. Also: add the .env.example the README's setup step references (it was missing, so `cp .env.example .env` failed for everyone), and gitignore .claude/ so Claude Code's worktree directory stays out of the repo. Tests: tests/test_heartbeat.py (12) plus announcement tests in tests/test_assistant.py (6); full suite 135 passed. Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Code
parent
a8c7db9520
commit
751d1c8b69
@@ -50,6 +50,17 @@ VOICE_ID = os.environ.get("ELEVENLABS_VOICE_ID", "")
|
||||
TTS_SAMPLE_RATE = int(os.environ.get("TTS_SAMPLE_RATE", "16000"))
|
||||
STREAMING_REPLIES = _flag("STREAMING_REPLIES", "true")
|
||||
|
||||
# ── heartbeat: reminders and delivered files ─────────────────────────────────
|
||||
# Every HEARTBEAT_SECONDS the assistant reports in to /desk/report_status —
|
||||
# the channel Bolt's reminders and any files he delivers to this client
|
||||
# arrive on. Announcements are spoken when the mic is idle (see
|
||||
# assistant.announce), and files download to DOWNLOAD_DIR without
|
||||
# overwriting what is already there. Set HEARTBEAT_SECONDS to 0 to turn the
|
||||
# heartbeat off entirely.
|
||||
HEARTBEAT_SECONDS = max(0, int(os.environ.get("HEARTBEAT_SECONDS", "60")))
|
||||
DOWNLOAD_DIR = Path(os.environ.get("BOLT_DOWNLOAD_DIR", "").strip()
|
||||
or str(Path.home() / "Downloads" / "Bolt"))
|
||||
|
||||
# ── audio devices ───────────────────────────────────────────────────────────
|
||||
|
||||
MIC_DEVICE = _device(os.environ.get("MIC_DEVICE", ""))
|
||||
|
||||
Reference in New Issue
Block a user