TL;DR: You can now create and save custom configurations of the Threat Events dashboard, allowing you to instantly return to specific filtered views — such as industry-specific attacks or regional Sankey flows — without manual reconfiguration.
Why this matters
Threat intelligence is most effective when it is personalized. Previously, analysts had to manually re-apply complex filters (like combining specific industry datasets with geographic origins) every time they logged in. This update provides material value by:
Analysts can now jump straight into “Known Ransomware Infrastructure” or “Retail Sector Targets” views with a single click, eliminating repetitive setup tasks
Teams can ensure everyone is looking at the same data subsets by using standardized saved views, reducing the risk of missing critical patterns due to inconsistent filtering.
Cloudflare Tunnel is now available in the main Cloudflare Dashboard at Networking > Tunnels, bringing first-class Tunnel management to developers using Tunnel for securing origin servers.
This new experience provides everything you need to manage Tunnels for public applications, including:
Full Tunnel lifecycle management: Create, configure, delete, and monitor all your Tunnels in one place.
Native integrations: View Tunnels by name when configuring DNS records and Workers VPC — no more copy-pasting UUIDs.
Real-time visibility: Monitor replicas and Tunnel health status directly in the dashboard.
The @cloudflare/codemode package has been rewritten into a modular, runtime-agnostic SDK.
Code Mode enables LLMs to write and execute code that orchestrates your tools, instead of calling them one at a time. This can (and does) yield significant token savings, reduces context window pressure and improves overall model performance on a task.
The new Executor interface is runtime agnostic and comes with a prebuilt DynamicWorkerExecutor to run generated code in a Dynamic Worker Loader.
Breaking changes
Removed experimental_codemode() and CodeModeProxy — the package no longer owns an LLM call or model choice
New import path: createCodeTool() is now exported from @cloudflare/codemode/ai
New features
createCodeTool() — Returns a standard AI SDK Tool to use in your AI agents.
Executor interface — Minimal execute(code, fns) contract. Implement for any code sandboxing primitive or runtime.
DynamicWorkerExecutor
Runs code in a Dynamic Worker. It comes with the following features:
Network isolation — fetch() and connect() blocked by default (globalOutbound: null) when using DynamicWorkerExecutor
Console capture — console.log/warn/error captured and returned in ExecuteResult.logs
Execution timeout — Configurable via timeout option (default 30s)
Usage
JavaScript
import {createCodeTool} from "@cloudflare/codemode/ai";
import {DynamicWorkerExecutor} from "@cloudflare/codemode";
Cloudflare Tunnel is now available in the main Cloudflare Dashboard at Networking > Tunnels, bringing first-class Tunnel management to developers using Tunnel for securing origin servers.
This new experience provides everything you need to manage Tunnels for public applications, including:
Full Tunnel lifecycle management: Create, configure, delete, and monitor all your Tunnels in one place.
Native integrations: View Tunnels by name when configuring DNS records and Workers VPC — no more copy-pasting UUIDs.
Real-time visibility: Monitor replicas and Tunnel health status directly in the dashboard.
The @cloudflare/codemode package has been rewritten into a modular, runtime-agnostic SDK.
Code Mode enables LLMs to write and execute TypeScript that orchestrates your tools, instead of calling them one at a time. This can (and does) yield significant token savings, reduces context window pressure and improves overall model performance on a task.
The new Executor interface is runtime agnostic and comes with a prebuilt DynamicWorkerExecutor to run generated code in a Dynamic Worker Loader.
Breaking changes
Removed experimental_codemode() and CodeModeProxy — the package no longer owns an LLM call or model choice
New import path: createCodeTool() is now exported from @cloudflare/codemode/ai
New features
createCodeTool() — Returns a standard AI SDK Tool to use in your AI agents.
Executor interface — Minimal execute(code, fns) contract. Implement for any code sandboxing primitive or runtime.
DynamicWorkerExecutor
Runs code in a Dynamic Worker. It comes with the following features:
Network isolation — fetch() and connect() blocked by default (globalOutbound: null) when using DynamicWorkerExecutor
Console capture — console.log/warn/error captured and returned in ExecuteResult.logs
Execution timeout — Configurable via timeout option (default 30s)
Usage
JavaScript
import {createCodeTool} from "@cloudflare/codemode/ai";
import {DynamicWorkerExecutor} from "@cloudflare/codemode";
Cloudflare Tunnel is now available in the main Cloudflare Dashboard at Networking > Tunnels, bringing first-class Tunnel management to developers using Tunnel for securing origin servers.
This new experience provides everything you need to manage Tunnels for public applications, including:
Full Tunnel lifecycle management: Create, configure, delete, and monitor all your Tunnels in one place.
Native integrations: View Tunnels by name when configuring DNS records and Workers VPC — no more copy-pasting UUIDs.
Real-time visibility: Monitor replicas and Tunnel health status directly in the dashboard.
The @cloudflare/codemode package has been rewritten into a modular, runtime-agnostic SDK.
Code Mode enables LLMs to write and execute code that orchestrates your tools, instead of calling them one at a time. This can (and does) yield significant token savings, reduces context window pressure and improves overall model performance on a task.
The new Executor interface is runtime agnostic and comes with a prebuilt DynamicWorkerExecutor to run generated code in a Dynamic Worker Loader.
Breaking changes
Removed experimental_codemode() and CodeModeProxy — the package no longer owns an LLM call or model choice
New import path: createCodeTool() is now exported from @cloudflare/codemode/ai
New features
createCodeTool() — Returns a standard AI SDK Tool to use in your AI agents.
Executor interface — Minimal execute(code, fns) contract. Implement for any code sandboxing primitive or runtime.
DynamicWorkerExecutor
Runs code in a Dynamic Worker. It comes with the following features:
Network isolation — fetch() and connect() blocked by default (globalOutbound: null) when using DynamicWorkerExecutor
Console capture — console.log/warn/error captured and returned in ExecuteResult.logs
Execution timeout — Configurable via timeout option (default 30s)
Usage
JavaScript
import {createCodeTool} from "@cloudflare/codemode/ai";
import {DynamicWorkerExecutor} from "@cloudflare/codemode";
Cloudflare Tunnel is now available in the main Cloudflare Dashboard at Networking > Tunnels, bringing first-class Tunnel management to developers using Tunnel for securing origin servers.
This new experience provides everything you need to manage Tunnels for public applications, including:
Full Tunnel lifecycle management: Create, configure, delete, and monitor all your Tunnels in one place.
Native integrations: View Tunnels by name when configuring DNS records and Workers VPC — no more copy-pasting UUIDs.
Real-time visibility: Monitor replicas and Tunnel health status directly in the dashboard.
The @cloudflare/codemode package has been rewritten into a modular, runtime-agnostic SDK.
Code Mode enables LLMs to write and execute code that orchestrates your tools, instead of calling them one at a time. This can (and does) yield significant token savings, reduces context window pressure and improves overall model performance on a task.
The new Executor interface is runtime agnostic and comes with a prebuilt DynamicWorkerExecutor to run generated code in a Dynamic Worker Loader.
Breaking changes
Removed experimental_codemode() and CodeModeProxy — the package no longer owns an LLM call or model choice
New import path: createCodeTool() is now exported from @cloudflare/codemode/ai
New features
createCodeTool() — Returns a standard AI SDK Tool to use in your AI agents.
Executor interface — Minimal execute(code, fns) contract. Implement for any code sandboxing primitive or runtime.
DynamicWorkerExecutor
Runs code in a Dynamic Worker. It comes with the following features:
Network isolation — fetch() and connect() blocked by default (globalOutbound: null) when using DynamicWorkerExecutor
Console capture — console.log/warn/error captured and returned in ExecuteResult.logs
Execution timeout — Configurable via timeout option (default 30s)
Usage
JavaScript
import {createCodeTool} from "@cloudflare/codemode/ai";
import {DynamicWorkerExecutor} from "@cloudflare/codemode";
The latest release of the Agents SDK adds built-in retry utilities, per-connection protocol message control, and a fully rewritten @cloudflare/ai-chat with data parts, tool approval persistence, and zero breaking changes.
Retry utilities
A new this.retry() method lets you retry any async operation with exponential backoff and jitter. You can pass an optional shouldRetry predicate to bail early on non-retryable errors.
Retry options are validated eagerly at enqueue/schedule time, and invalid values throw immediately. Internal retries have also been added for workflow operations (terminateWorkflow, pauseWorkflow, and others) with Durable Object-aware error detection.
Per-connection protocol message control
Agents automatically send JSON text frames (identity, state, MCP server lists) to every WebSocket connection. You can now suppress these per-connection for clients that cannot handle them — binary-only devices, MQTT clients, or lightweight embedded systems.
Connections with protocol messages disabled still fully participate in RPC and regular messaging. Use isConnectionProtocolEnabled(connection) to check a connection’s status at any time. The flag persists across Durable Object hibernation.
The first stable release of @cloudflare/ai-chat ships alongside this release with a major refactor of AIChatAgent internals — new ResumableStream class, WebSocket ChatTransport, and simplified SSE parsing — with zero breaking changes. Existing code using AIChatAgent and useAgentChat works as-is.
Key new features:
Data parts — Attach typed JSON blobs (data-*) to messages alongside text. Supports reconciliation (type+id updates in-place), append, and transient parts (ephemeral via onData callback). See Data parts.
Tool approval persistence — The needsApproval approval UI now survives page refresh and DO hibernation. The streaming message is persisted to SQLite when a tool enters approval-requested state.
maxPersistedMessages — Cap SQLite message storage with automatic oldest-message deletion.
body option on useAgentChat — Send custom data with every request (static or dynamic).
Incremental persistence — Hash-based cache to skip redundant SQL writes.
Row size guard — Automatic two-pass compaction when messages approach the SQLite 2 MB limit.
autoContinueAfterToolResult defaults to true — Client-side tool results and tool approvals now automatically trigger a server continuation, matching server-executed tool behavior. Set autoContinueAfterToolResult: false in useAgentChat to restore the previous behavior.
Notable bug fixes:
Resolved stream resumption race conditions
Resolved an issue where setMessages functional updater sent empty arrays
Resolved an issue where client tool schemas were lost after DO hibernation
Resolved InvalidPromptError after tool approval (approval.id was dropped)
Resolved an issue where message metadata was not propagated on broadcast/resume paths
Resolved an issue where clearAll() did not clear in-memory chunk buffers
Resolved an issue where reasoning-delta silently dropped data when reasoning-start was missed during stream resumption
Synchronous queue and schedule getters
getQueue(), getQueues(), getSchedule(), dequeue(), dequeueAll(), and dequeueAllByCallback() were unnecessarily async despite only performing synchronous SQL operations. They now return values directly instead of wrapping them in Promises. This is backward compatible — existing code using await on these methods will continue to work.
Other improvements
Fix TypeScript “excessively deep” error — A depth counter on CanSerialize and IsSerializableParam types bails out to true after 10 levels of recursion, preventing the “Type instantiation is excessively deep” error with deeply nested types like AI SDK CoreMessage[].
POST SSE keepalive — The POST SSE handler now sends event: ping every 30 seconds to keep the connection alive, matching the existing GET SSE handler behavior. This prevents POST response streams from being silently dropped by proxies during long-running tool calls.
Widened peer dependency ranges — Peer dependency ranges across packages have been widened to prevent cascading major bumps during 0.x minor releases. @cloudflare/ai-chat and @cloudflare/codemode are now marked as optional peer dependencies.