releases.shpreview

Structured pause-and-resume for Human in the Loop

1 featureThis release1 featureNew capabilitiesAI-tallied from the release notes
From the original release noteView original ↗

Browser Run now supports structured handoff for Human in the Loop workflows. Using Cloudflare-specific CDP commands, your agent can signal that it needs help, a human steps in through Live View to handle the task, and the agent resumes once the work is done.

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.

The following example requests human intervention for a login page and waits for the human to finish before continuing:

<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">=></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>

Refer to the Human in the Loop documentation for the full API reference, examples, and best practices.

Fetched July 28, 2026