6518aa184e
/heartbeat every <interval> <prompt> gives the current session one recurring instruction. When the session is idle and the interval has elapsed, the prompt is injected as a plain user turn — same conversation, same context, prompt cache and role alternation untouched. - CLI: idle-poll watchdog thread (wake-word watchdog pattern) feeding _pending_input; gateway: single gateway-wide async poller injecting through the adapter FIFO. Busy sessions coalesce their tick to the next idle poll. - Missed ticks coalesce (anchor resets on fire) — a busy hour yields ONE heartbeat turn, never a backlog. Real user messages always win. - 60s interval floor; injected prompt carries a don't-invent-work guard so idle heartbeats don't generate busywork. - State persists in SessionDB.state_meta (heartbeat:<session_id>), survives /resume, migrates across compression session rotations alongside /goal state. - Session-scoped and in-process by design — durable cross-process schedules remain the cron subsystem's job (docs draw the boundary). - Slack stays under the 50-slash cap via /hermes heartbeat; ghost-text suggester now prefers the shortest prefix match so /he still suggests /help. Adapted from the session-heartbeat concept in Prime Intellect's Prime-Agent (/heartbeat).