From 49ae60d6cae116c7beefb5ce6b37aefd20fd4613 Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Sat, 18 Apr 2026 14:20:40 +0530 Subject: [PATCH] fix(cron): keep message tool without delivery --- CHANGELOG.md | 1 + src/cron/isolated-agent/run.ts | 8 +------- 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 62afe1ebeac..78597287113 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -49,6 +49,7 @@ Docs: https://docs.openclaw.ai - Agents/TTS: report failed speech synthesis as a real tool error so unconfigured providers no longer feed successful TTS failure output back into agent loops. (#67980) Thanks @lawrence3699. - Gateway/wake: allow unknown properties on wake payloads so external senders like Paperclip can attach opaque metadata without failing schema validation. (#68355) Thanks @kagura-agent. - Matrix: honor `channels.matrix.network.dangerouslyAllowPrivateNetwork` when creating clients for private-network homeservers. (#68332) Thanks @kagura-agent. +- Cron/message tool: keep cron-owned runs with `delivery.mode: "none"` on the normal message-tool path so they can still send explicit messages, create threads, and route conditionally when no runner-owned delivery target is active. (#68482) Thanks @obviyus. ## 2026.4.15 diff --git a/src/cron/isolated-agent/run.ts b/src/cron/isolated-agent/run.ts index 6b25464c3c8..a4fd0046f7d 100644 --- a/src/cron/isolated-agent/run.ts +++ b/src/cron/isolated-agent/run.ts @@ -124,17 +124,13 @@ type IsolatedDeliveryContract = "cron-owned" | "shared"; function resolveCronToolPolicy(params: { deliveryRequested: boolean; resolvedDelivery: ResolvedCronDeliveryTarget; - deliveryContract: IsolatedDeliveryContract; }) { return { // Only enforce an explicit message target when the cron delivery target // was successfully resolved. When resolution fails the agent should not // be blocked by a target it cannot satisfy (#27898). requireExplicitMessageTarget: params.deliveryRequested && params.resolvedDelivery.ok, - // Cron-owned runs always route user-facing delivery through the runner - // itself. Shared callers keep the previous behavior so non-cron paths do - // not silently lose the message tool when no explicit delivery is active. - disableMessageTool: params.deliveryContract === "cron-owned" ? true : params.deliveryRequested, + disableMessageTool: params.deliveryRequested, }; } @@ -162,7 +158,6 @@ async function resolveCronDeliveryContext(params: { toolPolicy: resolveCronToolPolicy({ deliveryRequested: false, resolvedDelivery, - deliveryContract: params.deliveryContract, }), }; } @@ -181,7 +176,6 @@ async function resolveCronDeliveryContext(params: { toolPolicy: resolveCronToolPolicy({ deliveryRequested: deliveryPlan.requested, resolvedDelivery, - deliveryContract: params.deliveryContract, }), }; }