IsStatus and IsTaskStatus flags on OutboundMessage were set by the agent
loop but completely ignored by the channel Manager. Every status update
created a new message bubble, flooding chats with redundant messages.
Add MessageSenderWithID interface and implement it for Telegram, Discord,
and Pico channels. Manager now routes IsStatus/IsTaskStatus messages to
dedicated handlers that track message IDs and edit in-place. Final
responses also reuse the tracked status message via preSend. TTL janitor
extended to clean up stale tracking entries.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Phase 10: Define TypingCapable, MessageEditor, PlaceholderRecorder interfaces.
Manager orchestrates outbound typing stop and placeholder editing via preSend.
Migrate Telegram, Discord, Slack, OneBot to register state with Manager instead
of handling locally in Send. Phase 7: Add native WebSocket Pico Protocol channel
as reference implementation of all optional capability interfaces.
Define sentinel error types (ErrNotRunning, ErrRateLimit, ErrTemporary,
ErrSendFailed) so the Manager can classify Send failures and choose the
right retry strategy: permanent errors bail immediately, rate-limit
errors use a fixed 1s delay, and temporary/unknown errors use exponential
backoff (500ms→1s→2s, capped at 8s, up to 3 retries). A per-channel
token-bucket rate limiter (golang.org/x/time/rate) throttles outbound
sends before they hit the platform API.