Standalone Screen Recording (No CU Dependency)#8827
Merged
Conversation
Contributor
Author
|
@codex review |
Contributor
Author
|
Addressed in #8828 |
Contributor
Author
|
@codex review |
Contributor
Author
|
Addressed in #8834 |
Contributor
Author
|
@codex review |
Contributor
Author
|
Addressed in #8837 |
Contributor
Author
|
@codex review |
1 similar comment
Contributor
Author
|
@codex review |
14921ff to
11d734d
Compare
Contributor
Author
|
@codex review |
Contributor
Author
|
@devin review |
Contributor
Author
|
@codex review |
Contributor
Author
|
@codex review |
Contributor
Author
|
@codex review |
…op (#8828) Co-authored-by: Vellum Assistant <assistant@vellum.ai> Co-authored-by: Claude <noreply@anthropic.com>
…leRecordingStart (#8829) Co-authored-by: Vellum Assistant <assistant@vellum.ai> Co-authored-by: Claude <noreply@anthropic.com>
…ed to else branch (#8830) Co-authored-by: Vellum Assistant <assistant@vellum.ai> Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Vellum Assistant <assistant@vellum.ai> Co-authored-by: Claude <noreply@anthropic.com>
…ecording text delta (#8834) Co-authored-by: Vellum Assistant <assistant@vellum.ai> Co-authored-by: Claude <noreply@anthropic.com>
…#8836) Co-authored-by: Vellum Assistant <assistant@vellum.ai> Co-authored-by: Claude <noreply@anthropic.com>
…issing file (#8837) Co-authored-by: Vellum Assistant <assistant@vellum.ai> Co-authored-by: Claude <noreply@anthropic.com>
- Move Recording*.swift and ScreenRecorder.swift from ComputerUse/ to Recording/ - Switch InlineVideoAttachmentView to fetch raw bytes from /content endpoint instead of base64-decoding JSON, removing intermediate decode step - Stop excluding own app windows from screen capture filter Co-Authored-By: Claude <noreply@anthropic.com>
- Extract thumbnail from content endpoint for lazy-load attachments that have no inline base64 data Co-Authored-By: Claude <noreply@anthropic.com>
- Add includeMicrophone option to IPC RecordingOptions contract - Regenerate IPCContractGenerated.swift with new field - Add microphone toggle to RecordingSourcePickerView - Pass includeMicrophone through RecordingManager to ScreenRecorder - Add separate AAC mic track in AVAssetWriter (mono, 64kbps) - Register SCStream microphone output and handle in sample buffer - Check/request microphone permission before recording starts - Gate microphone APIs behind macOS 15 availability checks Co-Authored-By: Claude <noreply@anthropic.com>
1. misc.ts: Always call handleRecordingStop even when socket has no prior session binding. Previously, "stop recording" from task_submit with no prior session would skip the stop attempt entirely. 2. recording.ts: Don't clean up deterministic maps when no socket is found. Cleaning up orphaned the client-side recording (still running) while the daemon thought no recording was active, blocking future starts. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1. Require tracked recording IDs in recording_status — reject unknown session IDs to prevent forged status messages from attaching arbitrary files via the finalization path. 2. Restrict accepted file paths to the recordings directory to prevent path traversal attacks in crafted IPC messages. 3. Clean up recording state on socket disconnect to prevent stale entries from blocking future recordings when a client crashes or disconnects. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…tart - Extract cleanupMaps() helper to ensure map cleanup runs on all exit paths, including when path validation rejects a file outside the allowed recordings directory (previously skipped by break) - Fall back to attachToConversationId when in-memory maps are missing after daemon restart, preserving recording finalization across restarts - Remove dead else-if branch that was unreachable after early return Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
… on denied - Replace cleanupRecordingForSession(sessionId) with cleanupRecordingsOnDisconnect() which iterates all recording entries instead of a single session ID. Fixes the case where a recording started in conversation A is missed when the socket disconnects while bound to conversation B. - Move cleanup call outside the sessionId check so it runs regardless of session state. - When microphone permission is denied, rebuild options with includeMicrophone=false so recording starts without mic instead of potentially failing. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
When a recording_status arrives with a file path outside the allowed recordings directory, send a user-visible error message before cleaning up state, so the user isn't left without feedback. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
cleanupRecordingsOnDisconnect now accepts the disconnecting socket and a conversation-to-socket lookup so it only clears recordings owned by conversations bound to that socket. This prevents an unrelated socket disconnect from dropping another session's active recording state. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
When recording_status arrives with status 'stopped' but no filePath, send a user-visible message explaining the recording produced no file instead of silently cleaning up. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Use the socket that delivered recording_status as the primary recipient for completion/failure notifications. This ensures notifications reach the client even when the user has switched to a different conversation since starting the recording. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add recording_status, recording_start, and recording_stop wire types to the inventory after rebasing onto latest main. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Use getFilePathForAttachment() instead of !dataBase64 to distinguish file-backed attachments from valid zero-byte inline uploads. The file_path column is the authoritative indicator of file-backed storage. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
c28a8d1 to
cfefa61
Compare
#9024) Co-authored-by: Vellum Assistant <assistant@vellum.ai> Co-authored-by: Claude <noreply@anthropic.com>
…top status (#9040) Co-authored-by: Vellum Assistant <assistant@vellum.ai> Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Vellum Assistant <assistant@vellum.ai> Co-authored-by: Claude <noreply@anthropic.com>
* fix: replace dead-branch MIME type ternary with lookup map Co-Authored-By: Claude <noreply@anthropic.com> * fix: use Map for MIME types to avoid prototype pollution Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> --------- Co-authored-by: Vellum Assistant <assistant@vellum.ai> Co-authored-by: Claude <noreply@anthropic.com>
* fix: resolve symlinks in recording file path validation Co-Authored-By: Claude <noreply@anthropic.com> * fix: also resolve allowedDir via realpathSync for APFS firmlink compatibility Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> --------- Co-authored-by: Vellum Assistant <assistant@vellum.ai> Co-authored-by: Claude <noreply@anthropic.com>
…9048) * fix: delete orphaned conversation when recording start is rejected Co-Authored-By: Claude <noreply@anthropic.com> * fix: keep conversation on rejection, only unbind socket to avoid FK violations Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> --------- Co-authored-by: Vellum Assistant <assistant@vellum.ai> Co-authored-by: Claude <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.
Summary
Implements a recording-first workflow where prompts like "record my screen" use a dedicated standalone recording system and UI, with no computer-use session required. This is a complete, isolated implementation starting fresh from main — no dependency on computer-use recording integration.
Changes
RecordingManagerwith single-active guard,ScreenRecorderusing ScreenCaptureKit + AVAssetWriter, recording HUD (source picker, timer, stop button), permission preflightisRecordingOnly/isStopRecordingOnly, filler word stripping for polite forms, feature flag gate (daemon.standaloneRecording)SKILL.mdwith activation rules for start/stop phrases, OS-gated to macOS, explicitly routes recording-only requests away from CUMilestone PRs (merged into feature branch)
Project issue
Closes #8672
Test plan
bun test recording-intentpasses (84 test cases)bun test recording-handlerpasses (13 test cases)Generated with Claude Code