Daemon
The daemon runs when you usebumblebee run (not talk). It manages two core loops via APScheduler:
Heartbeat (default 120s)
- Tick soma bars, affects, and noise
- Emit idle events after 60s silence
- Check drives against thresholds
- Refresh MCP server connections
- Evaluate wake cycle conditions
Consolidation (default 2h)
- Process raw memories into durable episodes
- Apply significance decay
- Update relationship models
- Trigger narrative synthesis (every 3rd cycle)
- Run emergence analysis if enabled
Initiative and wake cycles
The entity can act on its own — not just respond to messages.- Drive-based initiative
- Autonomous wake cycles
- Summon
This path runs when
autonomy.enabled is false (legacy initiative in the daemon). When a drive exceeds its threshold (default 0.72) and enough time has passed since the last proactive message (drives.initiative_cooldown in entity YAML, default 1800 seconds if omitted), the entity composes and sends a message. The drive is then partially satisfied, dropping it below threshold.When autonomy.enabled is true, this legacy block is not used; instead, drive thresholds participate in autonomous wake when drive_wake is enabled (full perceive, wake voice, rate limits, optional sustained sessions — not the same as this single-message path).To disable full autonomous wakes but keep the daemon, set autonomy.enabled: false and see Autonomous wake → Disabling autonomous wake for what still can fire.Wake safeguards
Additional keys (
wake_session_max_rounds, wake_session_wall_seconds, wake_wide_mode, visibility toggles) are documented under Autonomous wake.
Platform adapters
All adapters share the same entity instance. Memory, body state, and identity are consistent across platforms.CLI
CLI
Rich terminal REPL with a prompt_toolkit input bar. Bottom toolbar shows current mood and dominant drive.Startup banner: entity name, mood, drive level, episode count, model, context size, tool count, uptime, relationship count.Streaming: character-by-character delivery with sentence-boundary chunking. Pauses between chunks simulate natural pacing.Local commands:
/self (side panel with drives, inner voice, recent memories), /status, /feelings, /memories, /tools, /bye (graceful shutdown with session summary).Tool activity: whisper-styled indented lines showing what the entity is doing.Telegram
Telegram
Full-featured bot via python-telegram-bot. 20+ slash commands, photo/vision support, voice message handling, HTML-formatted responses, privacy operator system, remote desktop sessions.Media: photos passed as vision input (up to 3), audio as base64 (8MB cap), image documents with mime detection.Delivery: plain replies use
presence.message_chunk_max and chunk_delay (plus typing-speed–based jitter and compose delays) so answers often arrive as several human-paced bubbles, not one block. Telegram’s ~4096-character limit still applies per message; longer content is split safely. Typing indicator runs during perceive (~4.5s loop) and again between chunk sends when applicable.Dedup: update_id and (chat_id, message_id) deduplication with 8192-entry ring buffers.See Telegram guide for setup, commands, and pacing knobs.Discord
Discord
Conversational bot via discord.py. Responds in DMs always; in guilds, when mentioned or in configured channels.Media: image attachments (12MB), audio (8MB), base64 passthrough.Presence sync: Discord status mapped to emotional state — online, idle, or DND based on primary emotion.Delivery: 2000-char cap with sentence-aware chunking at ~1900 chars.See Discord guide for setup.
Embodied expression
Responses are paced to feel natural, not instant. On Telegram, multi-part delivery usessend_plain_chunks: line-aware packing up to message_chunk_max, then between each bubble a delay of roughly chunk_delay with variance jitter (typing_speed_variance) plus an extra beat scaled by the next chunk’s length and typing_speed_base (capped). Discord uses similar line packing with its own length cap; CLI streams with sentence-aware chunking.