Repository navigation
feat: /voice + qc voice (pairux CLI), qc archiving, live join/leave/archive events, periodic chat list (0.9.0, qc 0.8.0) - #308
Merged
Conversation
…I; archive chats in qc (0.9.0, qc 0.8.0) /voice (PWA composer and the qc TUI) mints https://pairux.com/r/<room>#k=<key> on the device: a 128-bit room id and a 32-byte media key in the fragment, so PairUX never sees the key and nobody needs an account to join. The link goes out inside the usual ML-KEM-encrypted message; the PWA also opens it. qc voice is an alias for the pairux CLI: bare `qc voice` (or --send <chat>, --json) makes the link locally, anything else runs `pairux <args>` attached to the terminal (login, logout, whoami, join, say, ...), with its exit code. Both bins now keep a non-zero process.exitCode instead of forcing 0. Archiving in qc: the TUI hides archived chats (title counts them), `a` in the list archives/unarchives, Ctrl+O (or /archived) flips to the archived view, /archive and /unarchive act on the open chat. CLI: qc archive|unarchive <chat>, qc chats --archived. Needs pairux.com#138 (the /r page and anonymous token endpoint) live. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ThreatCrush Security Scan13 finding(s) MEDIUM: 9 | LOW: 4
Snippets are redacted; ThreatCrush never prints matched credential material. |
…ex (CodeQL) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… its chat list every 15 s Server: PARTICIPANTS_JOINED (invite join, admin add) goes to everyone in the chat, PARTICIPANT_LEFT (leave/delete for me) to the rest and every device of the leaver, CONVERSATION_ARCHIVED to every device of the user who archived or unarchived (src/lib/chat/membership-events.js; sendToUser fans out to each connection). Announcing never fails the request: archive used to 500 if the lookup threw. Clients: the web store reloads on any of these and raises qrypt:chats-changed so the sidebar (its own list, still polled every 10 s) reloads too; the qc TUI reloads on them and closes a chat this user left elsewhere. qc also reloads the list every 15 s and catches news the stream missed (by updated_at). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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.
/voice and
qc voice/voicein the PWA composer and qc TUI postshttps://pairux.com/r/<room>#k=<key>, made on the device (128-bit room id, 32-byte key in the fragment, which PairUX never sees; nobody needs an account). It travels inside the normal ML-KEM-encrypted message; the PWA also opens it.qc voiceis an alias for the pairux CLI: bareqc voice(--send <chat>,--json) makes the link; anything else runspairux <args>(login, logout, whoami, join, say, ...) with its exit code. Missing pairux prints the installer./rpage andPOST /api/v1/rooms/token.Archiving in qc
ain the list archives or unarchives, Ctrl+O or/archivedswitches views, and/archive//unarchiveact on the open chat.qc archive|unarchive <chat>,qc chats --archived.Live chat list on every device
PARTICIPANTS_JOINED(invite join, admin add) goes to the whole chat;PARTICIPANT_LEFTto the rest of the chat and every device of the person who left;CONVERSATION_ARCHIVEDto every device of that user.Tested
Full vitest (115 files, 752 tests) including new tests for links,
qc voicepass-through, membership events reaching each device, archive announcements, and the TUI archived view and refresh.next buildand the qc bundle build pass. The bundledqc voiceprints a link, prints the installer when pairux is missing, and passes through exit codes.🤖 Generated with Claude Code