- Shipped
- September 11, 2026 at 7:03 AM UTC
- Author
- Kamo
- Commit
- 4ded664
In every chat popup tool window - Chat, Support, Exec2Exec, Social, SMS, AI Chat - each message now carries a 16x16 photo that overlaps the bubble's top-left corner for a message on the left and its top-right corner for one on the right. Every message, not only the first of a run: the Chat window's old face in the header line is gone, and name/attribution lines are inset so the face never sits on their first letter. Initials only when the person has no photo. The face is three-valued (MessageAvatar): a URL is a photo, tried as its _sm variant and then as the full-size file (small variants are optional server-side; older uploads lack them); null is initials; undefined - not known yet - is a blank disc, so somebody WITH a photo never flashes as initials while it is looked up. Where the photos come from. The windows used to read only the viewer's own member directory (ACTIVE team members of the signed-in org), so plain Members, the whole other side of a support ticket or an Exec2Exec conversation, and anybody who had left a group were drawn as initials with a photo on their profile. Now one store per conversation (app/lib/chat/sessionFaces.ts) reads MediaService's new GET **************** - everybody on the conversation AND everybody who ever wrote in it, from their own profile, on a host the console may load - through a route file of its own (/api/media is not a proxied prefix). A newcomer's first message re-asks once; somebody the server still does not cover, or everybody while an older MediaService cannot answer, falls back to the directory lookup the windows used before. The rows that must never wear the face of the member they are stored under: - a web-chat visitor (stored under the org's SYSTEM member, the owner) gets the visitor's initials; - a social contact (stored under the connection owner) gets the photo their provider gave, through the image proxy. SMS: sent texts are the viewer's own (a conversation belongs to one member's number); received ones wear the contact's photo from the directory the header reads, their initials, or a phone mark for a number nobody is saved under. AI Chat: the member's photo on what they asked; the assistant, which has no profile, wears the AI sparkle. Rows in the 4px-packed lists with no name line above get 4px of headroom: measured in real Chrome, the face otherwise sat 1-2px from the timestamp of the message before.