{"id":521,"date":"2026-06-02T00:00:00","date_gmt":"2026-06-02T00:00:00","guid":{"rendered":"https:\/\/wordpress.securinsight.ca\/index.php\/2026\/06\/02\/agents-workers-agents-sdk-v0-14-0-agent-skills-messengers-scheduled-tasks-workflows-and-hardened-chat-recovery\/"},"modified":"2026-06-02T00:00:00","modified_gmt":"2026-06-02T00:00:00","slug":"agents-workers-agents-sdk-v0-14-0-agent-skills-messengers-scheduled-tasks-workflows-and-hardened-chat-recovery","status":"publish","type":"post","link":"https:\/\/wordpress.securinsight.ca\/index.php\/2026\/06\/02\/agents-workers-agents-sdk-v0-14-0-agent-skills-messengers-scheduled-tasks-workflows-and-hardened-chat-recovery\/","title":{"rendered":"Agents, Workers &#8211; Agents SDK v0.14.0: Agent Skills, messengers, scheduled tasks, Workflows, and hardened chat recovery"},"content":{"rendered":"<p>The latest release of the <a href=\"https:\/\/github.com\/cloudflare\/agents\" target=\"_blank\">Agents SDK<\/a> adds four new ways to build with <code>@cloudflare\/think<\/code>: on-demand Agent Skills, chat messengers (starting with Telegram), declarative scheduled tasks, and durable reasoning steps inside Workflows. This release also significantly hardens durable chat recovery, so turns reliably ride through deploys, evictions, and stalled model streams in production.<\/p>\n<h4>Agent Skills (experimental)<\/h4>\n<p>Give an agent a catalog of on-demand instructions, resources, and scripts. A skill source adds a catalog to the system prompt, and the model activates a skill only when a task matches \u2014 so a large library of capabilities does not bloat every prompt.<\/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>Think<\/span><\/span><span>,<\/span><span><span> <\/span><span>skills<\/span><span> <\/span><\/span><span>}<\/span><span> from <\/span><span>\"@cloudflare\/think\"<\/span><span>;<\/span><\/div><\/div><div><div><span><span>import <\/span><span>bundledSkills<\/span><span> from <\/span><\/span><span>\"agents:skills\"<\/span><span>;<\/span><\/div><\/div><div><div>\n<\/div><\/div><div><div><span>export<\/span><span> <\/span><span>class<\/span><span> <\/span><span>SkillsAgent<\/span><span> <\/span><span>extends<\/span><span> <\/span><span>Think<\/span><span> <\/span><span>{<\/span><\/div><\/div><div><div><span>  <\/span><span>getSkills<\/span><span>()<\/span><span> <\/span><span>{<\/span><\/div><\/div><div><div><span>    <\/span><span>return<\/span><span> [<\/span><\/div><\/div><div><div><span>      <\/span><span>bundledSkills<\/span><span>,<\/span><\/div><\/div><div><div><span><span>      <\/span><\/span><span>skills<\/span><span>.<\/span><span>r2<\/span><span>(<\/span><span>this<\/span><span>.<\/span><span>env<\/span><span>.<\/span><span>SKILLS_BUCKET<\/span><span>,<\/span><span> <\/span><span>{<\/span><span> prefix<\/span><span>:<\/span><span> <\/span><span>\"skills\/\"<\/span><span> <\/span><span>}<\/span><span>)<\/span><span>,<\/span><\/div><\/div><div><div><span><span>    <\/span><\/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<div><\/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>Think<\/span><\/span><span>,<\/span><span><span> <\/span><span>skills<\/span><span> <\/span><\/span><span>}<\/span><span> from <\/span><span>\"@cloudflare\/think\"<\/span><span>;<\/span><\/div><\/div><div><div><span><span>import <\/span><span>bundledSkills<\/span><span> from <\/span><\/span><span>\"agents:skills\"<\/span><span>;<\/span><\/div><\/div><div><div>\n<\/div><\/div><div><div><span>export<\/span><span> <\/span><span>class<\/span><span> <\/span><span>SkillsAgent<\/span><span> <\/span><span>extends<\/span><span> <\/span><span>Think<\/span><span>&lt;<\/span><span>Env<\/span><span>&gt;<\/span><span> <\/span><span>{<\/span><\/div><\/div><div><div><span>  <\/span><span>getSkills<\/span><span>()<\/span><span> <\/span><span>{<\/span><\/div><\/div><div><div><span>    <\/span><span>return<\/span><span> [<\/span><\/div><\/div><div><div><span>      <\/span><span>bundledSkills<\/span><span>,<\/span><\/div><\/div><div><div><span><span>      <\/span><\/span><span>skills<\/span><span>.<\/span><span>r2<\/span><span>(<\/span><span>this<\/span><span>.<\/span><span>env<\/span><span>.<\/span><span>SKILLS_BUCKET<\/span><span>,<\/span><span> <\/span><span>{<\/span><span> prefix<\/span><span>:<\/span><span> <\/span><span>\"skills\/\"<\/span><span> <\/span><span>}<\/span><span>)<\/span><span>,<\/span><\/div><\/div><div><div><span><span>    <\/span><\/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<div><\/div>\n<\/figure>\n<\/div><\/div>\n<\/li>\n<\/ul>\n<p>The <code>agents:skills<\/code> import bundles a local <code>.\/skills<\/code> directory through the Agents Vite plugin (one directory per skill, each with a <code>SKILL.md<\/code>). Skills can also load from R2 or a manifest. When skills are available, Think exposes <code>activate_skill<\/code>, <code>read_skill_resource<\/code>, and an optional <code>run_skill_script<\/code> tool. Skill loading is resilient: a duplicate or failing source is skipped with a warning instead of breaking the agent.<\/p>\n<p>Agent Skills are <strong>experimental<\/strong>, and script execution in particular is early. The API may change in a future release. We would love your feedback \u2014 tell us what you are building and what is missing in the <a href=\"https:\/\/github.com\/cloudflare\/agents\/discussions\" target=\"_blank\">Agents repository<\/a>.<\/p>\n<h4>Messengers<\/h4>\n<p>Connect a Think agent directly to a chat platform. Think owns the webhook route, conversation routing, durable reply fiber, and streamed delivery back to the provider. Telegram ships as the first provider.<\/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>Think<\/span><span> <\/span><\/span><span>}<\/span><span> from <\/span><span>\"@cloudflare\/think\"<\/span><span>;<\/span><\/div><\/div><div><div><span>import <\/span><span>{<\/span><\/div><\/div><div><div><span><span>  <\/span><\/span><span>defineMessengers<\/span><span>,<\/span><\/div><\/div><div><div><span><span>  <\/span><\/span><span>ThinkMessengerStateAgent<\/span><span>,<\/span><\/div><\/div><div><div><span>}<\/span><span> from <\/span><span>\"@cloudflare\/think\/messengers\"<\/span><span>;<\/span><\/div><\/div><div><div><span><span>import <\/span><span>telegramMessenger<\/span><span> from <\/span><\/span><span>\"@cloudflare\/think\/messengers\/telegram\"<\/span><span>;<\/span><\/div><\/div><div><div>\n<\/div><\/div><div><div><span>export<\/span><span> <\/span><span>{<\/span><span> <\/span><span>ThinkMessengerStateAgent<\/span><span> <\/span><span>};<\/span><\/div><\/div><div><div>\n<\/div><\/div><div><div><span>export<\/span><span> <\/span><span>class<\/span><span> <\/span><span>SupportAgent<\/span><span> <\/span><span>extends<\/span><span> <\/span><span>Think<\/span><span> <\/span><span>{<\/span><\/div><\/div><div><div><span>  <\/span><span>getMessengers<\/span><span>()<\/span><span> <\/span><span>{<\/span><\/div><\/div><div><div><span>    <\/span><span>return<\/span><span> <\/span><span>defineMessengers<\/span><span>(<\/span><span>{<\/span><\/div><\/div><div><div><span><span>      <\/span><\/span><span>telegram<\/span><span>:<\/span><span> <\/span><span>telegramMessenger<\/span><span>(<\/span><span>{<\/span><\/div><\/div><div><div><span><span>        <\/span><\/span><span>token<\/span><span>:<\/span><span> <\/span><span>this<\/span><span>.<\/span><span>env<\/span><span>.<\/span><span>TELEGRAM_BOT_TOKEN<\/span><span>,<\/span><\/div><\/div><div><div><span><span>        <\/span><\/span><span>userName<\/span><span>:<\/span><span> <\/span><span>\"support_bot\"<\/span><span>,<\/span><\/div><\/div><div><div><span><span>        <\/span><\/span><span>secretToken<\/span><span>:<\/span><span> <\/span><span>this<\/span><span>.<\/span><span>env<\/span><span>.<\/span><span>TELEGRAM_WEBHOOK_SECRET_TOKEN<\/span><span>,<\/span><\/div><\/div><div><div><span>      <\/span><span>}<\/span><span>)<\/span><span>,<\/span><\/div><\/div><div><div><span>    <\/span><span>}<\/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<div><\/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>Think<\/span><span> <\/span><\/span><span>}<\/span><span> from <\/span><span>\"@cloudflare\/think\"<\/span><span>;<\/span><\/div><\/div><div><div><span>import <\/span><span>{<\/span><\/div><\/div><div><div><span><span>  <\/span><\/span><span>defineMessengers<\/span><span>,<\/span><\/div><\/div><div><div><span><span>  <\/span><\/span><span>ThinkMessengerStateAgent<\/span><span>,<\/span><\/div><\/div><div><div><span>}<\/span><span> from <\/span><span>\"@cloudflare\/think\/messengers\"<\/span><span>;<\/span><\/div><\/div><div><div><span><span>import <\/span><span>telegramMessenger<\/span><span> from <\/span><\/span><span>\"@cloudflare\/think\/messengers\/telegram\"<\/span><span>;<\/span><\/div><\/div><div><div>\n<\/div><\/div><div><div><span>export<\/span><span> <\/span><span>{<\/span><span> <\/span><span>ThinkMessengerStateAgent<\/span><span> <\/span><span>};<\/span><\/div><\/div><div><div>\n<\/div><\/div><div><div><span>export<\/span><span> <\/span><span>class<\/span><span> <\/span><span>SupportAgent<\/span><span> <\/span><span>extends<\/span><span> <\/span><span>Think<\/span><span>&lt;<\/span><span>Env<\/span><span>&gt;<\/span><span> <\/span><span>{<\/span><\/div><\/div><div><div><span>  <\/span><span>getMessengers<\/span><span>()<\/span><span> <\/span><span>{<\/span><\/div><\/div><div><div><span>    <\/span><span>return<\/span><span> <\/span><span>defineMessengers<\/span><span>(<\/span><span>{<\/span><\/div><\/div><div><div><span><span>      <\/span><\/span><span>telegram<\/span><span>:<\/span><span> <\/span><span>telegramMessenger<\/span><span>(<\/span><span>{<\/span><\/div><\/div><div><div><span><span>        <\/span><\/span><span>token<\/span><span>:<\/span><span> <\/span><span>this<\/span><span>.<\/span><span>env<\/span><span>.<\/span><span>TELEGRAM_BOT_TOKEN<\/span><span>,<\/span><\/div><\/div><div><div><span><span>        <\/span><\/span><span>userName<\/span><span>:<\/span><span> <\/span><span>\"support_bot\"<\/span><span>,<\/span><\/div><\/div><div><div><span><span>        <\/span><\/span><span>secretToken<\/span><span>:<\/span><span> <\/span><span>this<\/span><span>.<\/span><span>env<\/span><span>.<\/span><span>TELEGRAM_WEBHOOK_SECRET_TOKEN<\/span><span>,<\/span><\/div><\/div><div><div><span>      <\/span><span>}<\/span><span>)<\/span><span>,<\/span><\/div><\/div><div><div><span>    <\/span><span>}<\/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<div><\/div>\n<\/figure>\n<\/div><\/div>\n<\/li>\n<\/ul>\n<p>Each Chat SDK thread maps to its own Think sub-agent by default, so group chats and direct messages do not share memory. Multiple bots, custom conversation routing, and custom providers are all supported.<\/p>\n<h4>Scheduled tasks<\/h4>\n<p>Declare recurring, timezone-aware prompts and handlers with a typed domain-specific language (DSL). Think reconciles the declarations on startup and re-arms the next occurrence after each run, backed by durable idempotent submissions.<\/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>Think<\/span><\/span><span>,<\/span><span><span> <\/span><span>defineScheduledTasks<\/span><span> <\/span><\/span><span>}<\/span><span> from <\/span><span>\"@cloudflare\/think\"<\/span><span>;<\/span><\/div><\/div><div><div>\n<\/div><\/div><div><div><span>export<\/span><span> <\/span><span>class<\/span><span> <\/span><span>DigestAgent<\/span><span> <\/span><span>extends<\/span><span> <\/span><span>Think<\/span><span> <\/span><span>{<\/span><\/div><\/div><div><div><span>  <\/span><span>getScheduledTasks<\/span><span>()<\/span><span> <\/span><span>{<\/span><\/div><\/div><div><div><span>    <\/span><span>return<\/span><span> <\/span><span>defineScheduledTasks<\/span><span>(<\/span><span>{<\/span><\/div><\/div><div><div><span><span>      <\/span><\/span><span>weeklyCommitReport<\/span><span>:<\/span><span> <\/span><span>{<\/span><\/div><\/div><div><div><span><span>        <\/span><\/span><span>schedule<\/span><span>:<\/span><span> <\/span><span>\"every week on monday at 09:00\"<\/span><span>,<\/span><\/div><\/div><div><div><span><span>        <\/span><\/span><span>prompt<\/span><span>:<\/span><\/div><\/div><div><div><span>          <\/span><span>\"Compile my GitHub commits for the last week and summarize them.\"<\/span><span>,<\/span><\/div><\/div><div><div><span>      <\/span><span>},<\/span><\/div><\/div><div><div><span><span>      <\/span><\/span><span>workout<\/span><span>:<\/span><span> <\/span><span>{<\/span><\/div><\/div><div><div><span><span>        <\/span><\/span><span>schedule<\/span><span>:<\/span><span> <\/span><span>\"every day at 08:00 in Europe\/London\"<\/span><span>,<\/span><\/div><\/div><div><div><span><span>        <\/span><\/span><span>prompt<\/span><span>:<\/span><span> <\/span><span>\"Start my workout.\"<\/span><span>,<\/span><\/div><\/div><div><div><span>      <\/span><span>},<\/span><\/div><\/div><div><div><span>    <\/span><span>}<\/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<div><\/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>Think<\/span><\/span><span>,<\/span><span><span> <\/span><span>defineScheduledTasks<\/span><span> <\/span><\/span><span>}<\/span><span> from <\/span><span>\"@cloudflare\/think\"<\/span><span>;<\/span><\/div><\/div><div><div>\n<\/div><\/div><div><div><span>export<\/span><span> <\/span><span>class<\/span><span> <\/span><span>DigestAgent<\/span><span> <\/span><span>extends<\/span><span> <\/span><span>Think<\/span><span>&lt;<\/span><span>Env<\/span><span>&gt;<\/span><span> <\/span><span>{<\/span><\/div><\/div><div><div><span>  <\/span><span>getScheduledTasks<\/span><span>()<\/span><span> <\/span><span>{<\/span><\/div><\/div><div><div><span>    <\/span><span>return<\/span><span> <\/span><span>defineScheduledTasks<\/span><span>(<\/span><span>{<\/span><\/div><\/div><div><div><span><span>      <\/span><\/span><span>weeklyCommitReport<\/span><span>:<\/span><span> <\/span><span>{<\/span><\/div><\/div><div><div><span><span>        <\/span><\/span><span>schedule<\/span><span>:<\/span><span> <\/span><span>\"every week on monday at 09:00\"<\/span><span>,<\/span><\/div><\/div><div><div><span><span>        <\/span><\/span><span>prompt<\/span><span>:<\/span><\/div><\/div><div><div><span>          <\/span><span>\"Compile my GitHub commits for the last week and summarize them.\"<\/span><span>,<\/span><\/div><\/div><div><div><span>      <\/span><span>},<\/span><\/div><\/div><div><div><span><span>      <\/span><\/span><span>workout<\/span><span>:<\/span><span> <\/span><span>{<\/span><\/div><\/div><div><div><span><span>        <\/span><\/span><span>schedule<\/span><span>:<\/span><span> <\/span><span>\"every day at 08:00 in Europe\/London\"<\/span><span>,<\/span><\/div><\/div><div><div><span><span>        <\/span><\/span><span>prompt<\/span><span>:<\/span><span> <\/span><span>\"Start my workout.\"<\/span><span>,<\/span><\/div><\/div><div><div><span>      <\/span><span>},<\/span><\/div><\/div><div><div><span>    <\/span><span>}<\/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<div><\/div>\n<\/figure>\n<\/div><\/div>\n<\/li>\n<\/ul>\n<h4>Think Workflows<\/h4>\n<p>Run a model-driven reasoning step inside a Cloudflare Workflow with <code>ThinkWorkflow<\/code> and <code>step.prompt()<\/code>, with durable typed structured output, long waits, and approval gates.<\/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>z<\/span><span> <\/span><\/span><span>}<\/span><span> from <\/span><span>\"zod\"<\/span><span>;<\/span><\/div><\/div><div><div><span>import <\/span><span>{<\/span><span><span> <\/span><span>ThinkWorkflow<\/span><span> <\/span><\/span><span>}<\/span><span> from <\/span><span>\"@cloudflare\/think\/workflows\"<\/span><span>;<\/span><\/div><\/div><div><div>\n<\/div><\/div><div><div><span>const<\/span><span> <\/span><span>draftSchema<\/span><span> <\/span><span>=<\/span><span> <\/span><span>z<\/span><span>.<\/span><span>object<\/span><span>(<\/span><span>{<\/span><\/div><\/div><div><div><span><span>  <\/span><\/span><span>title<\/span><span>:<\/span><span> <\/span><span>z<\/span><span>.<\/span><span>string<\/span><span>()<\/span><span>,<\/span><\/div><\/div><div><div><span><span>  <\/span><\/span><span>summary<\/span><span>:<\/span><span> <\/span><span>z<\/span><span>.<\/span><span>string<\/span><span>()<\/span><span>,<\/span><\/div><\/div><div><div><span><span>  <\/span><\/span><span>labels<\/span><span>:<\/span><span> <\/span><span>z<\/span><span>.<\/span><span>array<\/span><span>(<\/span><span>z<\/span><span>.<\/span><span>string<\/span><span>())<\/span><span>,<\/span><\/div><\/div><div><div><span>}<\/span><span>)<\/span><span>;<\/span><\/div><\/div><div><div>\n<\/div><\/div><div><div><span>export<\/span><span> <\/span><span>class<\/span><span> <\/span><span>TriageWorkflow<\/span><span> <\/span><span>extends<\/span><span> <\/span><span>ThinkWorkflow<\/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>const<\/span><span> <\/span><span>draft<\/span><span> <\/span><span>=<\/span><span> <\/span><span>await<\/span><span> <\/span><span>step<\/span><span>.<\/span><span>prompt<\/span><span>(<\/span><span>\"triage-issue\"<\/span><span>,<\/span><span> <\/span><span>{<\/span><\/div><\/div><div><div><span><span>      <\/span><\/span><span>prompt<\/span><span>:<\/span><span> <\/span><span>`Triage issue #<\/span><span>${<\/span><span>event<\/span><span>.<\/span><span>payload<\/span><span>.<\/span><span>issueNumber<\/span><span>}<\/span><span>`<\/span><span>,<\/span><\/div><\/div><div><div><span><span>      <\/span><\/span><span>output<\/span><span>:<\/span><span> <\/span><span>draftSchema<\/span><span>,<\/span><\/div><\/div><div><div><span><span>      <\/span><\/span><span>timeout<\/span><span>:<\/span><span> <\/span><span>\"3 days\"<\/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>do<\/span><span>(<\/span><span>\"apply-labels\"<\/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>await<\/span><span> <\/span><span>this<\/span><span>.<\/span><span>agent<\/span><span>.<\/span><span>applyLabels<\/span><span>(<\/span><span>draft<\/span><span>.<\/span><span>labels<\/span><span>)<\/span><span>;<\/span><\/div><\/div><div><div><span>    <\/span><span>}<\/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<div><\/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>z<\/span><span> <\/span><\/span><span>}<\/span><span> from <\/span><span>\"zod\"<\/span><span>;<\/span><\/div><\/div><div><div><span>import <\/span><span>{<\/span><span><span> <\/span><span>ThinkWorkflow<\/span><span> <\/span><\/span><span>}<\/span><span> from <\/span><span>\"@cloudflare\/think\/workflows\"<\/span><span>;<\/span><\/div><\/div><div><div><span>import type <\/span><span>{<\/span><span><span> <\/span><span>ThinkWorkflowStep<\/span><span> <\/span><\/span><span>}<\/span><span> from <\/span><span>\"@cloudflare\/think\/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> from <\/span><span>\"agents\/workflows\"<\/span><span>;<\/span><\/div><\/div><div><div>\n<\/div><\/div><div><div><span>const<\/span><span> <\/span><span>draftSchema<\/span><span> <\/span><span>=<\/span><span> <\/span><span>z<\/span><span>.<\/span><span>object<\/span><span>(<\/span><span>{<\/span><\/div><\/div><div><div><span><span>  <\/span><\/span><span>title<\/span><span>:<\/span><span> <\/span><span>z<\/span><span>.<\/span><span>string<\/span><span>()<\/span><span>,<\/span><\/div><\/div><div><div><span><span>  <\/span><\/span><span>summary<\/span><span>:<\/span><span> <\/span><span>z<\/span><span>.<\/span><span>string<\/span><span>()<\/span><span>,<\/span><\/div><\/div><div><div><span><span>  <\/span><\/span><span>labels<\/span><span>:<\/span><span> <\/span><span>z<\/span><span>.<\/span><span>array<\/span><span>(<\/span><span>z<\/span><span>.<\/span><span>string<\/span><span>())<\/span><span>,<\/span><\/div><\/div><div><div><span>}<\/span><span>)<\/span><span>;<\/span><\/div><\/div><div><div>\n<\/div><\/div><div><div><span>export<\/span><span> <\/span><span>class<\/span><span> <\/span><span>TriageWorkflow<\/span><span> <\/span><span>extends<\/span><span> <\/span><span>ThinkWorkflow<\/span><span>&lt;<\/span><span>TriageAgent<\/span><span>,<\/span><span> <\/span><span>Params<\/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>Params<\/span><span>&gt;,<\/span><span> <\/span><span>step<\/span><span>:<\/span><span> <\/span><span>ThinkWorkflowStep<\/span><span>)<\/span><span> <\/span><span>{<\/span><\/div><\/div><div><div><span>    <\/span><span>const<\/span><span> <\/span><span>draft<\/span><span> <\/span><span>=<\/span><span> <\/span><span>await<\/span><span> <\/span><span>step<\/span><span>.<\/span><span>prompt<\/span><span>(<\/span><span>\"triage-issue\"<\/span><span>,<\/span><span> <\/span><span>{<\/span><\/div><\/div><div><div><span><span>      <\/span><\/span><span>prompt<\/span><span>:<\/span><span> <\/span><span>`Triage issue #<\/span><span>${<\/span><span>event<\/span><span>.<\/span><span>payload<\/span><span>.<\/span><span>issueNumber<\/span><span>}<\/span><span>`<\/span><span>,<\/span><\/div><\/div><div><div><span><span>      <\/span><\/span><span>output<\/span><span>:<\/span><span> <\/span><span>draftSchema<\/span><span>,<\/span><\/div><\/div><div><div><span><span>      <\/span><\/span><span>timeout<\/span><span>:<\/span><span> <\/span><span>\"3 days\"<\/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>do<\/span><span>(<\/span><span>\"apply-labels\"<\/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>await<\/span><span> <\/span><span>this<\/span><span>.<\/span><span>agent<\/span><span>.<\/span><span>applyLabels<\/span><span>(<\/span><span>draft<\/span><span>.<\/span><span>labels<\/span><span>)<\/span><span>;<\/span><\/div><\/div><div><div><span>    <\/span><span>}<\/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<div><\/div>\n<\/figure>\n<\/div><\/div>\n<\/li>\n<\/ul>\n<h4>Production hardening for durable chat recovery<\/h4>\n<p>Durable chat turns have always been designed to survive a mid-turn deploy or Durable Object eviction. This release is a major hardening pass on that machinery for production.<\/p>\n<ul>\n<li><strong>Better recovery during deploys.<\/strong> Turns now ride through continuous deploys and evictions without losing completed work or re-running tools that already ran.<\/li>\n<li><strong>A live &#8220;recovering\u2026&#8221; signal.<\/strong> <code>useAgentChat<\/code> exposes a new <code>isRecovering<\/code> flag, so a recovering turn shows progress instead of looking frozen. Most UIs render <code>isStreaming || isRecovering<\/code> as &#8220;busy&#8221;.<\/li>\n<li><strong>Stalled streams recover.<\/strong> Set <code>chatStreamStallTimeoutMs<\/code> to route a hung provider stream into the same recovery path instead of leaving an infinite spinner.<\/li>\n<li><strong>Sub-agents re-attach.<\/strong> On parent recovery, an in-flight <code>agentTool()<\/code> child is re-attached to its result rather than abandoned and re-run, so long-running children no longer lose work under deploys.<\/li>\n<\/ul>\n<h4>MCP transport improvements<\/h4>\n<ul>\n<li><strong>Resumable streams<\/strong> \u2014 In-flight tool calls over Server-Sent Events (SSE) survive a dropped connection. Clients reconnect with <code>Last-Event-ID<\/code> and replay anything they missed.<\/li>\n<li><strong>Readable server IDs<\/strong> \u2014 <code>addMcpServer<\/code> accepts an optional <code>id<\/code>, so tools surface as readable keys (for example <code>tool_github_create_pull_request<\/code>) instead of opaque connection IDs.<\/li>\n<li><strong>Better handling of concurrent requests<\/strong> \u2014 Overlapping JSON-RPC requests are now correctly correlated to their responses across the HTTP and RPC transports.<\/li>\n<\/ul>\n<h4>Other improvements<\/h4>\n<ul>\n<li><strong>Compaction<\/strong> \u2014 A <code>Session<\/code>&#8216;s <code>tokenCounter<\/code> now also drives the compaction boundary decision (&#8220;what to compress&#8221;), not just the fire\/no-fire trigger.<\/li>\n<li><strong><code>@cloudflare\/worker-bundler<\/code><\/strong> \u2014 Adds a <code>virtualModules<\/code> option to <code>createWorker<\/code> to provide in-memory module source during bundling.<\/li>\n<li><strong>Client-tool continuations<\/strong> \u2014 Parallel tool results now coalesce into a single continuation, immediate resume requests attach to the pending continuation, and server-side <code>needsApproval<\/code> continuations resume reliably after approval.<\/li>\n<\/ul>\n<h4>Upgrade<\/h4>\n<p>To update to the latest version:<\/p>\n<div>\n<div>  <\/div>\n<div>\n<div>\n<pre><code class=\"astro-qph66ij4\"><span>npm<\/span><span> i agents@latest @cloudflare\/think@latest @cloudflare\/ai-chat@latest<\/span><\/code><\/pre>\n<\/div>\n<\/div>\n<div>\n<div>\n<pre><code class=\"astro-qph66ij4\"><span>yarn<\/span><span> add agents@latest @cloudflare\/think@latest @cloudflare\/ai-chat@latest<\/span><\/code><\/pre>\n<\/div>\n<\/div>\n<div>\n<div>\n<pre><code class=\"astro-qph66ij4\"><span>pnpm<\/span><span> add agents@latest @cloudflare\/think@latest @cloudflare\/ai-chat@latest<\/span><\/code><\/pre>\n<\/div>\n<\/div>\n<div>\n<div>\n<pre><code class=\"astro-qph66ij4\"><span>bun<\/span><span> add agents@latest @cloudflare\/think@latest @cloudflare\/ai-chat@latest<\/span><\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<p>Refer to the <a href=\"https:\/\/developers.cloudflare.com\/agents\/api-reference\/\">Agents API reference<\/a> and <a href=\"https:\/\/developers.cloudflare.com\/agents\/api-reference\/chat-agents\/\">Chat agents documentation<\/a> for more information.<\/p>","protected":false},"excerpt":{"rendered":"<p>The latest release of the Agents SDK adds four new ways to build with @cloudflare\/think: on-demand Agent Skills, chat messengers (starting with Telegram), declarative scheduled tasks, and durable reasoning steps inside Workflows. This release also significantly hardens durable chat recovery, so turns reliably ride through deploys, evictions, and stalled model streams in production. Agent Skills [&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-521","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/wordpress.securinsight.ca\/index.php\/wp-json\/wp\/v2\/posts\/521","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=521"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.securinsight.ca\/index.php\/wp-json\/wp\/v2\/posts\/521\/revisions"}],"wp:attachment":[{"href":"https:\/\/wordpress.securinsight.ca\/index.php\/wp-json\/wp\/v2\/media?parent=521"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.securinsight.ca\/index.php\/wp-json\/wp\/v2\/categories?post=521"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.securinsight.ca\/index.php\/wp-json\/wp\/v2\/tags?post=521"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}