One agent server
Run a single long-lived process. Providers are interfaces into that process — not separate microservices per channel.Separate ingress from intelligence
- Ingress —
app.messages, webhooks, or both. Normalize to one handler shape. - Intelligence — your LLM, tools, memory. Provider-agnostic.
- Egress —
space.send(), reactions, typing. Branch only when a platform lacks a verb.
Human pacing
Use typing indicators and short delays before long replies. React with a tapback before sending text on iMessage.Platform narrowing at the edges
Keep the core loop provider-agnostic. Call iMessage-only features (effects, app cards) only after checkingmessage.platform or space.platform.