c2c9de26e7
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>