Dependency discovered in BostonTechnologies/helpdesk#799 (parent #794). At dev df8ad6e, SessionHub.SendMessage(sessionId,text) is text-only and SessionRegistry constructs Contents=[TextContent(text)]. SendUserMessage already has MediaReferences and channel input supports rich content, but SignalR has no authenticated upload/opaque media-reference admission contract. Helpdesk MCP currently exposes attachment counts/references, not binary/image retrieval.\n\nProposed backward-compatible extension: retain SendMessage unchanged; provide bounded authenticated media staging scoped to paired device/session and a new SendRichMessage DTO with text plus opaque staged media IDs. Resolve only server-owned staged IDs to existing media/content processing, validate MIME/actual content/size and expiry, enforce session ownership and cleanup. Never accept caller daemon-local paths, arbitrary fetch URLs or base64 text prompts. Carry image contents through the existing harness media pipeline, not just metadata. Include device/session isolation, expired/foreign IDs, oversized/type mismatch, existing text-only compatibility and a real image consumed/described by the model.\n\nHelpdesk UX follow-up will not expose a functioning attachment Send path until this or an authenticated Helpdesk MCP image-content path is implemented and proven end-to-end. No upstream runtime change or attachment-complete claim has been made.
Dependency discovered in BostonTechnologies/helpdesk#799 (parent #794). At dev df8ad6e, SessionHub.SendMessage(sessionId,text) is text-only and SessionRegistry constructs Contents=[TextContent(text)]. SendUserMessage already has MediaReferences and channel input supports rich content, but SignalR has no authenticated upload/opaque media-reference admission contract. Helpdesk MCP currently exposes attachment counts/references, not binary/image retrieval.\n\nProposed backward-compatible extension: retain SendMessage unchanged; provide bounded authenticated media staging scoped to paired device/session and a new SendRichMessage DTO with text plus opaque staged media IDs. Resolve only server-owned staged IDs to existing media/content processing, validate MIME/actual content/size and expiry, enforce session ownership and cleanup. Never accept caller daemon-local paths, arbitrary fetch URLs or base64 text prompts. Carry image contents through the existing harness media pipeline, not just metadata. Include device/session isolation, expired/foreign IDs, oversized/type mismatch, existing text-only compatibility and a real image consumed/described by the model.\n\nHelpdesk UX follow-up will not expose a functioning attachment Send path until this or an authenticated Helpdesk MCP image-content path is implemented and proven end-to-end. No upstream runtime change or attachment-complete claim has been made.