<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>Cloudflare changelogs | Workflows</title><description>Cloudflare changelogs for Workflows</description><link>https://developers.stormtrust.net/changelog/</link><item><title>Artifacts, Workflows - Build and deploy Artifacts repos on every push</title><link>https://developers.stormtrust.net/changelog/post/2026-08-04-build-and-deploy-on-push/</link><guid isPermaLink="true">https://developers.stormtrust.net/changelog/post/2026-08-04-build-and-deploy-on-push/</guid><description>
&lt;p&gt;You can now run your CI/CD pipeline on your &lt;a href=&quot;https://developers.stormtrust.net/artifacts/&quot;&gt;Artifacts&lt;/a&gt; repo by defining a CI &lt;a href=&quot;https://developers.stormtrust.net/workflows/&quot;&gt;Workflow&lt;/a&gt; with the &lt;a href=&quot;https://github.com/cloudflare/ci&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;CI SDK&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;, automatically triggered on Artifacts push events.&lt;/p&gt;
&lt;p&gt;This allows you to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Automatically build and deploy application code stored in Artifacts.&lt;/li&gt;
&lt;li&gt;Run linting, type checking, tests, and other checks on every push.&lt;/li&gt;
&lt;li&gt;Reuse dependencies when the lockfile (i.e. &lt;code&gt;pnpm-lock.yaml&lt;/code&gt;) has not changed.&lt;/li&gt;
&lt;li&gt;Stop deployment when a check or build fails.&lt;/li&gt;
&lt;li&gt;Restrict API token access to the deployment step.&lt;/li&gt;
&lt;li&gt;Deploy the output to a &lt;a href=&quot;https://developers.stormtrust.net/workers/&quot;&gt;Worker&lt;/a&gt; or a &lt;a href=&quot;https://developers.stormtrust.net/cloudflare-for-platforms/workers-for-platforms/&quot;&gt;Workers for Platforms&lt;/a&gt; User Worker.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Define your CI steps with &lt;code&gt;@cloudflare/ci&lt;/code&gt;. Each &lt;code&gt;ci.runner()&lt;/code&gt; spins up an isolated sandbox, and the &lt;code&gt;cache&lt;/code&gt; option reuses installed dependencies across each sandboxed step in your CI job.&lt;/p&gt;
&lt;p&gt;Point &lt;code&gt;cache.inputs&lt;/code&gt; at your lockfile (i.e. &lt;code&gt;pnpm-lock.yaml&lt;/code&gt;, &lt;code&gt;bun.lock&lt;/code&gt;), and the install step only runs again when that lockfile changes:&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure nb-code-figure-titled&quot; data-nb-lang=&quot;js&quot;&gt;&lt;figcaption class=&quot;nb-code-title&quot;&gt;&lt;span class=&quot;nb-code-title-name&quot;&gt;src/index.js&lt;/span&gt;&lt;span class=&quot;nb-code-title-lang&quot;&gt;js&lt;/span&gt;&lt;/figcaption&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; deps&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; ci.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;runner&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	name: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;install&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	command: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;bun install --frozen-lockfile&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	cache: { inputs: [&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;package.json&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;bun.lock&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;] },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; Promise&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;all&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;([&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	deps.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;runner&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({ name: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;lint&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, command: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;bun run lint&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; }),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	deps.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;runner&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({ name: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;test&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, command: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;bun run test&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; }),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	deps.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;runner&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({ name: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;typecheck&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, command: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;bun run typecheck&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; }),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	deps.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;runner&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({ name: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;build&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, command: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;bun run build&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; }),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;]);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; deps.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;runner&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({ name: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;deploy&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, command: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;bun wrangler deploy&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; });&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure nb-code-figure-titled&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;figcaption class=&quot;nb-code-title&quot;&gt;&lt;span class=&quot;nb-code-title-name&quot;&gt;src/index.ts&lt;/span&gt;&lt;span class=&quot;nb-code-title-lang&quot;&gt;ts&lt;/span&gt;&lt;/figcaption&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; deps&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; ci.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;runner&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	name: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;install&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	command: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;bun install --frozen-lockfile&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	cache: { inputs: [&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;package.json&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;bun.lock&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;] },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; Promise&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;all&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;([&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	deps.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;runner&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({ name: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;lint&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, command: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;bun run lint&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; }),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	deps.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;runner&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({ name: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;test&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, command: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;bun run test&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; }),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	deps.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;runner&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({ name: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;typecheck&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, command: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;bun run typecheck&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; }),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	deps.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;runner&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({ name: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;build&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, command: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;bun run build&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; }),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;]);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; deps.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;runner&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({ name: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;deploy&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, command: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;bun wrangler deploy&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; });&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;To start the Workflow automatically after each push, add a &lt;code&gt;cf.artifacts.repo.pushed&lt;/code&gt; trigger to your Wrangler configuration:&lt;/p&gt;
&lt;div data-nb-tabs data-nb-sync-key=&quot;wranglerConfig&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;wrangler.jsonc&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;jsonc&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;	&quot;triggers&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;		&quot;events&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;				&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;cf.artifacts.repo.pushed&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;				&quot;filter&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;					&quot;namespace&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;CI&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;					&quot;repoName&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;my-repo&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;				&quot;target&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;					&quot;scriptName&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;my-ci-worker&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;					&quot;workflowName&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;ci-workflow&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;wrangler.toml&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;toml&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;toml&quot; data-nb-lang=&quot;toml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;[[&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;triggers&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;events&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;]]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;type = &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;cf.artifacts.repo.pushed&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  [&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;triggers&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;events&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;filter&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  namespace = &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;CI&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  repoName = &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;my-repo&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  [&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;triggers&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;events&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;target&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  scriptName = &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;my-ci-worker&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  workflowName = &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;ci-workflow&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.stormtrust.net/home/runner/work/infrastructure/infrastructure/org/apps/developers/src/components/ui/tabs/Tabs.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;
&lt;p&gt;To learn more, refer to &lt;a href=&quot;https://developers.stormtrust.net/artifacts/guides/build-and-deploy-on-push/&quot;&gt;Build and deploy Artifacts repos&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Tue, 04 Aug 2026 00:00:00 GMT</pubDate><product>Artifacts</product><category>Artifacts</category><category>Workflows</category></item><item><title>Workflows - Workflows now supports delay functions when retrying</title><link>https://developers.stormtrust.net/changelog/post/2026-07-09-dynamic-retry-delays/</link><guid isPermaLink="true">https://developers.stormtrust.net/changelog/post/2026-07-09-dynamic-retry-delays/</guid><description>
&lt;p&gt;With &lt;a href=&quot;https://developers.stormtrust.net/workflows/&quot;&gt;Workflows&lt;/a&gt;, you can configure built-in retry behavior for each step. Previously, you could configure step retries with fixed delay durations, such as seconds, minutes, or hours, and backoff strategies such as &lt;code&gt;constant&lt;/code&gt;, &lt;code&gt;linear&lt;/code&gt;, or &lt;code&gt;exponential&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Step retries now support dynamic delay functions. Instead of choosing only a base delay and backoff strategy, pass a function to &lt;code&gt;retries.delay&lt;/code&gt; and calculate the next delay from the failed attempt and thrown error.&lt;/p&gt;
&lt;p&gt;This is useful when retries should depend on the failure. Your Workflow may need to wait longer after a rate-limit error, but retry sooner after a short network failure. The delay function can also accommodate provider guidance if, for example, a downstream API returns a &lt;code&gt;Retry-After&lt;/code&gt; value in its error messaging.&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; step.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;do&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;	&quot;sync customer&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		retries: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			limit: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;			delay&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: ({ &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;ctx&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; }) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;				if&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; (error.message.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;includes&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;rate limit&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;)) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;					return&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; `${&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;ctx&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;attempt&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; *&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 30&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;} seconds`&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;				return&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;10 seconds&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	async&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; () &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		await&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; syncCustomer&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; step.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;do&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;	&quot;sync customer&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		retries: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			limit: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;			delay&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: ({ &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;ctx&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; }) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;				if&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; (error.message.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;includes&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;rate limit&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;)) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;					return&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; `${&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;ctx&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;attempt&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; *&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 30&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;} seconds`&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;				return&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;10 seconds&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	async&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; () &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		await&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; syncCustomer&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.stormtrust.net/home/runner/work/infrastructure/infrastructure/org/apps/developers/src/components/ui/tabs/Tabs.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/div&gt;
&lt;p&gt;Dynamic delay functions can return a duration string, a number, or a promise that resolves to a duration. Use them to add adaptive retry behavior without writing separate queue or scheduling logic. For more information, refer to &lt;a href=&quot;https://developers.stormtrust.net/workflows/build/sleeping-and-retrying/&quot;&gt;Sleeping and retrying&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 09 Jul 2026 12:00:00 GMT</pubDate><product>Workflows</product><category>Workflows</category></item><item><title>Workflows - Workflows pricing adds per-step billing. Step and storage billing to start no earlier than August 10, 2026.</title><link>https://developers.stormtrust.net/changelog/post/2026-07-07-workflows-billing-updates/</link><guid isPermaLink="true">https://developers.stormtrust.net/changelog/post/2026-07-07-workflows-billing-updates/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.stormtrust.net/workflows/&quot;&gt;Workflows&lt;/a&gt; pricing now includes per-step billing. Requests and CPU time billing have been enabled since the initial public beta and is not changing.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;workflows-adds-step-billing&quot;&gt;Workflows adds step billing&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#workflows-adds-step-billing&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;A step is each unit of work executed by a Workflow, including step operations such as &lt;a href=&quot;https://developers.stormtrust.net/workflows/build/sleeping-and-retrying/&quot;&gt;sleeping&lt;/a&gt; or &lt;a href=&quot;https://developers.stormtrust.net/workflows/build/events-and-parameters/&quot;&gt;waiting for events&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;You can query Workflows analytics, including &lt;code&gt;stepCount&lt;/code&gt; for a Workflow instance, with the &lt;a href=&quot;https://developers.stormtrust.net/workflows/observability/metrics-analytics/#query-via-the-graphql-api&quot;&gt;GraphQL Analytics API&lt;/a&gt;.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;steps-and-storage-billing-to-take-effect-august-10th-2026&quot;&gt;Steps and storage billing to take effect August 10th, 2026&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#steps-and-storage-billing-to-take-effect-august-10th-2026&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Starting no earlier than August 10th, 2026, Cloudflare will begin billing for step and storage usage on Workers Paid plans.&lt;/p&gt;
&lt;p&gt;Storage pricing has been published since Workflows became generally available and is not changing.  Storage is measured as persisted Workflow state in GB-months.&lt;/p&gt;
&lt;div class=&quot;table-scroll&quot; tabindex=&quot;0&quot; role=&quot;region&quot; aria-label=&quot;Table&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dimension&lt;/th&gt;
&lt;th&gt;Workers Free&lt;/th&gt;
&lt;th&gt;Workers Paid&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Steps&lt;/td&gt;
&lt;td&gt;3,000 included per day&lt;/td&gt;
&lt;td&gt;500,000 included per month, then $0.80 per additional 100,000 steps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Storage&lt;/td&gt;
&lt;td&gt;1 GB-month included&lt;/td&gt;
&lt;td&gt;1 GB-month included, then $0.20 per additional GB-month&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;Developers on the Workers Free plan will not be charged for steps or storage beyond the included amounts.&lt;/p&gt;
&lt;p&gt;Cloudflare will not bill step and storage usage before August 10, 2026.&lt;/p&gt;
&lt;p&gt;You can review Workflows usage in the &lt;a href=&quot;https://dash.cloudflare.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Cloudflare dashboard&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; before this change takes effect. To reduce costs, consider reducing the number of steps per Workflow or improving the memory efficiency of your stored state.&lt;/p&gt;
&lt;p&gt;Refer to the &lt;a href=&quot;https://developers.stormtrust.net/workflows/reference/pricing/&quot;&gt;Workflows pricing&lt;/a&gt; page for full details.&lt;/p&gt;</description><pubDate>Tue, 07 Jul 2026 12:00:00 GMT</pubDate><product>Workflows</product><category>Workflows</category></item><item><title>Workflows - Workflows rollback handlers now include step context</title><link>https://developers.stormtrust.net/changelog/post/2026-06-16-rollback-options/</link><guid isPermaLink="true">https://developers.stormtrust.net/changelog/post/2026-06-16-rollback-options/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.stormtrust.net/workflows/&quot;&gt;Workflows&lt;/a&gt; makes it easier to build reliable multi-step applications that can recover when downstream systems fail. Rollback handlers now receive the original &lt;a href=&quot;https://developers.stormtrust.net/workflows/build/step-context/&quot;&gt;step context&lt;/a&gt; via a &lt;code&gt;ctx&lt;/code&gt; object for the step being rolled back. This includes &lt;code&gt;ctx.step.name&lt;/code&gt;, &lt;code&gt;ctx.step.count&lt;/code&gt;, &lt;code&gt;ctx.attempt&lt;/code&gt;, and the step &lt;code&gt;config&lt;/code&gt; with defaults applied.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;https://developers.stormtrust.net/workflows/build/workers-api/#workflowstepconfig&quot;&gt;step configuration&lt;/a&gt; includes the retry and timeout settings used for that step, so you can customize your step recovery logic according to those fields.&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; step.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;do&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;	&quot;create charge&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	async&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; () &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; charge&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; createCharge&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { chargeId: charge.id };&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;		rollback&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;async&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; ({ &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;ctx&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;output&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; }) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;			// `output` is the value returned by the step being rolled back.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;			const&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;chargeId&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; output &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;as&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;chargeId&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; string&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; };&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;			await&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; refundCharge&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(chargeId, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;				// `ctx` is the original step context, including step name, count, attempt, and config.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				reason: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;`${&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;ctx&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;step&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;}: ${&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;message&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;}`&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		rollbackConfig: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;			// `rollbackConfig` controls retries and timeout for the rollback handler.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			retries: { limit: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, delay: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;30 seconds&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, backoff: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;linear&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			timeout: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;5 minutes&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Refer to &lt;a href=&quot;https://developers.stormtrust.net/workflows/build/workers-api/#rollback-options&quot;&gt;rollback options&lt;/a&gt; to learn more.&lt;/p&gt;</description><pubDate>Tue, 23 Jun 2026 12:00:00 GMT</pubDate><product>Workflows</product><category>Workflows</category></item><item><title>Workflows - Rollback support now available in Workflows</title><link>https://developers.stormtrust.net/changelog/post/2026-06-05-saga-rollbacks/</link><guid isPermaLink="true">https://developers.stormtrust.net/changelog/post/2026-06-05-saga-rollbacks/</guid><description>
&lt;p&gt;&lt;a href=&quot;https://developers.stormtrust.net/workflows/&quot;&gt;Workflows&lt;/a&gt; now supports saga-style rollbacks,  allowing you to add compensating logic to each &lt;code&gt;step.do()&lt;/code&gt; in case of downstream failures. If the instance fails, the rollback handlers will execute in reverse &lt;code&gt;step-start&lt;/code&gt; order.&lt;/p&gt;
&lt;p&gt;This is useful for multi-step operations that touch external systems, such as inventory reservations, payment authorization, ticket creation, or infrastructure provisioning. Instead of writing all cleanup logic in a top-level &lt;code&gt;catch&lt;/code&gt;, you can keep each compensating action next to the step it undoes.&lt;/p&gt;
&lt;p&gt;Rollback handlers support their own retry and timeout configuration, and Workflows now exposes rollback outcomes in instance status responses. Workflows analytics also emits rollback lifecycle events, making it easier to distinguish a forward execution failure from a rollback failure when debugging production workflows.&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; step.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;do&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;	&quot;provision resource&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	async&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; () &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; resource&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; provisionResource&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { resourceId: resource.id };&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;		rollback&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;async&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; ({ &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;output&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; }) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;			const&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;resourceId&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; output;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;			await&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; deleteResource&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(resourceId);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		rollbackConfig: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			retries: { limit: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, delay: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;15 seconds&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, backoff: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;linear&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			timeout: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;2 minutes&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; step.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;do&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;	&quot;provision resource&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	async&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; () &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; resource&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; provisionResource&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { resourceId: resource.id };&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;		rollback&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;async&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; ({ &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;output&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; }) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;			const&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;resourceId&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; output &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;as&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;resourceId&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; string&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; };&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;			await&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; deleteResource&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(resourceId);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		rollbackConfig: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			retries: { limit: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, delay: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;15 seconds&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, backoff: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;linear&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			timeout: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;2 minutes&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.stormtrust.net/home/runner/work/infrastructure/infrastructure/org/apps/developers/src/components/ui/tabs/Tabs.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/div&gt;
&lt;p&gt;Refer to &lt;a href=&quot;https://developers.stormtrust.net/workflows/build/workers-api/#rollback-options&quot;&gt;rollback options&lt;/a&gt; to learn more.&lt;/p&gt;</description><pubDate>Fri, 05 Jun 2026 15:00:00 GMT</pubDate><product>Workflows</product><category>Workflows</category></item><item><title>Workflows, Workers - Schedule Workflow instances directly from your Workflow binding</title><link>https://developers.stormtrust.net/changelog/post/2026-06-02-cron-workflows/</link><guid isPermaLink="true">https://developers.stormtrust.net/changelog/post/2026-06-02-cron-workflows/</guid><description>&lt;p&gt;You can now attach cron schedules directly to a Workflow binding in &lt;code&gt;wrangler.jsonc&lt;/code&gt;. Each scheduled run creates a new Workflow instance automatically, so you do not need to define a separate Worker with a &lt;code&gt;scheduled&lt;/code&gt; handler just to trigger your Workflow on an interval.&lt;/p&gt;
&lt;p&gt;For example, you can configure hourly, every-15-minute, or weekday schedules on the same Workflow:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;jsonc&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;	&quot;workflows&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;			&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;my-scheduled-workflow&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;			&quot;binding&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;MY_WORKFLOW&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;			&quot;class_name&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;MyScheduledWorkflow&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;			&quot;schedules&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: [&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;0 * * * *&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;*/15 * * * *&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;0 9 * * MON-FRI&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Cron workloads get all the same benefits of Workflows with built-in retries, multi-step durable execution, and configurable timeouts of Workflows.&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	WorkflowEntrypoint,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	WorkflowEvent,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	WorkflowStep,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;} &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;cloudflare:workers&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Runs automatically on each cron schedule defined for the MY_WORKFLOW binding in wrangler.jsonc.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; class&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; MyScheduledWorkflow&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; extends&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; WorkflowEntrypoint&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;Env&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; run&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;event&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; WorkflowEvent&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;step&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; WorkflowStep&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; data&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; step.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;do&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;fetch source data&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;async&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; () &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;			return&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; fetchSourceData&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;		// If this step fails, only this step is retried with the custom logic below&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; step.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;do&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;			&quot;process and store results&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				retries: { limit: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, delay: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;30 seconds&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, backoff: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;exponential&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				timeout: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;10 minutes&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;			async&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; () &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;				await&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; processAndStore&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(data);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;This makes it easier to build recurring, scheduled jobs such as database backups, invoice generation, report aggregation, and cleanup tasks without wiring up a separate Cron Trigger entrypoint.&lt;/p&gt;
&lt;p&gt;For more information, refer to &lt;a href=&quot;https://developers.stormtrust.net/workflows/build/trigger-workflows/&quot;&gt;Trigger Workflows&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Tue, 02 Jun 2026 15:00:00 GMT</pubDate><product>Workflows</product><category>Workflows</category><category>Workers</category></item><item><title>Workflows, Workers - Run Workflows inside Dynamic Workers with the @cloudflare/dynamic-workflows library</title><link>https://developers.stormtrust.net/changelog/post/2026-05-01-dynamic-workflows/</link><guid isPermaLink="true">https://developers.stormtrust.net/changelog/post/2026-05-01-dynamic-workflows/</guid><description>&lt;p&gt;You can now use &lt;a href=&quot;https://github.com/cloudflare/dynamic-workflows&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;@cloudflare/dynamic-workflows&lt;/code&gt;&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; to run a &lt;a href=&quot;https://developers.stormtrust.net/workflows/&quot;&gt;Workflow&lt;/a&gt; inside a &lt;a href=&quot;https://developers.stormtrust.net/dynamic-workers/&quot;&gt;Dynamic Worker&lt;/a&gt;, ensuring durable execution for code that is loaded at runtime.&lt;/p&gt;
&lt;p&gt;The Worker Loader loads Dynamic Workers on demand, which previously made durability challenging. Even within a Dynamic Worker, a Workflow might sleep for hours or days between steps, and by the time it resumes, the original Dynamic Worker code would no longer be in memory.&lt;/p&gt;
&lt;p&gt;The library solves this by tagging each Workflow instance with metadata that identifies which Dynamic Worker to load — for example, a tenant ID — then reloading the matching Dynamic Worker through the Worker Loader whenever a Workflow awakens.&lt;/p&gt;
&lt;p&gt;Because Dynamic Workers are created on-demand, you do not have to register each Workflow up front or manage them individually. Load the Workflow code in the Dynamic Worker when it is needed, and the Workflows engine handles persistence and retries behind the scenes. Your Workflow code itself is unaffected by the routing and behaves as normal.&lt;/p&gt;
&lt;p&gt;This unlocks patterns where the Workflow code itself is dynamic. For example, this is useful with:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;SaaS platforms&lt;/strong&gt; where each tenant defines their own automation, such as onboarding sequences, approval chains, or billing retry logic.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AI agent frameworks&lt;/strong&gt; where agents generate and execute multi-step plans at runtime, surviving restarts and waiting for human approval between tool calls.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Multi-tenant job systems&lt;/strong&gt; where each customer submits their own processing logic and every step persists progress and retries on failure.&lt;/li&gt;
&lt;/ul&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	createDynamicWorkflowEntrypoint,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	DynamicWorkflowBinding,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	wrapWorkflowBinding,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	type&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; WorkflowRunner,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;} &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;@cloudflare/dynamic-workflows&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { DynamicWorkflowBinding };&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;interface&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Env&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;	WORKFLOWS&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Workflow&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;	LOADER&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; WorkerLoader&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; loadTenant&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;env&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Env&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;tenantId&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; string&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	return&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;LOADER&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(tenantId, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;async&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; () &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; ({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		compatibilityDate: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;2026-01-01&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		mainModule: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;index.js&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		modules: { &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;index.js&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; fetchTenantCode&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(tenantId) },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;		// The Dynamic Worker uses this exactly like a real Workflow binding;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;		// every create() is tagged with { tenantId } automatically.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		env: { WORKFLOWS: &lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;wrapWorkflowBinding&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({ tenantId }) },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	}));&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// The entrypoint name must match `class_name` in the workflows binding of your Wrangler config file.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; DynamicWorkflow&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; createDynamicWorkflowEntrypoint&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;Env&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	async&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; ({ &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;env&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;metadata&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; }) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; stub&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; loadTenant&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(env, metadata.tenantId &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;as&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; string&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; stub.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;getEntrypoint&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;TenantWorkflow&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;as&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; unknown&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; as&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; WorkflowRunner&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; default&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;	fetch&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Request&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;env&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Env&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; tenantId&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; request.headers.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;x-tenant-id&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; loadTenant&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(env, tenantId).&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;getEntrypoint&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;fetch&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(request);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;For a full walkthrough, refer to the &lt;a href=&quot;https://developers.stormtrust.net/dynamic-workers/usage/dynamic-workflows/&quot;&gt;Dynamic Workflows guide&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Fri, 01 May 2026 00:00:00 GMT</pubDate><product>Workflows</product><category>Workflows</category><category>Workers</category></item><item><title>Workflows - Additional step context and ReadableStream support now available in Workflows step.do()</title><link>https://developers.stormtrust.net/changelog/post/2026-04-21-step-context-and-readable-streams/</link><guid isPermaLink="true">https://developers.stormtrust.net/changelog/post/2026-04-21-step-context-and-readable-streams/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.stormtrust.net/workflows/&quot;&gt;Workflows&lt;/a&gt; now provides additional context inside &lt;code&gt;step.do()&lt;/code&gt; callbacks and supports returning &lt;code&gt;ReadableStream&lt;/code&gt; to handle larger step outputs.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;step-context-properties&quot;&gt;Step context properties&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#step-context-properties&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;The &lt;code&gt;step.do()&lt;/code&gt; callback receives a context object with new properties &lt;a href=&quot;https://developers.stormtrust.net/changelog/post/2026-03-06-step-context-available/&quot;&gt;alongside&lt;/a&gt; &lt;code&gt;attempt&lt;/code&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;step.name&lt;/code&gt;&lt;/strong&gt; — The name passed to &lt;code&gt;step.do()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;step.count&lt;/code&gt;&lt;/strong&gt; — How many times a step with that name has been invoked in this instance (1-indexed)
&lt;ul&gt;
&lt;li&gt;Useful when running the same step in a loop.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;config&lt;/code&gt;&lt;/strong&gt; — The resolved step configuration, including &lt;code&gt;timeout&lt;/code&gt; and &lt;code&gt;retries&lt;/code&gt; with defaults applied&lt;/li&gt;
&lt;/ul&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; ResolvedStepConfig&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;	retries&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;		limit&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; number&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;		delay&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; WorkflowDelayDuration&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; number&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;		backoff&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;?:&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;constant&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;linear&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;exponential&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	};&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;	timeout&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; WorkflowTimeoutDuration&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; number&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;};&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; WorkflowStepContext&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;	step&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;		name&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; string&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;		count&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; number&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	};&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;	attempt&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; number&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;	config&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; ResolvedStepConfig&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;readablestream-support-in-stepdo&quot;&gt;ReadableStream support in &lt;code&gt;step.do()&lt;/code&gt;&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#readablestream-support-in-stepdo&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Steps can now return a &lt;code&gt;ReadableStream&lt;/code&gt; directly. Although non-stream step outputs are &lt;a href=&quot;https://developers.stormtrust.net/workflows/reference/limits/&quot;&gt;limited to 1 MiB&lt;/a&gt;, streamed outputs support much larger payloads.&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; largePayload&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; step.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;do&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;fetch-large-file&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;async&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; () &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; object&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;MY_BUCKET&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;large-file.bin&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	return&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; object.body;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Note that streamed outputs are still considered part of the Workflow instance storage limit.&lt;/p&gt;</description><pubDate>Tue, 21 Apr 2026 12:00:00 GMT</pubDate><product>Workflows</product><category>Workflows</category></item><item><title>Workflows, Workers - Increased concurrency, creation rate, and queued instance limits for Workflows instances</title><link>https://developers.stormtrust.net/changelog/post/2026-04-15-workflows-limits-raised/</link><guid isPermaLink="true">https://developers.stormtrust.net/changelog/post/2026-04-15-workflows-limits-raised/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.stormtrust.net/workflows/&quot;&gt;Workflows&lt;/a&gt; limits have been raised to the following:&lt;/p&gt;
&lt;div class=&quot;table-scroll&quot; tabindex=&quot;0&quot; role=&quot;region&quot; aria-label=&quot;Table&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Limit&lt;/th&gt;
&lt;th&gt;Previous&lt;/th&gt;
&lt;th&gt;New&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Concurrent instances (running in parallel)&lt;/td&gt;
&lt;td&gt;10,000&lt;/td&gt;
&lt;td&gt;50,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Instance creation rate (per account)&lt;/td&gt;
&lt;td&gt;100/second per account&lt;/td&gt;
&lt;td&gt;300/second per account, 100/second per workflow&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Queued instances per Workflow &lt;sup&gt;&lt;a href=&quot;#user-content-fn-1&quot; id=&quot;user-content-fnref-1&quot; data-footnote-ref aria-describedby=&quot;footnote-label&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/td&gt;
&lt;td&gt;1 million&lt;/td&gt;
&lt;td&gt;2 million&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;These increases apply to all users on the &lt;a href=&quot;https://developers.stormtrust.net/workers/platform/pricing/&quot;&gt;Workers Paid plan&lt;/a&gt;. Refer to the &lt;a href=&quot;https://developers.stormtrust.net/workflows/reference/limits/&quot;&gt;Workflows limits documentation&lt;/a&gt; for more details.&lt;/p&gt;
&lt;section data-footnotes class=&quot;footnotes&quot;&gt;&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 class=&quot;sr-only&quot; id=&quot;footnote-label&quot;&gt;Footnotes&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#footnote-label&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ol&gt;
&lt;li id=&quot;user-content-fn-1&quot;&gt;
&lt;p&gt;Queued instances are instances that have been created or awoken and are waiting for a concurrency slot. &lt;a href=&quot;#user-content-fnref-1&quot; data-footnote-backref=&quot;&quot; aria-label=&quot;Back to reference 1&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;</description><pubDate>Wed, 15 Apr 2026 13:00:00 GMT</pubDate><product>Workflows</product><category>Workflows</category><category>Workers</category></item><item><title>Workflows, Workers - All Wrangler commands for Workflows now support local development</title><link>https://developers.stormtrust.net/changelog/post/2026-04-01-wrangler-workflows-local/</link><guid isPermaLink="true">https://developers.stormtrust.net/changelog/post/2026-04-01-wrangler-workflows-local/</guid><description>&lt;p&gt;All &lt;code&gt;wrangler workflows&lt;/code&gt; commands now accept a &lt;code&gt;--local&lt;/code&gt; flag to target a Workflow running in a local &lt;code&gt;wrangler dev&lt;/code&gt; session instead of the production API.&lt;/p&gt;
&lt;p&gt;You can now manage the full Workflow lifecycle locally, including triggering Workflows, listing instances, pausing, resuming, restarting, terminating, and sending events:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;npx&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; wrangler&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; workflows&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; list&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; --local&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;npx&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; wrangler&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; workflows&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; trigger&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; my-workflow&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; --local&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;npx&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; wrangler&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; workflows&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; instances&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; list&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; my-workflow&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; --local&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;npx&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; wrangler&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; workflows&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; instances&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; pause&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; my-workflow&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;INSTANCE_I&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;D&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; --local&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;npx&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; wrangler&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; workflows&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; instances&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; send-event&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; my-workflow&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;INSTANCE_I&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;D&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; --type&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; my-event&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; --local&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;All commands also accept &lt;code&gt;--port&lt;/code&gt; to target a specific &lt;code&gt;wrangler dev&lt;/code&gt; session (defaults to &lt;code&gt;8787&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;For more information, refer to &lt;a href=&quot;https://developers.stormtrust.net/workflows/build/local-development/&quot;&gt;Workflows local development&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Wed, 01 Apr 2026 12:00:00 GMT</pubDate><product>Workflows</product><category>Workflows</category><category>Workers</category></item><item><title>Workflows, Workers - Workflow instances now support pause(), resume(), restart(), and terminate() methods in local development</title><link>https://developers.stormtrust.net/changelog/post/2026-03-23-local-dev-instance-methods/</link><guid isPermaLink="true">https://developers.stormtrust.net/changelog/post/2026-03-23-local-dev-instance-methods/</guid><description>&lt;p&gt;Workflow instance methods &lt;code&gt;pause()&lt;/code&gt;, &lt;code&gt;resume()&lt;/code&gt;, &lt;code&gt;restart()&lt;/code&gt;, and &lt;code&gt;terminate()&lt;/code&gt; are now available in local development when using &lt;code&gt;wrangler dev&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;You can now test the full Workflow instance lifecycle locally:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; instance&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;MY_WORKFLOW&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;create&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	id: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;my-instance-id&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; instance.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;pause&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(); &lt;/span&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// pauses a running workflow instance&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; instance.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;resume&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(); &lt;/span&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// resumes a paused instance&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; instance.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;restart&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(); &lt;/span&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// restarts the instance from the beginning&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; instance.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;terminate&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(); &lt;/span&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// terminates the instance immediately&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;</description><pubDate>Mon, 23 Mar 2026 12:00:00 GMT</pubDate><product>Workflows</product><category>Workflows</category><category>Workers</category></item><item><title>Workflows, Workers - Workflow steps now expose retry attempt number via step context</title><link>https://developers.stormtrust.net/changelog/post/2026-03-06-step-context-available/</link><guid isPermaLink="true">https://developers.stormtrust.net/changelog/post/2026-03-06-step-context-available/</guid><description>&lt;p&gt;Cloudflare Workflows allows you to configure specific retry logic for each step in your workflow execution. Now, you can access &lt;strong&gt;which&lt;/strong&gt; retry attempt is currently executing for calls to &lt;code&gt;step.do()&lt;/code&gt;:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; step.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;do&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;my-step&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;async&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;ctx&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;	// ctx.attempt is 1 on first try, 2 on first retry, etc.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	console.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;`Attempt ${&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;ctx&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;attempt&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;}`&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;You can use the step context for improved logging &amp;amp; observability, progressive backoff, or conditional logic in your workflow definition.&lt;/p&gt;
&lt;p&gt;Note that the current attempt number is 1-indexed. For more information on retry behavior, refer to &lt;a href=&quot;https://developers.stormtrust.net/workflows/build/sleeping-and-retrying/&quot;&gt;Sleeping and Retrying&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Fri, 06 Mar 2026 12:00:00 GMT</pubDate><product>Workflows</product><category>Workflows</category><category>Workers</category></item><item><title>Workflows, Workers - Workflows step limit increased to 25,000 steps per instance</title><link>https://developers.stormtrust.net/changelog/post/2026-03-03-step-limits-to-25k/</link><guid isPermaLink="true">https://developers.stormtrust.net/changelog/post/2026-03-03-step-limits-to-25k/</guid><description>&lt;p&gt;Each Workflow on Workers Paid now supports 10,000 steps by default, configurable up to 25,000 steps in your &lt;code&gt;wrangler.jsonc&lt;/code&gt; file:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;json&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;json&quot; data-nb-lang=&quot;json&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;	&quot;workflows&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;			&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;my-workflow&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;			&quot;binding&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;MY_WORKFLOW&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;			&quot;class_name&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;MyWorkflow&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;			&quot;limits&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;				&quot;steps&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;25000&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Previously, each instance was limited to 1,024 steps. Now, Workflows can support more complex, long-running executions without the additional complexity of recursive or child workflow calls.&lt;/p&gt;
&lt;p&gt;Note that the maximum persisted state limit per Workflow instance remains &lt;strong&gt;100 MB&lt;/strong&gt; for Workers Free and &lt;strong&gt;1 GB&lt;/strong&gt; for Workers Paid. Refer to &lt;a href=&quot;https://developers.stormtrust.net/workflows/reference/limits/&quot;&gt;Workflows limits&lt;/a&gt; for more information.&lt;/p&gt;</description><pubDate>Tue, 03 Mar 2026 12:00:00 GMT</pubDate><product>Workflows</product><category>Workflows</category><category>Workers</category></item><item><title>Workflows, Workers - Visualize your Workflows in the Cloudflare dashboard</title><link>https://developers.stormtrust.net/changelog/post/2026-02-03-workflows-visualizer/</link><guid isPermaLink="true">https://developers.stormtrust.net/changelog/post/2026-02-03-workflows-visualizer/</guid><description>&lt;p&gt;Cloudflare Workflows now automatically generates visual diagrams from your code&lt;/p&gt;
&lt;p&gt;Your Workflow is parsed to provide a visual map of the Workflow structure, allowing you to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Understand how steps connect and execute&lt;/li&gt;
&lt;li&gt;Visualize loops and nested logic&lt;/li&gt;
&lt;li&gt;Follow branching paths for conditional logic&lt;/li&gt;
&lt;/ul&gt;
&lt;img src=&quot;https://developers.stormtrust.net/cdn-cgi/image/onerror=redirect,width=1927,height=1530,format=webp/_astro/2026-02-03-workflows-diagram.BfQAnWL3.png&quot; alt=&quot;Example diagram&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1927&quot; height=&quot;1530&quot;&gt;
&lt;p&gt;You can collapse loops and nested logic to see the high-level flow, or expand them to see every step.&lt;/p&gt;
&lt;p&gt;Workflow diagrams are available in beta for all JavaScript and TypeScript Workflows. Find your Workflows in the &lt;a href=&quot;https://dash.cloudflare.com/?to=/:account/workers/workflows&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Cloudflare dashboard&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; to see their diagrams.&lt;/p&gt;</description><pubDate>Wed, 04 Feb 2026 00:00:00 GMT</pubDate><product>Workflows</product><category>Workflows</category><category>Workers</category></item><item><title>Agents, Workflows - Agents SDK v0.3.7: Workflows integration, synchronous state, and scheduleEvery()</title><link>https://developers.stormtrust.net/changelog/post/2026-02-03-agents-workflows-integration/</link><guid isPermaLink="true">https://developers.stormtrust.net/changelog/post/2026-02-03-agents-workflows-integration/</guid><description>
&lt;p&gt;The latest release of the &lt;a href=&quot;https://github.com/cloudflare/agents&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Agents SDK&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; brings first-class support for &lt;a href=&quot;https://developers.stormtrust.net/workflows/&quot;&gt;Cloudflare Workflows&lt;/a&gt;, synchronous state management, and new scheduling capabilities.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;cloudflare-workflows-integration&quot;&gt;Cloudflare Workflows integration&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#cloudflare-workflows-integration&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Agents excel at real-time communication and state management. Workflows excel at durable execution. Together, they enable powerful patterns where Agents handle WebSocket connections while Workflows handle long-running tasks, retries, and human-in-the-loop flows.&lt;/p&gt;
&lt;p&gt;Use the new &lt;code&gt;AgentWorkflow&lt;/code&gt; class to define workflows with typed access to your Agent:&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { AgentWorkflow } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;agents/workflows&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; class&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; ProcessingWorkflow&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; extends&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; AgentWorkflow&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; run&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;event&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;step&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;		// Call Agent methods via RPC&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		await&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.agent.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;updateStatus&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(event.payload.taskId, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;processing&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;		// Non-durable: progress reporting to clients&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		await&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;reportProgress&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({ step: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;process&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, percent: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;0.5&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;		this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;broadcastToClients&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({ type: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;update&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, taskId: event.payload.taskId });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;		// Durable via step: idempotent, won&apos;t repeat on retry&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; step.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;mergeAgentState&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({ taskProgress: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;0.5&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; result&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; step.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;do&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;process&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;async&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; () &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;			return&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; processData&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(event.payload.data);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; step.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;reportComplete&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(result);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; result;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { AgentWorkflow } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;agents/workflows&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; type&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { AgentWorkflowEvent, AgentWorkflowStep } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;agents/workflows&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; class&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; ProcessingWorkflow&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; extends&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; AgentWorkflow&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;MyAgent&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;TaskParams&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; run&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;event&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; AgentWorkflowEvent&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;TaskParams&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;step&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; AgentWorkflowStep&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;		// Call Agent methods via RPC&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		await&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.agent.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;updateStatus&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(event.payload.taskId, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;processing&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;		// Non-durable: progress reporting to clients&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		await&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;reportProgress&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({ step: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;process&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, percent: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;0.5&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;		this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;broadcastToClients&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({ type: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;update&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, taskId: event.payload.taskId });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;		// Durable via step: idempotent, won&apos;t repeat on retry&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; step.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;mergeAgentState&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({ taskProgress: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;0.5&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; result&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; step.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;do&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;process&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;async&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; () &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;			return&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; processData&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(event.payload.data);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; step.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;reportComplete&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(result);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; result;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.stormtrust.net/home/runner/work/infrastructure/infrastructure/org/apps/developers/src/components/ui/tabs/Tabs.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/div&gt;
&lt;p&gt;Start workflows from your Agent with &lt;code&gt;runWorkflow()&lt;/code&gt; and handle lifecycle events:&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; class&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; MyAgent&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; extends&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Agent&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; startTask&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;taskId&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; instanceId&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;runWorkflow&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;PROCESSING_WORKFLOW&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			taskId,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			data,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { instanceId };&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; onWorkflowProgress&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;workflowName&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;instanceId&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;progress&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;		this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;broadcast&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;JSON&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;stringify&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({ type: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;progress&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, progress }));&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; onWorkflowComplete&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;workflowName&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;instanceId&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;result&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		console.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;`Workflow ${&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;instanceId&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;} completed`&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; onWorkflowError&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;workflowName&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;instanceId&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		console.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;`Workflow ${&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;instanceId&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;} failed:`&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, error);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; class&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; MyAgent&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; extends&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Agent&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; startTask&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;taskId&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; string&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; string&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; instanceId&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;runWorkflow&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;PROCESSING_WORKFLOW&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			taskId,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			data,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { instanceId };&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; onWorkflowProgress&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;		workflowName&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; string&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;		instanceId&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; string&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;		progress&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; unknown&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;		this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;broadcast&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;JSON&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;stringify&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({ type: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;progress&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, progress }));&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; onWorkflowComplete&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;		workflowName&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; string&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;		instanceId&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; string&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;		result&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;?:&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; unknown&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		console.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;`Workflow ${&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;instanceId&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;} completed`&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; onWorkflowError&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;		workflowName&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; string&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;		instanceId&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; string&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;		error&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; unknown&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		console.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;`Workflow ${&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;instanceId&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;} failed:`&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, error);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Key workflow methods on your Agent:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;runWorkflow(workflowName, params, options?)&lt;/code&gt; — Start a workflow with optional metadata&lt;/li&gt;
&lt;li&gt;&lt;code&gt;getWorkflow(workflowId)&lt;/code&gt; / &lt;code&gt;getWorkflows(criteria?)&lt;/code&gt; — Query workflows with cursor-based pagination&lt;/li&gt;
&lt;li&gt;&lt;code&gt;approveWorkflow(workflowId)&lt;/code&gt; / &lt;code&gt;rejectWorkflow(workflowId)&lt;/code&gt; — Human-in-the-loop approval flows&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pauseWorkflow()&lt;/code&gt;, &lt;code&gt;resumeWorkflow()&lt;/code&gt;, &lt;code&gt;terminateWorkflow()&lt;/code&gt; — Workflow control&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;synchronous-setstate&quot;&gt;Synchronous setState()&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#synchronous-setstate&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;State updates are now synchronous with a new &lt;code&gt;validateStateChange()&lt;/code&gt; validation hook:&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; class&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; MyAgent&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; extends&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Agent&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;	validateStateChange&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;oldState&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;newState&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;		// Return false to reject the change&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		if&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; (newState.count &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 0&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; false&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;		// Return modified state to transform&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;...&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;newState, lastUpdated: Date.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;now&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;() };&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; class&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; MyAgent&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; extends&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Agent&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;Env&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;State&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;	validateStateChange&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;oldState&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; State&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;newState&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; State&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; State&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; false&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;		// Return false to reject the change&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		if&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; (newState.count &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 0&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; false&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;		// Return modified state to transform&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;...&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;newState, lastUpdated: Date.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;now&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;() };&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;scheduleevery-for-recurring-tasks&quot;&gt;scheduleEvery() for recurring tasks&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#scheduleevery-for-recurring-tasks&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;The new &lt;code&gt;scheduleEvery()&lt;/code&gt; method enables fixed-interval recurring tasks with built-in overlap prevention:&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Run every 5 minutes&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;scheduleEvery&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;syncData&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; *&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 60&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; *&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 1000&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, { source: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;api&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; });&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Run every 5 minutes&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;scheduleEvery&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;syncData&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; *&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 60&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; *&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 1000&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, { source: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;api&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; });&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;callable-system-improvements&quot;&gt;Callable system improvements&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#callable-system-improvements&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Client-side RPC timeout&lt;/strong&gt; — Set timeouts on callable method invocations&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;StreamingResponse.error(message)&lt;/code&gt;&lt;/strong&gt; — Graceful stream error signaling&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;getCallableMethods()&lt;/code&gt;&lt;/strong&gt; — Introspection API for discovering callable methods&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Connection close handling&lt;/strong&gt; — Pending calls are automatically rejected on disconnect&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; agent.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;call&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;method&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, [args], {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	timeout: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;5000&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	stream: { onChunk, onDone, onError },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; agent.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;call&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;method&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, [args], {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	timeout: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;5000&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	stream: { onChunk, onDone, onError },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;email-and-routing-enhancements&quot;&gt;Email and routing enhancements&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#email-and-routing-enhancements&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Secure email reply routing&lt;/strong&gt; — Email replies are now secured with HMAC-SHA256 signed headers, preventing unauthorized routing of emails to agent instances.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Routing improvements:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;basePath&lt;/code&gt; option to bypass default URL construction for custom routing&lt;/li&gt;
&lt;li&gt;Server-sent identity — Agents send &lt;code&gt;name&lt;/code&gt; and &lt;code&gt;agent&lt;/code&gt; type on connect&lt;/li&gt;
&lt;li&gt;New &lt;code&gt;onIdentity&lt;/code&gt; and &lt;code&gt;onIdentityChange&lt;/code&gt; callbacks on the client&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; agent&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; useAgent&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	basePath: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;user&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;	onIdentity&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: (&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;agentType&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; console.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;`Connected to ${&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;}`&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; agent&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; useAgent&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	basePath: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;user&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;	onIdentity&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: (&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;agentType&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; console.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;`Connected to ${&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;}`&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;upgrade&quot;&gt;Upgrade&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#upgrade&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;To update to the latest version:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;npm&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; i&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; agents@latest&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;For the complete Workflows API reference and patterns, see &lt;a href=&quot;https://developers.stormtrust.net/agents/runtime/execution/run-workflows/&quot;&gt;Run Workflows&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Tue, 03 Feb 2026 00:00:00 GMT</pubDate><product>Agents</product><category>Agents</category><category>Workflows</category></item><item><title>Workflows, Workers - Increased Workflows instance and concurrency limits</title><link>https://developers.stormtrust.net/changelog/post/2025-10-28-raising-limits/</link><guid isPermaLink="true">https://developers.stormtrust.net/changelog/post/2025-10-28-raising-limits/</guid><description>&lt;p&gt;We&apos;ve raised the &lt;a href=&quot;https://developers.stormtrust.net/workflows/&quot;&gt;Cloudflare Workflows&lt;/a&gt; account-level limits for all accounts on the &lt;a href=&quot;https://developers.stormtrust.net/workers/platform/pricing/&quot;&gt;Workers paid plan&lt;/a&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Instance creation rate&lt;/strong&gt; increased from 100 workflow instances per 10 seconds to 100 instances per second&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Concurrency limit&lt;/strong&gt; increased from 4,500 to 10,000 workflow instances per account&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These increases mean you can create new instances up to 10x faster, and have more workflow instances concurrently executing. To learn more and get started with Workflows, refer to &lt;a href=&quot;https://developers.stormtrust.net/workflows/get-started/guide/&quot;&gt;the getting started guide&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If your application requires a higher limit, fill out the &lt;a href=&quot;https://developers.stormtrust.net/workers/platform/limits/&quot;&gt;Limit Increase Request Form&lt;/a&gt; or contact your account team. Please refer to &lt;a href=&quot;https://developers.stormtrust.net/workflows/reference/pricing/&quot;&gt;Workflows pricing&lt;/a&gt; for more information.&lt;/p&gt;</description><pubDate>Fri, 31 Oct 2025 00:00:00 GMT</pubDate><product>Workflows</product><category>Workflows</category><category>Workers</category></item><item><title>Workflows, Workers - Build durable multi-step applications in Python with Workflows (now in beta)</title><link>https://developers.stormtrust.net/changelog/post/2025-08-22-workflows-python-beta/</link><guid isPermaLink="true">https://developers.stormtrust.net/changelog/post/2025-08-22-workflows-python-beta/</guid><description>
&lt;p&gt;You can now build &lt;a href=&quot;https://developers.stormtrust.net/workflows/&quot;&gt;Workflows&lt;/a&gt; using Python. With Python Workflows, you get automatic retries, state persistence, and the ability to run multi-step operations that can span minutes, hours, or weeks using Python’s familiar syntax and the &lt;a href=&quot;https://developers.stormtrust.net/workers/languages/python/&quot;&gt;Python Workers&lt;/a&gt; runtime.&lt;/p&gt;
&lt;p&gt;Python Workflows use the same step-based execution model as JavaScript Workflows, but with Python syntax and access to Python’s ecosystem. Python Workflows also enable &lt;a href=&quot;https://developers.stormtrust.net/workflows/python/dag/&quot;&gt;DAG (Directed Acyclic Graph) workflows&lt;/a&gt;, where you can define complex dependencies between steps using the depends parameter.&lt;/p&gt;
&lt;p&gt;Here’s a simple example:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;python&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;python&quot; data-nb-lang=&quot;python&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; workers &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; Response, WorkflowEntrypoint&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; PythonWorkflowStarter&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;WorkflowEntrypoint&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;    async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; def&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; run&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(self, event, step):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;        @step.do&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;my first step&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;        async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; def&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; my_first_step&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;():&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;            # do some work&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;            return&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;Hello Python!&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;        await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; my_first_step()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;        await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; step.sleep(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;my-sleep-step&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;10 seconds&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;        @step.do&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;my second step&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;        async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; def&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; my_second_step&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;():&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;            # do some more work&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;            return&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;Hello again!&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;        await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; my_second_step()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Default&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;WorkerEntrypoint&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;    async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; def&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; fetch&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(self, request):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;        await&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; self&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;MY_WORKFLOW&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.create()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;        return&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; Response(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Hello Workflow creation!&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;aside role=&quot;note&quot; aria-label=&quot;Note&quot; class=&quot;aside-card flex items-start gap-3 rounded-lg px-4 py-3 my-4&quot; style=&quot;--_c: var(--nb-info); --_t: var(--nb-info-muted);&quot; data-astro-cid-znle5jil&gt;&lt;span class=&quot;flex h-[1.375em] shrink-0 items-center&quot; aria-hidden=&quot;true&quot; data-astro-cid-znle5jil&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;h-[1em] w-[1em]&quot; data-astro-cid-znle5jil=&quot;true&quot; data-icon=&quot;ph:info&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M128 24a104 104 0 1 0 104 104A104.11 104.11 0 0 0 128 24m0 192a88 88 0 1 1 88-88a88.1 88.1 0 0 1-88 88m16-40a8 8 0 0 1-8 8a16 16 0 0 1-16-16v-40a8 8 0 0 1 0-16a16 16 0 0 1 16 16v40a8 8 0 0 1 8 8m-32-92a12 12 0 1 1 12 12a12 12 0 0 1-12-12&quot;/&gt;&lt;/svg&gt;&lt;/span&gt;&lt;div class=&quot;flex min-w-0 flex-1 flex-col gap-0.5&quot; data-astro-cid-znle5jil&gt;&lt;p class=&quot;m-0 text-base leading-snug font-semibold&quot; data-astro-cid-znle5jil&gt;Note&lt;/p&gt;&lt;div class=&quot;aside-card-body text-sm leading-normal&quot; data-astro-cid-znle5jil&gt;&lt;p&gt;Python Workflows requires a &lt;code&gt;compatibility_date = &quot;2025-08-01&quot;&lt;/code&gt;, or lower, in your wrangler toml file.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/aside&gt;
&lt;p&gt;Python Workflows support the same core capabilities as JavaScript Workflows, including sleep scheduling, event-driven workflows, and built-in error handling with configurable retry policies.&lt;/p&gt;
&lt;p&gt;To learn more and get started, refer to &lt;a href=&quot;https://developers.stormtrust.net/workflows/python/&quot;&gt;Python Workflows documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Fri, 22 Aug 2025 00:00:00 GMT</pubDate><product>Workflows</product><category>Workflows</category><category>Workers</category></item><item><title>Agents, Workers, Workflows - Run AI-generated code on-demand with Code Sandboxes (new)</title><link>https://developers.stormtrust.net/changelog/post/2025-06-24-announcing-sandboxes/</link><guid isPermaLink="true">https://developers.stormtrust.net/changelog/post/2025-06-24-announcing-sandboxes/</guid><description>&lt;p&gt;AI is supercharging app development for everyone, but we need a safe way to run untrusted, LLM-written code. We’re introducing &lt;a href=&quot;https://www.npmjs.com/package/@cloudflare/sandbox&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Sandboxes&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;, which let your Worker run actual processes in a secure, container-based environment.&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { getSandbox } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;@cloudflare/sandbox&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { Sandbox } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;@cloudflare/sandbox&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; default&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; fetch&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Request&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;env&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Env&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; sandbox&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; getSandbox&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(env.Sandbox, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;my-sandbox&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; sandbox.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;exec&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;ls&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, [&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;-la&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;]);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;methods&quot;&gt;Methods&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#methods&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;exec(command: string, args: string[], options?: { stream?: boolean })&lt;/code&gt;:Execute a command in the sandbox.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;gitCheckout(repoUrl: string, options: { branch?: string; targetDir?: string; stream?: boolean })&lt;/code&gt;: Checkout a git repository in the sandbox.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;mkdir(path: string, options: { recursive?: boolean; stream?: boolean })&lt;/code&gt;: Create a directory in the sandbox.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;writeFile(path: string, content: string, options: { encoding?: string; stream?: boolean })&lt;/code&gt;: Write content to a file in the sandbox.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;readFile(path: string, options: { encoding?: string; stream?: boolean })&lt;/code&gt;: Read content from a file in the sandbox.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;deleteFile(path: string, options?: { stream?: boolean })&lt;/code&gt;: Delete a file from the sandbox.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;renameFile(oldPath: string, newPath: string, options?: { stream?: boolean })&lt;/code&gt;: Rename a file in the sandbox.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;moveFile(sourcePath: string, destinationPath: string, options?: { stream?: boolean })&lt;/code&gt;: Move a file from one location to another in the sandbox.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ping()&lt;/code&gt;: Ping the sandbox.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Sandboxes are still experimental. We&apos;re using them to explore how isolated, container-like workloads might scale on Cloudflare — and to help define the developer experience around them.&lt;/p&gt;
&lt;p&gt;You can try it today from your Worker, with just a few lines of code. Let us know what you build.&lt;/p&gt;</description><pubDate>Wed, 25 Jun 2025 00:00:00 GMT</pubDate><product>Agents</product><category>Agents</category><category>Workers</category><category>Workflows</category></item><item><title>Workflows, Workers - Workflows is now Generally Available</title><link>https://developers.stormtrust.net/changelog/post/2025-04-07-workflows-ga/</link><guid isPermaLink="true">https://developers.stormtrust.net/changelog/post/2025-04-07-workflows-ga/</guid><description>
&lt;p&gt;&lt;a href=&quot;https://developers.stormtrust.net/workflows/&quot;&gt;Workflows&lt;/a&gt; is now &lt;em&gt;Generally Available&lt;/em&gt; (or &quot;GA&quot;): in short, it&apos;s ready for production workloads. Alongside marking Workflows as GA, we&apos;ve introduced a number of changes during the beta period, including:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A new &lt;code&gt;waitForEvent&lt;/code&gt; API that allows a Workflow to wait for an event to occur before continuing execution.&lt;/li&gt;
&lt;li&gt;Increased concurrency: you can &lt;a href=&quot;https://developers.stormtrust.net/changelog/2025-02-25-workflows-concurrency-increased/&quot;&gt;run up to 4,500 Workflow instances&lt;/a&gt; concurrently — and this will continue to grow.&lt;/li&gt;
&lt;li&gt;Improved observability, including new CPU time metrics that allow you to better understand which Workflow instances are consuming the most resources and/or contributing to your bill.&lt;/li&gt;
&lt;li&gt;Support for &lt;code&gt;vitest&lt;/code&gt; for testing Workflows locally and in CI/CD pipelines.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Workflows also supports the new &lt;a href=&quot;https://developers.stormtrust.net/changelog/2025-03-25-higher-cpu-limits/&quot;&gt;increased CPU limits&lt;/a&gt; that apply to Workers, allowing you to run more CPU-intensive tasks (up to 5 minutes of CPU time per instance), not including the time spent waiting on network calls, AI models, or other I/O bound tasks.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;human-in-the-loop&quot;&gt;Human-in-the-loop&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#human-in-the-loop&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;The new &lt;code&gt;step.waitForEvent&lt;/code&gt; API allows a Workflow instance to wait on events and data, enabling human-in-the-the-loop interactions, such as approving or rejecting a request, directly handling webhooks from other systems, or pushing event data to a Workflow while it&apos;s running.&lt;/p&gt;
&lt;p&gt;Because Workflows are just code, you can conditionally execute code based on the result of a &lt;code&gt;waitForEvent&lt;/code&gt; call, and/or call &lt;code&gt;waitForEvent&lt;/code&gt; multiple times in a single Workflow based on what the Workflow needs.&lt;/p&gt;
&lt;p&gt;For example, if you wanted to implement a human-in-the-loop approval process, you could use &lt;code&gt;waitForEvent&lt;/code&gt; to wait for a user to approve or reject a request, and then conditionally execute code based on the result.&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	WorkflowEntrypoint,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	WorkflowStep,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	WorkflowEvent,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;} &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;cloudflare:workers&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; class&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; MyWorkflow&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; extends&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; WorkflowEntrypoint&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; run&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;event&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;step&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;		// Other steps in your Workflow&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		let&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; stripeEvent &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; step.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;waitForEvent&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;			&quot;receive invoice paid webhook from Stripe&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			{ type: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;stripe-webhook&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, timeout: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;1 hour&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;		// Rest of your Workflow&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { WorkflowEntrypoint, WorkflowStep, WorkflowEvent } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;cloudflare:workers&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; class&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; MyWorkflow&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; extends&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; WorkflowEntrypoint&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;Env&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;Params&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; run&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;event&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; WorkflowEvent&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;Params&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;step&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; WorkflowStep&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;		// Other steps in your Workflow&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		let&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; stripeEvent &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; step.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;waitForEvent&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;IncomingStripeWebhook&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;receive invoice paid webhook from Stripe&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, { type: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;stripe-webhook&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, timeout: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;1 hour&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; })&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;		// Rest of your Workflow&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.stormtrust.net/home/runner/work/infrastructure/infrastructure/org/apps/developers/src/components/ui/tabs/Tabs.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/div&gt;
&lt;p&gt;You can then send a Workflow an event from an external service via HTTP or from within a Worker using the &lt;a href=&quot;https://developers.stormtrust.net/workflows/build/workers-api/&quot;&gt;Workers API&lt;/a&gt; for Workflows:&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; default&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; fetch&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;req&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;env&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; instanceId&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; URL&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(req.url).searchParams.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;instanceId&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; webhookPayload&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; req.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;json&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		let&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; instance &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;MY_WORKFLOW&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(instanceId);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;		// Send our event, with `type` matching the event type defined in&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;		// our step.waitForEvent call&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; instance.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;sendEvent&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			type: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;stripe-webhook&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			payload: webhookPayload,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; Response.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;json&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			status: &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; instance.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;status&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; default&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;  async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; fetch&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;req&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Request&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;env&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Env&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;    const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; instanceId&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; URL&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(req.url).searchParams.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;instanceId&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;    const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; webhookPayload&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; req.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;json&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;Payload&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;    let&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; instance &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;MY_WORKFLOW&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(instanceId);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;    // Send our event, with `type` matching the event type defined in&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;    // our step.waitForEvent call&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;    await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; instance.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;sendEvent&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({type: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;stripe-webhook&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, payload: webhookPayload})&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;    return&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; Response.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;json&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;      status: &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; instance.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;status&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;    });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Read the &lt;a href=&quot;https://blog.cloudflare.com/workflows-is-now-generally-available/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;GA announcement blog&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; to learn more about what landed as part of the Workflows GA.&lt;/p&gt;</description><pubDate>Mon, 07 Apr 2025 00:00:00 GMT</pubDate><product>Workflows</product><category>Workflows</category><category>Workers</category></item><item><title>Workflows - Concurrent Workflow instances limits increased.</title><link>https://developers.stormtrust.net/changelog/post/2025-02-25-workflows-concurrency-increased/</link><guid isPermaLink="true">https://developers.stormtrust.net/changelog/post/2025-02-25-workflows-concurrency-increased/</guid><description>
&lt;p&gt;&lt;a href=&quot;https://developers.stormtrust.net/workflows/&quot;&gt;Workflows&lt;/a&gt; now supports up to 4,500 concurrent (running) instances, up from the previous limit of 100. This limit will continue to increase during the Workflows open beta. This increase applies to all users on the Workers Paid plan, and takes effect immediately.&lt;/p&gt;
&lt;p&gt;Review the Workflows &lt;a href=&quot;https://developers.stormtrust.net/workflows/reference/limits&quot;&gt;limits documentation&lt;/a&gt; and/or dive into the &lt;a href=&quot;https://developers.stormtrust.net/workflows/get-started/guide/&quot;&gt;get started guide&lt;/a&gt; to start building on Workflows.&lt;/p&gt;</description><pubDate>Tue, 25 Feb 2025 00:00:00 GMT</pubDate><product>Workflows</product><category>Workflows</category></item><item><title>Agents, Workers, Workflows - Build AI Agents with Example Prompts</title><link>https://developers.stormtrust.net/changelog/post/2025-02-14-example-ai-prompts/</link><guid isPermaLink="true">https://developers.stormtrust.net/changelog/post/2025-02-14-example-ai-prompts/</guid><description>&lt;p&gt;We&apos;ve added an &lt;a href=&quot;https://developers.stormtrust.net/workers/get-started/prompting/&quot;&gt;example prompt&lt;/a&gt; to help you get started with building AI agents and applications on Cloudflare &lt;a href=&quot;https://developers.stormtrust.net/workers/&quot;&gt;Workers&lt;/a&gt;, including &lt;a href=&quot;https://developers.stormtrust.net/workflows/&quot;&gt;Workflows&lt;/a&gt;, &lt;a href=&quot;https://developers.stormtrust.net/durable-objects/&quot;&gt;Durable Objects&lt;/a&gt;, and &lt;a href=&quot;https://developers.stormtrust.net/kv/&quot;&gt;Workers KV&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;You can use this prompt with your favorite AI model, including Claude 3.5 Sonnet, OpenAI&apos;s o3-mini, Gemini 2.0 Flash, or Llama 3.3 on Workers AI. Models with large context windows will allow you to paste the prompt directly: provide your own prompt within the &lt;code&gt;&amp;lt;user_prompt&amp;gt;&amp;lt;/user_prompt&amp;gt;&lt;/code&gt; tags.&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;{paste_prompt_here}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;user_prompt&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;user:&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; Build&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; an&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; AI&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; agent&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; using&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; Cloudflare&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; Workflows.&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; The&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; Workflow&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; should&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; run&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; when&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; a&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; new&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; GitHub&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; issue&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; is&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; opened&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; on&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; a&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; specific&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; project&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; with&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; the&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; label&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;help&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; or&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;bug&apos;,&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; and&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; attempt&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; to&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; help&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; the&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; user&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; troubleshoot&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; the&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; issue&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; by&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; calling&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; the&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; OpenAI&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; API&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; with&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; the&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; issue&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; title&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; and&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; description,&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; and&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; a&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; clear,&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; structured&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; prompt&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; that&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; asks&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; the&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; model&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; to&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; suggest&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; 1-3&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; possible&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; solutions&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; to&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; the&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; issue.&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; Any&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; code&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; snippets&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; should&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; be&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; formatted&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; in&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; Markdown&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; code&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; blocks.&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; Documentation&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; and&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; sources&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; should&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; be&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; referenced&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; at&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; the&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; bottom&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; of&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; the&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; response.&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; The&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; agent&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; should&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; then&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; post&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; the&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; response&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; to&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; the&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; GitHub&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; issue.&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; The&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; agent&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; should&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; run&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; as&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; the&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; provided&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; GitHub&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; bot&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; account.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;/user_prompt&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;This prompt is still experimental, but we encourage you to try it out and &lt;a href=&quot;https://github.com/cloudflare/cloudflare-docs/issues/new?template=content.edit.yml&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;provide feedback&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Fri, 14 Feb 2025 00:00:00 GMT</pubDate><product>Agents</product><category>Agents</category><category>Workers</category><category>Workflows</category></item><item><title>Workflows - Increased Workflows limits and improved instance queueing.</title><link>https://developers.stormtrust.net/changelog/post/2025-01-15-workflows-more-steps/</link><guid isPermaLink="true">https://developers.stormtrust.net/changelog/post/2025-01-15-workflows-more-steps/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.stormtrust.net/workflows/&quot;&gt;Workflows&lt;/a&gt; (beta) now allows you to define up to 1024 &lt;a href=&quot;https://developers.stormtrust.net/workflows/build/workers-api/#workflowstep&quot;&gt;steps&lt;/a&gt;. &lt;code&gt;sleep&lt;/code&gt; steps do not count against this limit.&lt;/p&gt;
&lt;p&gt;We&apos;ve also added:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;instanceId&lt;/code&gt; as property to the &lt;a href=&quot;https://developers.stormtrust.net/workflows/build/workers-api/#workflowevent&quot;&gt;&lt;code&gt;WorkflowEvent&lt;/code&gt;&lt;/a&gt; type, allowing you to retrieve the current instance ID from within a running Workflow instance&lt;/li&gt;
&lt;li&gt;Improved queueing logic for Workflow instances beyond the current maximum concurrent instances, reducing the cases where instances are stuck in the queued state.&lt;/li&gt;
&lt;li&gt;Support for &lt;a href=&quot;https://developers.stormtrust.net/workflows/build/workers-api/#pause&quot;&gt;&lt;code&gt;pause&lt;/code&gt; and &lt;code&gt;resume&lt;/code&gt;&lt;/a&gt; for Workflow instances in a queued state.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We&apos;re continuing to work on increases to the number of concurrent Workflow instances, steps, and support for a new &lt;code&gt;waitForEvent&lt;/code&gt; API over the coming weeks.&lt;/p&gt;</description><pubDate>Wed, 15 Jan 2025 00:00:00 GMT</pubDate><product>Workflows</product><category>Workflows</category></item><item><title>Workers, Workflows - Workflows is now in open beta</title><link>https://developers.stormtrust.net/changelog/post/2024-10-24-workflows-beta/</link><guid isPermaLink="true">https://developers.stormtrust.net/changelog/post/2024-10-24-workflows-beta/</guid><description>
&lt;p&gt;Workflows is now in open beta, and available to any developer a free or paid Workers plan.&lt;/p&gt;
&lt;p&gt;Workflows allow you to build multi-step applications that can automatically retry, persist state and run for minutes, hours, days, or weeks. Workflows introduces a programming model that makes it easier to build reliable, long-running tasks, observe as they progress, and programmatically trigger instances based on events across your services.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;get-started&quot;&gt;Get started&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#get-started&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;You can get started with Workflows by &lt;a href=&quot;https://developers.stormtrust.net/workflows/get-started/guide/&quot;&gt;following our get started guide&lt;/a&gt; and/or using &lt;code&gt;npm create cloudflare&lt;/code&gt; to pull down the starter project:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;npm&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; create&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; cloudflare@latest&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; workflows-starter&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; --&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; --template&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;cloudflare/workflows-starter&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;You can open the &lt;code&gt;src/index.ts&lt;/code&gt; file, extend it, and use &lt;code&gt;wrangler deploy&lt;/code&gt; to deploy your first Workflow. From there, you can:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Learn the &lt;a href=&quot;https://developers.stormtrust.net/workflows/build/workers-api/&quot;&gt;Workflows API&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.stormtrust.net/workflows/build/trigger-workflows/&quot;&gt;Trigger Workflows&lt;/a&gt; via your Workers apps.&lt;/li&gt;
&lt;li&gt;Understand the &lt;a href=&quot;https://developers.stormtrust.net/workflows/build/rules-of-workflows/&quot;&gt;Rules of Workflows&lt;/a&gt; and how to adopt best practices&lt;/li&gt;
&lt;/ul&gt;</description><pubDate>Thu, 24 Oct 2024 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category><category>Workflows</category></item></channel></rss>