fix(notifications): deduplicate conversation-viewed events by moving canonical send to selectThread#9361
Merged
Conversation
…9310) The SwiftUI CommandGroup buttons bypass AppKit's validateMenuItem callback, so conversation zoom shortcuts (Cmd+/−/0) were always active even on non-conversation panels. Add .disabled() modifiers matching the existing isConversationVisible guard. Co-authored-by: Claude <noreply@anthropic.com>
#9311) Restructure the Mobile settings card so it uses the same row-based layout as the Telegram, SMS, and Phone Calling cards: - Connected devices now display as channelStatusRow entries (icon + name + Remove button) instead of the old custom list with bordered buttons - Device Pairing row uses the 140px guardian-label layout with info tooltip, mirroring the Guardian Verification rows in other cards - Status warnings (no gateway, no token, regenerating) display inline in the pairing row rather than as standalone blocks below the button - "Show QR Code" button renamed to "Pair Device" for consistency - Removed formattedDeviceDate helper (no longer needed) Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
…rehydrate (#9315) Co-authored-by: Claude <noreply@anthropic.com>
Replace onTapGesture with Button + contentShape(Rectangle()) to preserve keyboard activation and VoiceOver accessibility while keeping the full-row tap target.
#9317) Co-authored-by: Claude <noreply@anthropic.com>
…fix in rehydrate (#9319) Co-authored-by: Claude <noreply@anthropic.com>
…9320) Co-authored-by: Claude <noreply@anthropic.com>
- Move refresh icon next to status text instead of right-aligned - Remove bounce animation when spin stops (use .identity instead of .default) - Add 0.5s minimum spin duration so the icon always visibly spins Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
…#9324) Replace verbose error.localizedDescription (e.g. "Could not connect to the server.") with a concise "Could not connect" in the Platform health check on the Connect tab. Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Prevents accidentally overwriting an existing assistant's data by checking if the .vellum directory exists before proceeding with hatch. Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
…#9325) Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Claude <noreply@anthropic.com>
…9327) Co-authored-by: Claude <noreply@anthropic.com>
…ngle line (#9328) Co-authored-by: Claude <noreply@anthropic.com>
1. Replace .identity animation (unavailable in current Swift) with .default 2. Add public isConversationZoomEnabled accessor so the executable target can check conversation visibility without accessing internal members Co-authored-by: Claude <noreply@anthropic.com>
…9330) Co-authored-by: Claude <noreply@anthropic.com>
* feat: add vellum login/logout/whoami commands Add platform authentication commands to the CLI: - `vellum login --token <token>` validates and stores a platform session token - `vellum logout` clears the stored token - `vellum whoami` shows the currently authenticated user Token is stored at ~/.vellum/platform-token (same path used by the assistant daemon), enabling `vel import` to filter assistants by the logged-in user. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: use allauth session endpoint instead of removed /v1/users/ The UserViewSet at /v1/users/ was removed from the platform. Switch to the allauth headless session endpoint (/_allauth/app/v1/auth/session) which returns user info via X-Session-Token auth. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: respect BASE_DATA_DIR and enforce 0600 on existing token files - Derive platform token path from BASE_DATA_DIR (matching the assistant daemon's getRootDir() behavior) instead of hardcoding homedir() - Call chmodSync after writeFileSync to ensure 0600 permissions even when the file already exists (writeFileSync mode only applies on creation) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
…mation member (#9332) MainWindow and MainWindowState need public access since they're accessed from the vellum-assistant-app executable target. Also fix .identity (not a valid Animation member) to .default in SettingsConnectTab. Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
…9333) Add submit_outbound_code guardian action so users receive a verification code via SMS/Telegram/voice call and enter it in the macOS Settings UI instead of displaying a code to copy. Voice calls now speak the code (no DTMF required). Existing /guardian_verify command fallback preserved. Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
) * Revert "feat: outbound guardian verification via code entry in Settings UI (#9333)" This reverts commit b651371. * revert #9333 + rework guardian verification: show code in UI, user replies in channel Reverts the "enter code in UI" approach from #9333 and instead: - SMS/Telegram outbound messages no longer include the verification code - Messages ask the user to reply with the code shown in the Vellum app - Voice verification is unchanged (DTMF via phone call) - The code is only visible in the trusted Settings UI, not sent over the channel Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
#9336) - Accept bare hex/numeric codes as verification replies (no /guardian_verify prefix needed) - Simplify channel message copy to 'Reply with the code you were given' - Remove expiry time commentary from verification messages - Remove guardian_verify from Telegram bot commands - Update skills and architecture docs to match new flow Co-authored-by: Claude <noreply@anthropic.com>
…#9338) - All channels now use 6-digit numeric verification codes (was 64-char hex for SMS/Telegram) - SMS/Telegram: 'Vellum assistant guardian verification requested. Reply with the 6-digit code you were given.' - Voice: 'You are receiving a guardian verification call for your Vellum assistant. Please enter your 6-digit verification code using your keypad.' - Dropped per-assistant name prefix from templates (now always says Vellum assistant) Co-authored-by: Claude <noreply@anthropic.com>
…9339) Co-authored-by: Claude <noreply@anthropic.com>
…nav (#9340) Voice-bound conversations were appearing in the macOS desktop thread list after session restore because the filter explicitly allowed sourceChannel=voice. Guardian verification calls also leaked because they had no channel binding. Pointer messages set userMessageChannel=voice which contaminated origin channel. - Remove voice exception from desktop thread filters (restore + pagination) - Add voice channel binding to guardian verification conversations - Remove misleading "See voice thread" pointer text and channel metadata Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
…#9342) * feat: install CLI symlink during desktop hatch and add --version flag Creates /usr/local/bin/vellum symlink pointing to the bundled vellum-cli binary during hatch when VELLUM_DESKTOP_APP is set. This works for both dev mode (DerivedData) and production (/Applications) builds, complementing the existing AppDelegate symlink which skips dev mode. Also adds --version/-v flag support to the CLI entry point. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: use lstatSync to handle dangling symlinks during CLI symlink install existsSync follows symlinks and returns false for broken links, causing symlinkSync to throw EEXIST on stale symlinks. Now uses lstatSync to detect and clean up dangling symlinks correctly. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
…ion-store (#9351) Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Claude <noreply@anthropic.com>
…canonical send to selectThread Co-Authored-By: Claude <noreply@anthropic.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: b8f8a56699
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
Contributor
Author
|
Addressed in #9424 |
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.
Addresses feedback from PR #9331:
The IPC inventory was already regenerated in the squash-merge of #9331 and is still up to date.
🤖 Generated with Claude Code