Ambient Presence Sensing
Read pacing signals from the user's frontend (typing rate, idle time, tab focus) and reduce them to a single presence-quality label the agent acts on — never surfacing raw signals back.
Intent & Description
🎯 Intent
Give the agent a richer signal than “message arrived / no message arrived” — without exposing surveillance-grade telemetry in its output.
📋 Context
A custom frontend can observe a lot between messages: typing speed, idle duration, tab visibility, time hovering in the composer. The agent currently treats the human as either present (message arrived) or absent (no message). It’s missing signal that’s already there.
💡 Solution
The frontend computes coarse pacing summaries — typing rate bucketed, idle duration, tab visibility boolean, composer dwell, scroll-position bucket — and writes them to a small presence record with a short TTL. A reducer derives one presence_quality label (e.g. walked-away, composing, thinking-with-the-room, distracted, present). The agent reads presence_quality only — not the raw signals. Raw signals are never replayed back at the user. Stale records past TTL are treated as no signal, not absence.
Real-world Use Case
- The product runs on a custom frontend able to emit pacing telemetry.
- The agent’s value depends on reading between-message presence (long-lived conversation, ambient companion).
- You can enforce that raw signals never surface back to the user.
Source
Advantages
- Agent can distinguish thoughtful silence from absence
- Coarse-only signals preserve privacy and avoid the surveillance feel
- A single derived value keeps the agent’s working context small
Disadvantages
- Requires a custom frontend — off-the-shelf chat surfaces don’t emit these signals
- Heuristics are device- and culture-dependent; typing speeds vary widely
- If raw signals leak into agent output, ambience collapses into surveillance