- commons: ConcordActions.draftDirectInvite holds the send-side refusals
(dissolved, banned sender, banned or invalid recipient) so the app and amy
share them.
- commonsUI: "Invite by npub" dialog (user typeahead) and a pending
Direct Invites card (bundle name + robohash preview, no icon or profile
fetch, Accept / Decline), with new strings in commonsUI resources.
- amethyst: the dialog behind the community overflow menu; the invites card
on the Concord hub, including its empty state.
- amy: `concord invite COMMUNITY --to USER [--expires-in SECS]`,
`concord invites`, `concord accept WRAP-ID`, `concord decline WRAP-ID`;
the link join is factored into joinBundle and shared with accept.
- Conformance review: F6 fixed.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PmuzkD5qdqgv6dMeRMoC5N