feat: member timeout enforcement (#33) and DM voice calls (#32)#34
Merged
Conversation
Closes #33: communication_disabled_until is now deserialized (accepting either communication_disabled_until or timed_out_until), gated behind moderate_members + hierarchy, normalized to RFC3339, and persisted to timed_out_until. A timed-out member is blocked (403) from sending messages, adding reactions, typing, and connecting to voice until the timeout expires; an explicit null clears it. Closes #32: voice join is allowed on dm/group_dm channels (participant access instead of space permissions), LiveKit credentials are issued keyed on channel_id, and voice.state_update is routed to DM participants rather than a space. Adds call signaling endpoints (call/ring, /decline, /cancel) plus a call.end emitted when a DM voice room empties, all delivered to participants under the voice_states intent. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This was referenced Jun 13, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Implements two issues in one PR.
#33 — Member timeout (
communication_disabled_until)Previously the field was silently dropped on deserialize, never persisted, and never enforced —
PATCHreturned 200 with the member unchanged (a false success). Now:UpdateMemberacceptscommunication_disabled_until(aliastimed_out_until). A double-Optiondistinguishes omitted (leave unchanged), explicit null (clear), and timestamp (set).moderate_membersplus the hierarchy check.timed_out_until.Acceptance criteria: all four met (persist + return, permission + hierarchy gate, blocks messages, null clears).
#32 — Voice calls in DMs + call signaling
POST /channels/{id}/voice/joinnow works ondm/group_dmchannels, gated by participant access instead of space permissions; LiveKit credentials are issued keyed onchannel_id.voice.state_updatefor DM calls is routed to the DM participants (target_user_ids) instead of a space.voice_statesintent:POST /channels/{id}/call/ring→call.ringPOST /channels/{id}/call/decline→call.declinePOST /channels/{id}/call/cancel→call.cancelcall.endis emitted automatically when a DM voice room empties on leave.voice.state_update.Notes / follow-ups
call.*events and DM voice join (separate repo).call/cancel).Tests
Added integration tests in
tests/http.rscovering timeout persist/clear/enforce (messages, reactions, voice), permission gating, invalid-timestamp rejection, expired-timeout pass-through, DM voice join success + non-participant rejection, and call ring/decline/cancel signaling. Letting CI run the suite.Closes #33
Closes #32
🤖 Generated with Claude Code