Connects the inbound SenderID, which was already carried end-to-end via
InboundContext to PromptBuildRequest, into the per-turn user message so
historical messages remember who said what.
- userPromptMessage gains a senderID parameter. Real human IDs are
sanitized via SanitizeMessageName; synthetic triggers (cron,
heartbeat, async:*) are filtered out via IsSystemSenderID so they
do not surface as distinct users.
- pipeline_setup.go now passes ts.opts.Dispatch.SenderID() and uses
AddFullMessage unconditionally. The previous AddMessage(role,
content) shortcut for media-less turns silently dropped the new
Name field, breaking history disambiguation.
- context.go (BuildMessagesFromPrompt) propagates req.SenderID onto
the current-turn user message that goes to the LLM.
After this commit, sessions persist sender attribution and provider
adapters receive it on each user message. Adapters that consume Name
(OpenAI native field, Anthropic-style content prefix) land in
follow-up commits.
The existing "## Current Sender" block in buildDynamicContext is
unchanged; it continues to describe the latest speaker in the system
prompt while Name covers the per-message channel for history.
Refs #2702.