Sign inConnect your agent
infochanged

Browser Run - Browser Run adds structured handoff for Human in the Loop

Announced
Tags
Browser-Run
Severity
info, set by reef/rss-rule-v1
Source
https://developers.cloudflare.com/changelog/post/2026-07-28-human-in-the-loop/

<p><a href="https://developers.cloudflare.com/browser-run/">Browser Run</a> now supports structured handoff for <a href="https://developers.cloudflare.com/browser-run/features/human-in-the-loop/">Human in the Loop</a> workflows. Using Cloudflare-specific <a href="https://developers.cloudflare.com/browser-run/features/human-in-the-loop/#cloudflare-cdp-commands">CDP commands</a>, your agent can signal that it needs help, a human steps in through <a href="https://developers.cloudflare.com/browser-run/features/live-view/">Live View</a> to handle the task, and the agent resumes once the work is done.</p> <p>For agents running multi-step browser workflows, a single login wall or unexpected prompt can fail the entire run. Previously, scripts had to manage human intervention manually by sharing a Live View URL and polling for completion. Structured handoff replaces this with a formal pause-and-resume flow.</p> <p>The following example requests human intervention for a login page and waits for the human to finish before continuing:</p> <figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> cdp</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> page.</span><span class="nb-shiki-1t8gfj">createCDPSession</span><span class="nb-shiki-140thh">();</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd">// Get Live View URL for the human operator</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-140thh"> { </span><span class="nb-shiki-dzsirb">devtoolsFrontendUrl</span><span class="nb-shiki-140thh"> } </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> cdp.</span><span class="nb-shiki-1t8gfj">send</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"Cloudflare.getLiveView"</span><span class="nb-shiki-140thh">, {</span></span> <span class="line"><span class="nb-shiki-140thh"> mode: </span><span class="nb-shiki-mdbnqw">"tab"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span> <span class="line"><span class="nb-shiki-140thh">console.</span><span class="nb-shiki-1t8gfj">log</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">Human input needed: ${</span><span class="nb-shiki-140thh">devtoolsFrontendUrl</span><span class="nb-shiki-mdbnqw">}</span><span class="nb-shiki-140thh">);</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd">// Request human intervention and wait for completion</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> handoffComplete</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-dzsirb"> Promise</span><span class="nb-shiki-140thh">((</span><span class="nb-shiki-1jdh33">resolve</span><span class="nb-shiki-140thh">) </span><span class="nb-shiki-1itgoe">=&gt;</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-140thh"> cdp.</span><span class="nb-shiki-1t8gfj">once</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"Cloudflare.handoffComplete"</span><span class="nb-shiki-140thh">, resolve);</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">await</span><span class="nb-shiki-140thh"> cdp.</span><span class="nb-shiki-1t8gfj">send</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"Cloudflare.handoff"</span><span class="nb-shiki-140thh">, {</span></span> <span class="line"><span class="nb-shiki-140thh"> instructions: </span><span class="nb-shiki-mdbnqw">"Please log in with your credentials"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> timeout: </span><span class="nb-shiki-dzsirb">600000</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> result</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> handoffComplete;</span></span> <span class="line"><span class="nb-shiki-140thh">console.</span><span class="nb-shiki-1t8gfj">log</span><span class="nb-shiki-140thh">(result.success </span><span class="nb-shiki-1itgoe">?</span><span class="nb-shiki-mdbnqw"> "Handoff complete"</span><span class="nb-shiki-1itgoe"> :</span><span class="nb-shiki-mdbnqw"> Failed: ${</span><span class="nb-shiki-140thh">result</span><span class="nb-shiki-mdbnqw">.</span><span class="nb-shiki-140thh">reason</span><span class="nb-shiki-mdbnqw">}</span><span class="nb-shiki-140thh">);</span></span></code></pre></figure> <p>Refer to the <a href="https://developers.cloudflare.com/browser-run/features/human-in-the-loop/">Human in the Loop documentation</a> for the full API reference, examples, and best practices.</p>

The text above is the source's. reef added the severity, the dates it could read from the text, and the endpoints and scopes named in code.