Repository navigation
Conversation
This was referenced Oct 14, 2026
A page's file input opened a chooser inside the headless browser, where nobody could answer it. While someone drives the live view, the sidecar now offers the chooser to it: the driver picks files (or drops them on the view), their bytes go over the live view's WebSocket in 32 KiB chunks, and the sidecar writes them to a private directory and sets them on the input. Only the connection holding control may answer, and only the chooser on offer; watchers are told the page is waiting. Uploads are bounded per file, per chooser and per browser session, and upload_max_files 0 turns them off. File names are reduced to a safe last segment, and names and contents are never logged or recorded. The relay listens only while someone holds control, so an agent's chooser and a headed window's dialog behave as before, and it clears the modal state Playwright MCP keeps for a chooser the person answered, so the agent's next call is not refused. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CJAKwnkBaCGr5qjCcmc3kh
File upload changes the browser sidecar, and @activeagents/browser-sidecar 1.9.0 is already on npm, so the sidecar moves to 1.9.1. CI requires the sidecar's version to equal ActionAgent::VERSION, and activeagent is released at the same version, so all three move together. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CJAKwnkBaCGr5qjCcmc3kh
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CJAKwnkBaCGr5qjCcmc3kh
TonsOfFun
force-pushed
the
feat/live-view-file-upload
branch
from
October 15, 2026 00:13
b9313b1 to
e955ae5
Compare
This branch has not been deployed
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.
Release: 1.9.1. This PR changes
browser-sidecar/, and@activeagents/browser-sidecar@1.9.0is already on npm, identical tomain'sbrowser-sidecar/. So it bumpsactiveagent,actionagentand the sidecar to 1.9.1 (CI requires the sidecar's version to equalActionAgent::VERSION). The 1.9.1 release must publish the sidecar, as a staged npm publish (#585) that a maintainer approves.Stacked on #584 (base
feat/claude-code-boot-setup). Retarget tomainonce #584 merges.File upload in the sandbox browser's live view
browser-sidecar/lib/file-upload.mjs,FileChooserRelay): listens for Playwrightfilechooserevents. A chooser opened while a person holds control is offered to the live view as{ type: "file_chooser", chooser: { id, multiple, accept, max_files, max_file_bytes } }, and it's included inreadyfor viewers who join later. A chooser opened while nobody drives is left to Playwright MCP'sbrowser_file_upload, so agents behave as before. The listener is attached only while someone drives, so a headed window's native dialog still opens the rest of the time.file_upload { chooser, files }, thenfile_chunk(base64, 32 KiB per message, under the 64 KiB cap) orfile_cancel. Replies report progress, done, or failed with a code.fileChooser.setFiles(paths). They're kept until the browser stops, because the page reads them from disk lazily.LiveView.jsx,utils/liveView.mjs): the driver gets an overlay with a real<input type=file>(honouringmultipleandaccept) plus Cancel, and can drop files on the frame while the chooser is open. Counts and sizes are checked before sending, sending waits when more than 1 MiB is queued, and progress shows as a percentage. Other viewers see "The page is asking for a file."Limits (sidecar
liveconfig; Ruby doesn't set these yet)upload_max_file_bytesupload_max_files0turns uploads off; a single-file input takes 1)upload_max_session_bytesSecurity
file_uploadedmarker with the count and bytes.acceptis advisory, as it is in browsers.Tests
Open questions
upload_max_*limits to the sidecar yet, in either the local or the Incus backend.🤖 Generated with Claude Code
https://claude.ai/code/session_01CJAKwnkBaCGr5qjCcmc3kh