{"id":195,"date":"2026-02-03T00:00:00","date_gmt":"2026-02-03T00:00:00","guid":{"rendered":"https:\/\/wordpress.securinsight.ca\/index.php\/2026\/02\/03\/agents-workflows-agents-sdk-v0-3-7-workflows-integration-synchronous-state-and-scheduleevery\/"},"modified":"2026-02-03T00:00:00","modified_gmt":"2026-02-03T00:00:00","slug":"agents-workflows-agents-sdk-v0-3-7-workflows-integration-synchronous-state-and-scheduleevery","status":"publish","type":"post","link":"https:\/\/wordpress.securinsight.ca\/index.php\/2026\/02\/03\/agents-workflows-agents-sdk-v0-3-7-workflows-integration-synchronous-state-and-scheduleevery\/","title":{"rendered":"Agents, Workflows &#8211; Agents SDK v0.3.7: Workflows integration, synchronous state, and scheduleEvery()"},"content":{"rendered":"<p>The latest release of the <a href=\"https:\/\/github.com\/cloudflare\/agents\" target=\"_blank\">Agents SDK<\/a> brings first-class support for <a href=\"https:\/\/developers.cloudflare.com\/workflows\/\">Cloudflare Workflows<\/a>, synchronous state management, and new scheduling capabilities.<\/p>\n<h4>Cloudflare Workflows integration<\/h4>\n<p>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.<\/p>\n<p>Use the new <code>AgentWorkflow<\/code> class to define workflows with typed access to your Agent:<\/p>\n<ul>\n<li>\n<p>JavaScript<\/p>\n<div>\n<div>\n<figure>\n<pre data-language=\"js\"><code class=\"language-js\"><div><div><span>import <\/span><span>{<\/span><span><span> <\/span><span>AgentWorkflow<\/span><span> <\/span><\/span><span>}<\/span><span> from <\/span><span>\"agents\/workflows\"<\/span><span>;<\/span><\/div><\/div><div><div><span>export<\/span><span> <\/span><span>class<\/span><span> <\/span><span>ProcessingWorkflow<\/span><span> <\/span><span>extends<\/span><span> <\/span><span>AgentWorkflow<\/span><span> <\/span><span>{<\/span><\/div><\/div><div><div><span>  <\/span><span>async<\/span><span> <\/span><span>run<\/span><span>(<\/span><span>event<\/span><span>,<\/span><span> <\/span><span>step<\/span><span>)<\/span><span> <\/span><span>{<\/span><\/div><\/div><div><div><span>    <\/span><span>\/\/ Call Agent methods via RPC<\/span><\/div><\/div><div><div><span>    <\/span><span>await<\/span><span> <\/span><span>this<\/span><span>.<\/span><span>agent<\/span><span>.<\/span><span>updateStatus<\/span><span>(<\/span><span>event<\/span><span>.<\/span><span>payload<\/span><span>.<\/span><span>taskId<\/span><span>,<\/span><span> <\/span><span>\"processing\"<\/span><span>)<\/span><span>;<\/span><\/div><\/div><div><div>\n<\/div><\/div><div><div><span>    <\/span><span>\/\/ Non-durable: progress reporting to clients<\/span><\/div><\/div><div><div><span>    <\/span><span>await<\/span><span> <\/span><span>this<\/span><span>.<\/span><span>reportProgress<\/span><span>(<\/span><span>{<\/span><span> step<\/span><span>:<\/span><span> <\/span><span>\"process\"<\/span><span>,<\/span><span> percent<\/span><span>:<\/span><span> <\/span><span>0.5<\/span><span> <\/span><span>}<\/span><span>)<\/span><span>;<\/span><\/div><\/div><div><div><span>    <\/span><span>this<\/span><span>.<\/span><span>broadcastToClients<\/span><span>(<\/span><span>{<\/span><span> type<\/span><span>:<\/span><span> <\/span><span>\"update\"<\/span><span>,<\/span><span> taskId<\/span><span>:<\/span><span> <\/span><span>event<\/span><span>.<\/span><span>payload<\/span><span>.<\/span><span>taskId<\/span><span> <\/span><span>}<\/span><span>)<\/span><span>;<\/span><\/div><\/div><div><div>\n<\/div><\/div><div><div><span>    <\/span><span>\/\/ Durable via step: idempotent, won't repeat on retry<\/span><\/div><\/div><div><div><span>    <\/span><span>await<\/span><span> <\/span><span>step<\/span><span>.<\/span><span>mergeAgentState<\/span><span>(<\/span><span>{<\/span><span> taskProgress<\/span><span>:<\/span><span> <\/span><span>0.5<\/span><span> <\/span><span>}<\/span><span>)<\/span><span>;<\/span><\/div><\/div><div><div>\n<\/div><\/div><div><div><span>    <\/span><span>const<\/span><span> <\/span><span>result<\/span><span> <\/span><span>=<\/span><span> <\/span><span>await<\/span><span> <\/span><span>step<\/span><span>.<\/span><span>do<\/span><span>(<\/span><span>\"process\"<\/span><span>,<\/span><span> <\/span><span>async<\/span><span> <\/span><span>()<\/span><span> <\/span><span>=&gt;<\/span><span> <\/span><span>{<\/span><\/div><\/div><div><div><span><span>      <\/span><\/span><span>return<\/span><span> <\/span><span>processData<\/span><span>(<\/span><span>event<\/span><span>.<\/span><span>payload<\/span><span>.<\/span><span>data<\/span><span>)<\/span><span>;<\/span><\/div><\/div><div><div><span>    <\/span><span>}<\/span><span>)<\/span><span>;<\/span><\/div><\/div><div><div>\n<\/div><\/div><div><div><span>    <\/span><span>await<\/span><span> <\/span><span>step<\/span><span>.<\/span><span>reportComplete<\/span><span>(<\/span><span>result<\/span><span>)<\/span><span>;<\/span><\/div><\/div><div><div><span>    <\/span><span>return<\/span><span> <\/span><span>result<\/span><span>;<\/span><\/div><\/div><div><div><span>  <\/span><span>}<\/span><\/div><\/div><div><div><span>}<\/span><\/div><\/div><\/code><\/pre>\n<div>\n<div><\/div>\n<\/div>\n<\/figure>\n<\/div><\/div>\n<\/li>\n<li>\n<p>TypeScript<\/p>\n<div>\n<div>\n<figure>\n<pre data-language=\"ts\"><code class=\"language-ts\"><div><div><span>import <\/span><span>{<\/span><span><span> <\/span><span>AgentWorkflow<\/span><span> <\/span><\/span><span>}<\/span><span> from <\/span><span>\"agents\/workflows\"<\/span><span>;<\/span><\/div><\/div><div><div><span>import type <\/span><span>{<\/span><span><span> <\/span><span>AgentWorkflowEvent<\/span><\/span><span>,<\/span><span><span> <\/span><span>AgentWorkflowStep<\/span><span> <\/span><\/span><span>}<\/span><span> from <\/span><span>\"agents\/workflows\"<\/span><span>;<\/span><\/div><\/div><div><div>\n<\/div><\/div><div><div><span>export<\/span><span> <\/span><span>class<\/span><span> <\/span><span>ProcessingWorkflow<\/span><span> <\/span><span>extends<\/span><span> <\/span><span>AgentWorkflow<\/span><span>&lt;<\/span><span>MyAgent<\/span><span>,<\/span><span> <\/span><span>TaskParams<\/span><span>&gt;<\/span><span> <\/span><span>{<\/span><\/div><\/div><div><div><span>  <\/span><span>async<\/span><span> <\/span><span>run<\/span><span>(<\/span><span>event<\/span><span>:<\/span><span> <\/span><span>AgentWorkflowEvent<\/span><span>&lt;<\/span><span>TaskParams<\/span><span>&gt;,<\/span><span> <\/span><span>step<\/span><span>:<\/span><span> <\/span><span>AgentWorkflowStep<\/span><span>)<\/span><span> <\/span><span>{<\/span><\/div><\/div><div><div><span>    <\/span><span>\/\/ Call Agent methods via RPC<\/span><\/div><\/div><div><div><span>    <\/span><span>await<\/span><span> <\/span><span>this<\/span><span>.<\/span><span>agent<\/span><span>.<\/span><span>updateStatus<\/span><span>(<\/span><span>event<\/span><span>.<\/span><span>payload<\/span><span>.<\/span><span>taskId<\/span><span>,<\/span><span> <\/span><span>\"processing\"<\/span><span>)<\/span><span>;<\/span><\/div><\/div><div><div>\n<\/div><\/div><div><div><span>    <\/span><span>\/\/ Non-durable: progress reporting to clients<\/span><\/div><\/div><div><div><span>    <\/span><span>await<\/span><span> <\/span><span>this<\/span><span>.<\/span><span>reportProgress<\/span><span>(<\/span><span>{<\/span><span> step<\/span><span>:<\/span><span> <\/span><span>\"process\"<\/span><span>,<\/span><span> percent<\/span><span>:<\/span><span> <\/span><span>0.5<\/span><span> <\/span><span>}<\/span><span>)<\/span><span>;<\/span><\/div><\/div><div><div><span>    <\/span><span>this<\/span><span>.<\/span><span>broadcastToClients<\/span><span>(<\/span><span>{<\/span><span> type<\/span><span>:<\/span><span> <\/span><span>\"update\"<\/span><span>,<\/span><span> taskId<\/span><span>:<\/span><span> <\/span><span>event<\/span><span>.<\/span><span>payload<\/span><span>.<\/span><span>taskId<\/span><span> <\/span><span>}<\/span><span>)<\/span><span>;<\/span><\/div><\/div><div><div>\n<\/div><\/div><div><div><span>    <\/span><span>\/\/ Durable via step: idempotent, won't repeat on retry<\/span><\/div><\/div><div><div><span>    <\/span><span>await<\/span><span> <\/span><span>step<\/span><span>.<\/span><span>mergeAgentState<\/span><span>(<\/span><span>{<\/span><span> taskProgress<\/span><span>:<\/span><span> <\/span><span>0.5<\/span><span> <\/span><span>}<\/span><span>)<\/span><span>;<\/span><\/div><\/div><div><div>\n<\/div><\/div><div><div><span>    <\/span><span>const<\/span><span> <\/span><span>result<\/span><span> <\/span><span>=<\/span><span> <\/span><span>await<\/span><span> <\/span><span>step<\/span><span>.<\/span><span>do<\/span><span>(<\/span><span>\"process\"<\/span><span>,<\/span><span> <\/span><span>async<\/span><span> <\/span><span>()<\/span><span> <\/span><span>=&gt;<\/span><span> <\/span><span>{<\/span><\/div><\/div><div><div><span><span>      <\/span><\/span><span>return<\/span><span> <\/span><span>processData<\/span><span>(<\/span><span>event<\/span><span>.<\/span><span>payload<\/span><span>.<\/span><span>data<\/span><span>)<\/span><span>;<\/span><\/div><\/div><div><div><span>    <\/span><span>}<\/span><span>)<\/span><span>;<\/span><\/div><\/div><div><div>\n<\/div><\/div><div><div><span>    <\/span><span>await<\/span><span> <\/span><span>step<\/span><span>.<\/span><span>reportComplete<\/span><span>(<\/span><span>result<\/span><span>)<\/span><span>;<\/span><\/div><\/div><div><div><span>    <\/span><span>return<\/span><span> <\/span><span>result<\/span><span>;<\/span><\/div><\/div><div><div><span>  <\/span><span>}<\/span><\/div><\/div><div><div><span>}<\/span><\/div><\/div><\/code><\/pre>\n<div>\n<div><\/div>\n<\/div>\n<\/figure>\n<\/div><\/div>\n<\/li>\n<\/ul>\n<p>Start workflows from your Agent with <code>runWorkflow()<\/code> and handle lifecycle events:<\/p>\n<ul>\n<li>\n<p>JavaScript<\/p>\n<div>\n<div>\n<figure>\n<pre data-language=\"js\"><code class=\"language-js\"><div><div><span>export<\/span><span> <\/span><span>class<\/span><span> <\/span><span>MyAgent<\/span><span> <\/span><span>extends<\/span><span> <\/span><span>Agent<\/span><span> <\/span><span>{<\/span><\/div><\/div><div><div><span>  <\/span><span>async<\/span><span> <\/span><span>startTask<\/span><span>(<\/span><span>taskId<\/span><span>,<\/span><span> <\/span><span>data<\/span><span>)<\/span><span> <\/span><span>{<\/span><\/div><\/div><div><div><span>    <\/span><span>const<\/span><span> <\/span><span>instanceId<\/span><span> <\/span><span>=<\/span><span> <\/span><span>await<\/span><span> <\/span><span>this<\/span><span>.<\/span><span>runWorkflow<\/span><span>(<\/span><span>\"PROCESSING_WORKFLOW\"<\/span><span>,<\/span><span> <\/span><span>{<\/span><\/div><\/div><div><div><span>      <\/span><span>taskId<\/span><span>,<\/span><\/div><\/div><div><div><span>      <\/span><span>data<\/span><span>,<\/span><\/div><\/div><div><div><span>    <\/span><span>}<\/span><span>)<\/span><span>;<\/span><\/div><\/div><div><div><span>    <\/span><span>return<\/span><span> <\/span><span>{<\/span><span> <\/span><span>instanceId<\/span><span> <\/span><span>};<\/span><\/div><\/div><div><div><span>  <\/span><span>}<\/span><\/div><\/div><div><div>\n<\/div><\/div><div><div><span>  <\/span><span>async<\/span><span> <\/span><span>onWorkflowProgress<\/span><span>(<\/span><span>workflowName<\/span><span>,<\/span><span> <\/span><span>instanceId<\/span><span>,<\/span><span> <\/span><span>progress<\/span><span>)<\/span><span> <\/span><span>{<\/span><\/div><\/div><div><div><span>    <\/span><span>this<\/span><span>.<\/span><span>broadcast<\/span><span>(<\/span><span>JSON<\/span><span>.<\/span><span>stringify<\/span><span>(<\/span><span>{<\/span><span> type<\/span><span>:<\/span><span> <\/span><span>\"progress\"<\/span><span>,<\/span><span> <\/span><span>progress<\/span><span> <\/span><span>}<\/span><span>))<\/span><span>;<\/span><\/div><\/div><div><div><span>  <\/span><span>}<\/span><\/div><\/div><div><div>\n<\/div><\/div><div><div><span>  <\/span><span>async<\/span><span> <\/span><span>onWorkflowComplete<\/span><span>(<\/span><span>workflowName<\/span><span>,<\/span><span> <\/span><span>instanceId<\/span><span>,<\/span><span> <\/span><span>result<\/span><span>)<\/span><span> <\/span><span>{<\/span><\/div><\/div><div><div><span><span>    <\/span><\/span><span>console<\/span><span>.<\/span><span>log<\/span><span>(<\/span><span>`Workflow <\/span><span>${<\/span><span>instanceId<\/span><span>}<\/span><span> completed`<\/span><span>)<\/span><span>;<\/span><\/div><\/div><div><div><span>  <\/span><span>}<\/span><\/div><\/div><div><div>\n<\/div><\/div><div><div><span>  <\/span><span>async<\/span><span> <\/span><span>onWorkflowError<\/span><span>(<\/span><span>workflowName<\/span><span>,<\/span><span> <\/span><span>instanceId<\/span><span>,<\/span><span> <\/span><span>error<\/span><span>)<\/span><span> <\/span><span>{<\/span><\/div><\/div><div><div><span><span>    <\/span><\/span><span>console<\/span><span>.<\/span><span>error<\/span><span>(<\/span><span>`Workflow <\/span><span>${<\/span><span>instanceId<\/span><span>}<\/span><span> failed:`<\/span><span>,<\/span><span> <\/span><span>error<\/span><span>)<\/span><span>;<\/span><\/div><\/div><div><div><span>  <\/span><span>}<\/span><\/div><\/div><div><div><span>}<\/span><\/div><\/div><\/code><\/pre>\n<div>\n<div><\/div>\n<\/div>\n<\/figure>\n<\/div><\/div>\n<\/li>\n<li>\n<p>TypeScript<\/p>\n<div>\n<div>\n<figure>\n<pre data-language=\"ts\"><code class=\"language-ts\"><div><div><span>export<\/span><span> <\/span><span>class<\/span><span> <\/span><span>MyAgent<\/span><span> <\/span><span>extends<\/span><span> <\/span><span>Agent<\/span><span> <\/span><span>{<\/span><\/div><\/div><div><div><span>  <\/span><span>async<\/span><span> <\/span><span>startTask<\/span><span>(<\/span><span>taskId<\/span><span>:<\/span><span> <\/span><span>string<\/span><span>,<\/span><span> <\/span><span>data<\/span><span>:<\/span><span> <\/span><span>string<\/span><span>)<\/span><span> <\/span><span>{<\/span><\/div><\/div><div><div><span>    <\/span><span>const<\/span><span> <\/span><span>instanceId<\/span><span> <\/span><span>=<\/span><span> <\/span><span>await<\/span><span> <\/span><span>this<\/span><span>.<\/span><span>runWorkflow<\/span><span>(<\/span><span>\"PROCESSING_WORKFLOW\"<\/span><span>,<\/span><span> <\/span><span>{<\/span><\/div><\/div><div><div><span>      <\/span><span>taskId<\/span><span>,<\/span><\/div><\/div><div><div><span>      <\/span><span>data<\/span><span>,<\/span><\/div><\/div><div><div><span>    <\/span><span>}<\/span><span>)<\/span><span>;<\/span><\/div><\/div><div><div><span>    <\/span><span>return<\/span><span> <\/span><span>{<\/span><span> <\/span><span>instanceId<\/span><span> <\/span><span>};<\/span><\/div><\/div><div><div><span>  <\/span><span>}<\/span><\/div><\/div><div><div>\n<\/div><\/div><div><div><span>  <\/span><span>async<\/span><span> <\/span><span>onWorkflowProgress<\/span><span>(<\/span><\/div><\/div><div><div><span>    <\/span><span>workflowName<\/span><span>:<\/span><span> <\/span><span>string<\/span><span>,<\/span><\/div><\/div><div><div><span>    <\/span><span>instanceId<\/span><span>:<\/span><span> <\/span><span>string<\/span><span>,<\/span><\/div><\/div><div><div><span>    <\/span><span>progress<\/span><span>:<\/span><span> <\/span><span>unknown<\/span><span>,<\/span><\/div><\/div><div><div><span>  <\/span><span>)<\/span><span> <\/span><span>{<\/span><\/div><\/div><div><div><span>    <\/span><span>this<\/span><span>.<\/span><span>broadcast<\/span><span>(<\/span><span>JSON<\/span><span>.<\/span><span>stringify<\/span><span>(<\/span><span>{<\/span><span> type<\/span><span>:<\/span><span> <\/span><span>\"progress\"<\/span><span>,<\/span><span> <\/span><span>progress<\/span><span> <\/span><span>}<\/span><span>))<\/span><span>;<\/span><\/div><\/div><div><div><span>  <\/span><span>}<\/span><\/div><\/div><div><div>\n<\/div><\/div><div><div><span>  <\/span><span>async<\/span><span> <\/span><span>onWorkflowComplete<\/span><span>(<\/span><\/div><\/div><div><div><span>    <\/span><span>workflowName<\/span><span>:<\/span><span> <\/span><span>string<\/span><span>,<\/span><\/div><\/div><div><div><span>    <\/span><span>instanceId<\/span><span>:<\/span><span> <\/span><span>string<\/span><span>,<\/span><\/div><\/div><div><div><span>    <\/span><span>result<\/span><span>?:<\/span><span> <\/span><span>unknown<\/span><span>,<\/span><\/div><\/div><div><div><span>  <\/span><span>)<\/span><span> <\/span><span>{<\/span><\/div><\/div><div><div><span><span>    <\/span><\/span><span>console<\/span><span>.<\/span><span>log<\/span><span>(<\/span><span>`Workflow <\/span><span>${<\/span><span>instanceId<\/span><span>}<\/span><span> completed`<\/span><span>)<\/span><span>;<\/span><\/div><\/div><div><div><span>  <\/span><span>}<\/span><\/div><\/div><div><div>\n<\/div><\/div><div><div><span>  <\/span><span>async<\/span><span> <\/span><span>onWorkflowError<\/span><span>(<\/span><\/div><\/div><div><div><span>    <\/span><span>workflowName<\/span><span>:<\/span><span> <\/span><span>string<\/span><span>,<\/span><\/div><\/div><div><div><span>    <\/span><span>instanceId<\/span><span>:<\/span><span> <\/span><span>string<\/span><span>,<\/span><\/div><\/div><div><div><span>    <\/span><span>error<\/span><span>:<\/span><span> <\/span><span>unknown<\/span><span>,<\/span><\/div><\/div><div><div><span>  <\/span><span>)<\/span><span> <\/span><span>{<\/span><\/div><\/div><div><div><span><span>    <\/span><\/span><span>console<\/span><span>.<\/span><span>error<\/span><span>(<\/span><span>`Workflow <\/span><span>${<\/span><span>instanceId<\/span><span>}<\/span><span> failed:`<\/span><span>,<\/span><span> <\/span><span>error<\/span><span>)<\/span><span>;<\/span><\/div><\/div><div><div><span>  <\/span><span>}<\/span><\/div><\/div><div><div><span>}<\/span><\/div><\/div><\/code><\/pre>\n<div>\n<div><\/div>\n<\/div>\n<\/figure>\n<\/div><\/div>\n<\/li>\n<\/ul>\n<p>Key workflow methods on your Agent:<\/p>\n<ul>\n<li><code>runWorkflow(workflowName, params, options?)<\/code> \u2014 Start a workflow with optional metadata<\/li>\n<li><code>getWorkflow(workflowId)<\/code> \/ <code>getWorkflows(criteria?)<\/code> \u2014 Query workflows with cursor-based pagination<\/li>\n<li><code>approveWorkflow(workflowId)<\/code> \/ <code>rejectWorkflow(workflowId)<\/code> \u2014 Human-in-the-loop approval flows<\/li>\n<li><code>pauseWorkflow()<\/code>, <code>resumeWorkflow()<\/code>, <code>terminateWorkflow()<\/code> \u2014 Workflow control<\/li>\n<\/ul>\n<h4>Synchronous setState()<\/h4>\n<p>State updates are now synchronous with a new <code>validateStateChange()<\/code> validation hook:<\/p>\n<ul>\n<li>\n<p>JavaScript<\/p>\n<div>\n<div>\n<figure>\n<pre data-language=\"js\"><code class=\"language-js\"><div><div><span>export<\/span><span> <\/span><span>class<\/span><span> <\/span><span>MyAgent<\/span><span> <\/span><span>extends<\/span><span> <\/span><span>Agent<\/span><span> <\/span><span>{<\/span><\/div><\/div><div><div><span>  <\/span><span>validateStateChange<\/span><span>(<\/span><span>oldState<\/span><span>,<\/span><span> <\/span><span>newState<\/span><span>)<\/span><span> <\/span><span>{<\/span><\/div><\/div><div><div><span>    <\/span><span>\/\/ Return false to reject the change<\/span><\/div><\/div><div><div><span>    <\/span><span>if<\/span><span> (<\/span><span>newState<\/span><span>.<\/span><span>count<\/span><span> <\/span><span>&lt;<\/span><span> <\/span><span>0<\/span><span>) <\/span><span>return<\/span><span> <\/span><span>false<\/span><span>;<\/span><\/div><\/div><div><div><span>    <\/span><span>\/\/ Return modified state to transform<\/span><\/div><\/div><div><div><span>    <\/span><span>return<\/span><span> <\/span><span>{<\/span><span> <\/span><span><span>...<\/span><span>newState<\/span><\/span><span>,<\/span><span> lastUpdated<\/span><span>:<\/span><span> <\/span><span>Date<\/span><span>.<\/span><span>now<\/span><span>() <\/span><span>};<\/span><\/div><\/div><div><div><span>  <\/span><span>}<\/span><\/div><\/div><div><div><span>}<\/span><\/div><\/div><\/code><\/pre>\n<div>\n<div><\/div>\n<\/div>\n<\/figure>\n<\/div><\/div>\n<\/li>\n<li>\n<p>TypeScript<\/p>\n<div>\n<div>\n<figure>\n<pre data-language=\"ts\"><code class=\"language-ts\"><div><div><span>export<\/span><span> <\/span><span>class<\/span><span> <\/span><span>MyAgent<\/span><span> <\/span><span>extends<\/span><span> <\/span><span>Agent<\/span><span>&lt;<\/span><span>Env<\/span><span>,<\/span><span> <\/span><span>State<\/span><span>&gt;<\/span><span> <\/span><span>{<\/span><\/div><\/div><div><div><span>  <\/span><span>validateStateChange<\/span><span>(<\/span><span>oldState<\/span><span>:<\/span><span> <\/span><span>State<\/span><span>,<\/span><span> <\/span><span>newState<\/span><span>:<\/span><span> <\/span><span>State<\/span><span>)<\/span><span>:<\/span><span> <\/span><span>State<\/span><span> <\/span><span>|<\/span><span> <\/span><span>false<\/span><span> <\/span><span>{<\/span><\/div><\/div><div><div><span>    <\/span><span>\/\/ Return false to reject the change<\/span><\/div><\/div><div><div><span>    <\/span><span>if<\/span><span> (<\/span><span>newState<\/span><span>.<\/span><span>count<\/span><span> <\/span><span>&lt;<\/span><span> <\/span><span>0<\/span><span>) <\/span><span>return<\/span><span> <\/span><span>false<\/span><span>;<\/span><\/div><\/div><div><div><span>    <\/span><span>\/\/ Return modified state to transform<\/span><\/div><\/div><div><div><span>    <\/span><span>return<\/span><span> <\/span><span>{<\/span><span> <\/span><span><span>...<\/span><span>newState<\/span><\/span><span>,<\/span><span> lastUpdated<\/span><span>:<\/span><span> <\/span><span>Date<\/span><span>.<\/span><span>now<\/span><span>() <\/span><span>};<\/span><\/div><\/div><div><div><span>  <\/span><span>}<\/span><\/div><\/div><div><div><span>}<\/span><\/div><\/div><\/code><\/pre>\n<div>\n<div><\/div>\n<\/div>\n<\/figure>\n<\/div><\/div>\n<\/li>\n<\/ul>\n<h4>scheduleEvery() for recurring tasks<\/h4>\n<p>The new <code>scheduleEvery()<\/code> method enables fixed-interval recurring tasks with built-in overlap prevention:<\/p>\n<ul>\n<li>\n<p>JavaScript<\/p>\n<div>\n<div>\n<figure>\n<pre data-language=\"js\"><code class=\"language-js\"><div><div><span>\/\/ Run every 5 minutes<\/span><\/div><\/div><div><div><span>await<\/span><span> <\/span><span>this<\/span><span>.<\/span><span>scheduleEvery<\/span><span>(<\/span><span>\"syncData\"<\/span><span>,<\/span><span> <\/span><span>5<\/span><span> <\/span><span>*<\/span><span> <\/span><span>60<\/span><span> <\/span><span>*<\/span><span> <\/span><span>1000<\/span><span>,<\/span><span> <\/span><span>{<\/span><span> source<\/span><span>:<\/span><span> <\/span><span>\"api\"<\/span><span> <\/span><span>}<\/span><span>)<\/span><span>;<\/span><\/div><\/div><\/code><\/pre>\n<div>\n<div><\/div>\n<\/div>\n<\/figure>\n<\/div><\/div>\n<\/li>\n<li>\n<p>TypeScript<\/p>\n<div>\n<div>\n<figure>\n<pre data-language=\"ts\"><code class=\"language-ts\"><div><div><span>\/\/ Run every 5 minutes<\/span><\/div><\/div><div><div><span>await<\/span><span> <\/span><span>this<\/span><span>.<\/span><span>scheduleEvery<\/span><span>(<\/span><span>\"syncData\"<\/span><span>,<\/span><span> <\/span><span>5<\/span><span> <\/span><span>*<\/span><span> <\/span><span>60<\/span><span> <\/span><span>*<\/span><span> <\/span><span>1000<\/span><span>,<\/span><span> <\/span><span>{<\/span><span> source<\/span><span>:<\/span><span> <\/span><span>\"api\"<\/span><span> <\/span><span>}<\/span><span>)<\/span><span>;<\/span><\/div><\/div><\/code><\/pre>\n<div>\n<div><\/div>\n<\/div>\n<\/figure>\n<\/div><\/div>\n<\/li>\n<\/ul>\n<h4>Callable system improvements<\/h4>\n<ul>\n<li><strong>Client-side RPC timeout<\/strong> \u2014 Set timeouts on callable method invocations<\/li>\n<li><strong><code>StreamingResponse.error(message)<\/code><\/strong> \u2014 Graceful stream error signaling<\/li>\n<li><strong><code>getCallableMethods()<\/code><\/strong> \u2014 Introspection API for discovering callable methods<\/li>\n<li><strong>Connection close handling<\/strong> \u2014 Pending calls are automatically rejected on disconnect<\/li>\n<\/ul>\n<ul>\n<li>\n<p>JavaScript<\/p>\n<div>\n<div>\n<figure>\n<pre data-language=\"js\"><code class=\"language-js\"><div><div><span>await<\/span><span> <\/span><span>agent<\/span><span>.<\/span><span>call<\/span><span>(<\/span><span>\"method\"<\/span><span>,<\/span><span> [<\/span><span>args<\/span><span>]<\/span><span>,<\/span><span> <\/span><span>{<\/span><\/div><\/div><div><div><span><span>  <\/span><\/span><span>timeout<\/span><span>:<\/span><span> <\/span><span>5000<\/span><span>,<\/span><\/div><\/div><div><div><span><span>  <\/span><\/span><span>stream<\/span><span>:<\/span><span> <\/span><span>{<\/span><span> <\/span><span>onChunk<\/span><span>,<\/span><span> <\/span><span>onDone<\/span><span>,<\/span><span> <\/span><span>onError<\/span><span> <\/span><span>},<\/span><\/div><\/div><div><div><span>}<\/span><span>)<\/span><span>;<\/span><\/div><\/div><\/code><\/pre>\n<div>\n<div><\/div>\n<\/div>\n<\/figure>\n<\/div><\/div>\n<\/li>\n<li>\n<p>TypeScript<\/p>\n<div>\n<div>\n<figure>\n<pre data-language=\"ts\"><code class=\"language-ts\"><div><div><span>await<\/span><span> <\/span><span>agent<\/span><span>.<\/span><span>call<\/span><span>(<\/span><span>\"method\"<\/span><span>,<\/span><span> [<\/span><span>args<\/span><span>]<\/span><span>,<\/span><span> <\/span><span>{<\/span><\/div><\/div><div><div><span><span>  <\/span><\/span><span>timeout<\/span><span>:<\/span><span> <\/span><span>5000<\/span><span>,<\/span><\/div><\/div><div><div><span><span>  <\/span><\/span><span>stream<\/span><span>:<\/span><span> <\/span><span>{<\/span><span> <\/span><span>onChunk<\/span><span>,<\/span><span> <\/span><span>onDone<\/span><span>,<\/span><span> <\/span><span>onError<\/span><span> <\/span><span>},<\/span><\/div><\/div><div><div><span>}<\/span><span>)<\/span><span>;<\/span><\/div><\/div><\/code><\/pre>\n<div>\n<div><\/div>\n<\/div>\n<\/figure>\n<\/div><\/div>\n<\/li>\n<\/ul>\n<h4>Email and routing enhancements<\/h4>\n<p><strong>Secure email reply routing<\/strong> \u2014 Email replies are now secured with HMAC-SHA256 signed headers, preventing unauthorized routing of emails to agent instances.<\/p>\n<p><strong>Routing improvements:<\/strong><\/p>\n<ul>\n<li><code>basePath<\/code> option to bypass default URL construction for custom routing<\/li>\n<li>Server-sent identity \u2014 Agents send <code>name<\/code> and <code>agent<\/code> type on connect<\/li>\n<li>New <code>onIdentity<\/code> and <code>onIdentityChange<\/code> callbacks on the client<\/li>\n<\/ul>\n<ul>\n<li>\n<p>JavaScript<\/p>\n<div>\n<div>\n<figure>\n<pre data-language=\"js\"><code class=\"language-js\"><div><div><span>const<\/span><span> <\/span><span>agent<\/span><span> <\/span><span>=<\/span><span> <\/span><span>useAgent<\/span><span>(<\/span><span>{<\/span><\/div><\/div><div><div><span><span>  <\/span><\/span><span>basePath<\/span><span>:<\/span><span> <\/span><span>\"user\"<\/span><span>,<\/span><\/div><\/div><div><div><span>  <\/span><span>onIdentity<\/span><span>:<\/span><span> <\/span><span>(<\/span><span>name<\/span><span>,<\/span><span> <\/span><span>agentType<\/span><span>)<\/span><span> <\/span><span>=&gt;<\/span><span> <\/span><span>console<\/span><span>.<\/span><span>log<\/span><span>(<\/span><span>`Connected to <\/span><span>${<\/span><span>name<\/span><span>}<\/span><span>`<\/span><span>)<\/span><span>,<\/span><\/div><\/div><div><div><span>}<\/span><span>)<\/span><span>;<\/span><\/div><\/div><\/code><\/pre>\n<div>\n<div><\/div>\n<\/div>\n<\/figure>\n<\/div><\/div>\n<\/li>\n<li>\n<p>TypeScript<\/p>\n<div>\n<div>\n<figure>\n<pre data-language=\"ts\"><code class=\"language-ts\"><div><div><span>const<\/span><span> <\/span><span>agent<\/span><span> <\/span><span>=<\/span><span> <\/span><span>useAgent<\/span><span>(<\/span><span>{<\/span><\/div><\/div><div><div><span><span>  <\/span><\/span><span>basePath<\/span><span>:<\/span><span> <\/span><span>\"user\"<\/span><span>,<\/span><\/div><\/div><div><div><span>  <\/span><span>onIdentity<\/span><span>:<\/span><span> <\/span><span>(<\/span><span>name<\/span><span>,<\/span><span> <\/span><span>agentType<\/span><span>)<\/span><span> <\/span><span>=&gt;<\/span><span> <\/span><span>console<\/span><span>.<\/span><span>log<\/span><span>(<\/span><span>`Connected to <\/span><span>${<\/span><span>name<\/span><span>}<\/span><span>`<\/span><span>)<\/span><span>,<\/span><\/div><\/div><div><div><span>}<\/span><span>)<\/span><span>;<\/span><\/div><\/div><\/code><\/pre>\n<div>\n<div><\/div>\n<\/div>\n<\/figure>\n<\/div><\/div>\n<\/li>\n<\/ul>\n<h4>Upgrade<\/h4>\n<p>To update to the latest version:<\/p>\n<div>\n<figure>\n<pre data-language=\"sh\"><code class=\"language-sh\"><div><div><span>npm<\/span><span> <\/span><span>i<\/span><span> <\/span><span>agents@latest<\/span><\/div><\/div><\/code><\/pre>\n<div>\n<div><\/div>\n<\/div>\n<\/figure>\n<\/div>\n<p>For the complete Workflows API reference and patterns, see <a href=\"https:\/\/developers.cloudflare.com\/agents\/api-reference\/run-workflows\/\">Run Workflows<\/a>.<\/p>","protected":false},"excerpt":{"rendered":"<p>The latest release of the Agents SDK brings first-class support for Cloudflare Workflows, synchronous state management, and new scheduling capabilities. Cloudflare Workflows integration 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. [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-195","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/wordpress.securinsight.ca\/index.php\/wp-json\/wp\/v2\/posts\/195","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.securinsight.ca\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.securinsight.ca\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.securinsight.ca\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.securinsight.ca\/index.php\/wp-json\/wp\/v2\/comments?post=195"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.securinsight.ca\/index.php\/wp-json\/wp\/v2\/posts\/195\/revisions"}],"wp:attachment":[{"href":"https:\/\/wordpress.securinsight.ca\/index.php\/wp-json\/wp\/v2\/media?parent=195"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.securinsight.ca\/index.php\/wp-json\/wp\/v2\/categories?post=195"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.securinsight.ca\/index.php\/wp-json\/wp\/v2\/tags?post=195"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}