Two slices in one push because the detekt failures from the previous
slices block landing the Invites work cleanly:
Audit v2 #19 — Admin Users Invites section:
* New domain Invite model + InviteWire envelope.
* AdminInvitesApi (list / create / revoke).
* AdminInvitesRepository.
* AdminInvitesViewModel with optimistic add/remove + one-shot
Channel for the generated-token dialog.
* AdminUsersScreen restructured: single LazyColumn with two sections
(Users / Invites). Generate button in Invites header opens a
dialog for the optional note; after creation a second dialog
surfaces the token with a Copy-to-clipboard button.
Detekt fixes on already-pushed code:
* PlaylistDetailViewModel.regenerate: 3 returns → single early-bail
via combined condition.
* PlaylistDetailScreen function (63/60): extracted
PlaylistDetailContent helper for the when block.
* PlaylistHeader function (65/60): extracted PlaylistHeaderActions.
* RequestsScreen RequestRow (79/60): extracted RequestRowBody +
RequestRowAction + CancelConfirmDialog helpers.
* RequestRef.listenRoute: 4 returns → single when expression.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>