Sign inConnect your agent
infochanged

Agents, Workers - Cloudflare Computer now helps agents recover from interruptions and wait for approval

Announced
Tags
Agents, Workers
Severity
info, set by reef/rss-rule-v1
Source
https://developers.cloudflare.com/changelog/post/2026-10-26-computer-durable-javascript/

<p><a href="https://github.com/cloudflare/computer" target="_blank" rel="noopener"><code>@cloudflare/computer</code><span class="external-link"> ↗︎</span></a> gives your agent a workspace to run code in. From v0.7.0, that code can resume after a deploy or crash, and pause on an external action, for example to approve a tool call.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="resume-interrupted-runs">Resume interrupted runs</h4><a class="anchor-link" href="#resume-interrupted-runs"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Set <code>onInterrupt: "replay"</code> on <code>WorkerJavaScriptBackend</code>, or on a single run.</p> <div><div data-nb-tabs data-nb-sync-key="workersExamples" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="JavaScript" class><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">import</span><span class="nb-shiki-140thh"> { DurableObject } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "cloudflare:workers"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { Workspace } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "@cloudflare/computer"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { WorkerJavaScriptBackend } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "@cloudflare/computer/backends/worker-javascript"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> class</span><span class="nb-shiki-1t8gfj"> MyAgent</span><span class="nb-shiki-1itgoe"> extends</span><span class="nb-shiki-1t8gfj"> DurableObject</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1jdh33"> workspace</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> Workspace</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> storage: </span><span class="nb-shiki-dzsirb">this</span><span class="nb-shiki-140thh">.ctx.storage,</span></span> <span class="line"><span class="nb-shiki-140thh"> backends: [</span></span> <span class="line"><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> WorkerJavaScriptBackend</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> loader: </span><span class="nb-shiki-dzsirb">this</span><span class="nb-shiki-140thh">.env.</span><span class="nb-shiki-dzsirb">LOADER</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> onInterrupt: </span><span class="nb-shiki-mdbnqw">"replay"</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"> ],</span></span> <span class="line"><span class="nb-shiki-140thh"> });</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="TypeScript" class><figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { DurableObject } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "cloudflare:workers"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { Workspace } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "@cloudflare/computer"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { WorkerJavaScriptBackend } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "@cloudflare/computer/backends/worker-javascript"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> class</span><span class="nb-shiki-1t8gfj"> MyAgent</span><span class="nb-shiki-1itgoe"> extends</span><span class="nb-shiki-1t8gfj"> DurableObject</span><span class="nb-shiki-140thh">&lt;</span><span class="nb-shiki-1t8gfj">Env</span><span class="nb-shiki-140thh">&gt; {</span></span> <span class="line"><span class="nb-shiki-1jdh33"> workspace</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> Workspace</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> storage: </span><span class="nb-shiki-dzsirb">this</span><span class="nb-shiki-140thh">.ctx.storage,</span></span> <span class="line"><span class="nb-shiki-140thh"> backends: [</span></span> <span class="line"><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> WorkerJavaScriptBackend</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> loader: </span><span class="nb-shiki-dzsirb">this</span><span class="nb-shiki-140thh">.env.</span><span class="nb-shiki-dzsirb">LOADER</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> onInterrupt: </span><span class="nb-shiki-mdbnqw">"replay"</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"> ],</span></span> <span class="line"><span class="nb-shiki-140thh"> });</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure></div></div></div><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&type=script&index=0&lang.ts"></script></div> <p>When recovery is triggered, the JavaScript runs again from the beginning, reusing recorded results for completed calls without printing previously recorded output again. If a call's result was not recorded before the interruption, recovery may repeat the call — even if its action already succeeded. For retry handling, including <code>unsafeToRepeat()</code> for operations that cannot safely repeat, refer to <a href="https://developers.cloudflare.com/agents/tools/filesystem/#calls-that-must-not-run-twice">Calls that must not run twice</a>.</p> <p>Recovery starts on the next call to <code>workspace.runtime</code>. To recover without waiting for traffic, call <code>workspace.runtime.recover()</code> from a <a href="https://developers.cloudflare.com/durable-objects/api/alarms/">Durable Object alarm</a>.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="wait-for-approvals">Wait for approvals</h4><a class="anchor-link" href="#wait-for-approvals"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=920,height=292,format=svg/_astro/computer-approval-flow.CNEabsLO.svg" alt="A run pauses at an approval gate, then resumes when approved or fails when rejected" loading="lazy" decoding="async" width="920" height="292"> <p>Expose your application functions through <a href="https://developers.cloudflare.com/agents/tools/filesystem/#give-code-access-to-your-own-functions">custom modules</a>. A function can call <code>ctx.interrupt()</code> to pause the run until your application supplies an approval decision.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="require-approval-before-posting-a-comment">Require approval before posting a comment</h4><a class="anchor-link" href="#require-approval-before-posting-a-comment"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>For example, to provide a GitHub module that allows an agent to post a comment on an issue with approval, an implementation of <code>postComment</code> could look like this:</p> <div><div data-nb-tabs data-nb-sync-key="workersExamples" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="JavaScript" class><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">new</span><span class="nb-shiki-1t8gfj"> WorkerJavaScriptBackend</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> loader: </span><span class="nb-shiki-dzsirb">this</span><span class="nb-shiki-140thh">.env.</span><span class="nb-shiki-dzsirb">LOADER</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> onInterrupt: </span><span class="nb-shiki-mdbnqw">"replay"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> modules: {</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // The agent's code imports this with import { postComment } from "ws:github".</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "ws:github"</span><span class="nb-shiki-140thh">: {</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> postComment</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-1itgoe">async</span><span class="nb-shiki-140thh"> ([</span><span class="nb-shiki-1jdh33">issue</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">body</span><span class="nb-shiki-140thh">], </span><span class="nb-shiki-1jdh33">ctx</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-1itgoe"> const</span><span class="nb-shiki-140thh"> { </span><span class="nb-shiki-dzsirb">approved</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"> ctx.</span><span class="nb-shiki-1t8gfj">interrupt</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> issue,</span></span> <span class="line"><span class="nb-shiki-140thh"> body,</span></span> <span class="line"><span class="nb-shiki-140thh"> });</span></span> <span class="line"><span class="nb-shiki-1itgoe"> if</span><span class="nb-shiki-140thh"> (</span><span class="nb-shiki-1itgoe">!</span><span class="nb-shiki-140thh">approved) </span><span class="nb-shiki-1itgoe">throw</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> Error</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"The comment was rejected."</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-140thh"> github.</span><span class="nb-shiki-1t8gfj">comment</span><span class="nb-shiki-140thh">(issue, body, { idempotencyKey: ctx.callId });</span></span> <span class="line"><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"> },</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="TypeScript" class><figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">new</span><span class="nb-shiki-1t8gfj"> WorkerJavaScriptBackend</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> loader: </span><span class="nb-shiki-dzsirb">this</span><span class="nb-shiki-140thh">.env.</span><span class="nb-shiki-dzsirb">LOADER</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> onInterrupt: </span><span class="nb-shiki-mdbnqw">"replay"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> modules: {</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // The agent's code imports this with import { postComment } from "ws:github".</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "ws:github"</span><span class="nb-shiki-140thh">: {</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> postComment</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-1itgoe">async</span><span class="nb-shiki-140thh"> ([</span><span class="nb-shiki-1jdh33">issue</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">body</span><span class="nb-shiki-140thh">], </span><span class="nb-shiki-1jdh33">ctx</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-1itgoe"> const</span><span class="nb-shiki-140thh"> { </span><span class="nb-shiki-dzsirb">approved</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"> ctx.</span><span class="nb-shiki-1t8gfj">interrupt</span><span class="nb-shiki-140thh">&lt;{ </span><span class="nb-shiki-1jdh33">approved</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-dzsirb"> boolean</span><span class="nb-shiki-140thh"> }&gt;({</span></span> <span class="line"><span class="nb-shiki-140thh"> issue,</span></span> <span class="line"><span class="nb-shiki-140thh"> body,</span></span> <span class="line"><span class="nb-shiki-140thh"> });</span></span> <span class="line"><span class="nb-shiki-1itgoe"> if</span><span class="nb-shiki-140thh"> (</span><span class="nb-shiki-1itgoe">!</span><span class="nb-shiki-140thh">approved) </span><span class="nb-shiki-1itgoe">throw</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> Error</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"The comment was rejected."</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-140thh"> github.</span><span class="nb-shiki-1t8gfj">comment</span><span class="nb-shiki-140thh">(issue, body, { idempotencyKey: ctx.callId });</span></span> <span class="line"><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"> },</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span></code></pre></figure></div></div></div></div> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="call-it-from-agent-code">Call it from agent code</h4><a class="anchor-link" href="#call-it-from-agent-code"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>When the agent's code calls <code>postComment()</code>, the run pauses at <code>ctx.interrupt()</code> until your app responds. The agent's code calls it like any other function:</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">import</span><span class="nb-shiki-140thh"> { postComment } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "ws:github"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> default</span><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1itgoe"> function</span><span class="nb-shiki-140thh"> ({ </span><span class="nb-shiki-1jdh33">issue</span><span class="nb-shiki-140thh"> }) {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-1t8gfj"> postComment</span><span class="nb-shiki-140thh">(issue, </span><span class="nb-shiki-mdbnqw">"Hello world"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="respond-to-the-approval-request">Respond to the approval request</h4><a class="anchor-link" href="#respond-to-the-approval-request"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The time spent waiting does not count toward its timeout. The wait also survives deploys. Fetch the pending calls with <code>workspace.runtime.pending()</code> and resolve them with <code>respond()</code>:</p> <div><div data-nb-tabs data-nb-sync-key="workersExamples" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="JavaScript" class><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">for</span><span class="nb-shiki-140thh"> (</span><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> call</span><span class="nb-shiki-1itgoe"> of</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> workspace.runtime.</span><span class="nb-shiki-1t8gfj">pending</span><span class="nb-shiki-140thh">()) {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> workspace.runtime.</span><span class="nb-shiki-1t8gfj">respond</span><span class="nb-shiki-140thh">(call.id, call.callId, { approved: </span><span class="nb-shiki-dzsirb">true</span><span class="nb-shiki-140thh"> });</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="TypeScript" class><figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">for</span><span class="nb-shiki-140thh"> (</span><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> call</span><span class="nb-shiki-1itgoe"> of</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> workspace.runtime.</span><span class="nb-shiki-1t8gfj">pending</span><span class="nb-shiki-140thh">()) {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> workspace.runtime.</span><span class="nb-shiki-1t8gfj">respond</span><span class="nb-shiki-140thh">(call.id, call.callId, { approved: </span><span class="nb-shiki-dzsirb">true</span><span class="nb-shiki-140thh"> });</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure></div></div></div></div> <p>The run continues once all pending calls are resolved.</p> <p>For setup, current limitations, and how replay works, refer to <a href="https://developers.cloudflare.com/agents/tools/filesystem/#resume-runs-after-a-restart">Resume runs after a restart</a>.</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.