- inbox merges crm.mail.list threads (kind MAIL) into crm.inbox.list items so
sent/received mail actually appears in the one surface; mail shows in the
Open view (it has no inbox work-item state) and opens in MailReader on click.
Mail rows are read/reply only — no Done/Snooze/Archive (crm.inbox.transition
doesn't apply to a mail thread).
- compose Attachments block was wrapped in <Field> (a <label>), so the label
hijacked the Attach button's click via label→file-input association and the
picker misfired. Use a plain div with the same field styling.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- mail-api: MailMessage carries attachment; reply + sendInternal +
sendExternal accept uploaded attachments; mock updated
- mail.tsx: MailAttachmentView (inline image or file chip via signed URL),
StagedChip; attach button in the reply footer and the New Message
composer (multi-file, up to 10); text optional when a file is attached
- messenger: file-chip icon uses paperclip (was an unknown name)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The Inbox is the single communication surface — mentions, needs-reply, system
alerts, support updates AND the mail behind them, all in one list. Removed the
separate Mail tab.
- Inbox is now two-pane: the item list (crm.inbox.*) on the left; clicking an item
tied to a thread opens its conversation (MailReader) on the right to read + reply.
Non-threaded items (e.g. system alerts) show their detail. Item actions
(Done/Snooze/Archive) work for every item.
- Compose new mail (in-app or email) from the Inbox header.
- mail.tsx trimmed to reusable MailReader + NewMailModal (no standalone tab);
sidebar + dashboard reverted to no Mail entry.
- The existing work-item Inbox stays the notifier; this makes it the reader too.
HTML bodies still render in a sandboxed iframe. tsc + next build clean.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
A Mail surface in the Communication group, distinct from Messenger (chat) and the
work-item Inbox: read app-to-app + email messages (subject + rendered body), reply,
and compose (in-app to a person, or external to an email).
- mail-api.ts: crm.mail.list/history/reply + compose (crm.mail.internal/send), reusing
the messenger directory for the people picker. Live via the AppShell SDK; mock in demo mode.
- mail.tsx: thread list + reader + reply + New-mail composer. HTML bodies render inside a
SANDBOXED iframe (no scripts) — safe against untrusted email HTML.
- Wired into the sidebar (Communication) + dashboard switch.
The existing work-item Inbox stays as the notifier (IIOS's projector already flags new
mail there); this is where you read it. tsc + next build clean.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>