Skip to content

Standalone Screen Recording (No CU Dependency)#8827

Merged
Jasonnnz merged 32 commits into
mainfrom
feature/standalone-screen-rec
Feb 25, 2026
Merged

Standalone Screen Recording (No CU Dependency)#8827
Jasonnnz merged 32 commits into
mainfrom
feature/standalone-screen-rec

Conversation

@Jasonnnz
Copy link
Copy Markdown
Contributor

@Jasonnnz Jasonnnz commented Feb 25, 2026

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

Milestone PRs (merged into feature branch)

Project issue

Closes #8672

Test plan

  • "record my screen" starts standalone recording UI (no CU overlay)
  • "stop recording" ends recording and posts attachment in same thread
  • Multi-display picker appears; selected display is recorded
  • Permission denied path is explicit and actionable
  • Repeated start while recording shows "already recording"
  • Stop in different thread does not stop unrelated recording
  • Video preview loads; drag/save works
  • Missing file at finalize shows explicit "recording unavailable/expired"
  • bun test recording-intent passes (84 test cases)
  • bun test recording-handler passes (13 test cases)

Generated with Claude Code


Open with Devin

@Jasonnnz Jasonnnz self-assigned this Feb 25, 2026
@Jasonnnz
Copy link
Copy Markdown
Contributor Author

@codex review

devin-ai-integration[bot]

This comment was marked as resolved.

chatgpt-codex-connector[bot]

This comment was marked as resolved.

@Jasonnnz
Copy link
Copy Markdown
Contributor Author

Addressed in #8828

@Jasonnnz
Copy link
Copy Markdown
Contributor Author

@codex review

devin-ai-integration[bot]

This comment was marked as resolved.

chatgpt-codex-connector[bot]

This comment was marked as resolved.

@Jasonnnz
Copy link
Copy Markdown
Contributor Author

Addressed in #8834

devin-ai-integration[bot]

This comment was marked as resolved.

@Jasonnnz
Copy link
Copy Markdown
Contributor Author

@codex review

@Jasonnnz
Copy link
Copy Markdown
Contributor Author

Addressed in #8837

chatgpt-codex-connector[bot]

This comment was marked as resolved.

@Jasonnnz
Copy link
Copy Markdown
Contributor Author

@codex review

1 similar comment
@Jasonnnz
Copy link
Copy Markdown
Contributor Author

@codex review

chatgpt-codex-connector[bot]

This comment was marked as resolved.

devin-ai-integration[bot]

This comment was marked as resolved.

@Jasonnnz Jasonnnz force-pushed the feature/standalone-screen-rec branch from 14921ff to 11d734d Compare February 25, 2026 16:15
@Jasonnnz
Copy link
Copy Markdown
Contributor Author

@codex review

@Jasonnnz
Copy link
Copy Markdown
Contributor Author

@devin review

chatgpt-codex-connector[bot]

This comment was marked as resolved.

@Jasonnnz
Copy link
Copy Markdown
Contributor Author

@codex review

chatgpt-codex-connector[bot]

This comment was marked as resolved.

devin-ai-integration[bot]

This comment was marked as resolved.

@Jasonnnz
Copy link
Copy Markdown
Contributor Author

@codex review

chatgpt-codex-connector[bot]

This comment was marked as resolved.

@Jasonnnz
Copy link
Copy Markdown
Contributor Author

@codex review

devin-ai-integration[bot]

This comment was marked as resolved.

chatgpt-codex-connector[bot]

This comment was marked as resolved.

Jasonnnz and others added 20 commits February 25, 2026 13:19
…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>
@Jasonnnz Jasonnnz force-pushed the feature/standalone-screen-rec branch from c28a8d1 to cfefa61 Compare February 25, 2026 18:19
devin-ai-integration[bot]

This comment was marked as resolved.

Jasonnnz and others added 6 commits February 25, 2026 13:49
#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>
@Jasonnnz Jasonnnz merged commit b9e2061 into main Feb 25, 2026
4 checks passed
@Jasonnnz Jasonnnz deleted the feature/standalone-screen-rec branch February 25, 2026 19:21
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Standalone Screen Recording (No CU Dependency)

1 participant