























@@ -298,6 +298,34 @@ function resolveHeartbeatConfig(
298298return { ...defaults, ...overrides };
299299}
300300301+function omitExplicitHeartbeatDestination(heartbeat: HeartbeatConfig | undefined) {
302+if (!heartbeat) {
303+return undefined;
304+}
305+const next = { ...heartbeat };
306+delete next.to;
307+delete next.accountId;
308+return next;
309+}
310+311+function resolveHeartbeatForWake(params: {
312+cfg: OpenClawConfig;
313+agentId: string;
314+configuredHeartbeat?: HeartbeatConfig;
315+requestedHeartbeat?: HeartbeatConfig;
316+source?: HeartbeatWakeSource;
317+mergeRequestedHeartbeat: boolean;
318+}): HeartbeatConfig | undefined {
319+const base = params.configuredHeartbeat ?? resolveHeartbeatConfig(params.cfg, params.agentId);
320+const heartbeat =
321+params.requestedHeartbeat && params.mergeRequestedHeartbeat
322+ ? { ...base, ...params.requestedHeartbeat }
323+ : (params.requestedHeartbeat ?? base);
324+return params.source === "cron" && params.requestedHeartbeat?.target === "last"
325+ ? omitExplicitHeartbeatDestination(heartbeat)
326+ : heartbeat;
327+}
328+301329function resolveHeartbeatAgents(cfg: OpenClawConfig): HeartbeatAgent[] {
302330const list = cfg.agents?.list ?? [];
303331if (hasExplicitHeartbeatAgents(cfg)) {
@@ -1180,7 +1208,13 @@ export async function runHeartbeatOnce(opts: {
11801208const agentId = normalizeAgentId(
11811209explicitAgentId || forcedSessionAgentId || resolveDefaultAgentId(cfg),
11821210);
1183-const heartbeat = opts.heartbeat ?? resolveHeartbeatConfig(cfg, agentId);
1211+const heartbeat = resolveHeartbeatForWake({
1212+ cfg,
1213+ agentId,
1214+requestedHeartbeat: opts.heartbeat,
1215+source: opts.source,
1216+mergeRequestedHeartbeat: opts.source === "cron",
1217+});
11841218if (!areHeartbeatsEnabled()) {
11851219return { status: "skipped", reason: "disabled" };
11861220}
@@ -2183,8 +2217,6 @@ export function startHeartbeatRunner(opts: {
21832217const requestedAgentId = params?.agentId ? normalizeAgentId(params.agentId) : undefined;
21842218const requestedSessionKey = normalizeOptionalString(params?.sessionKey);
21852219const requestedHeartbeat = params?.heartbeat;
2186-const resolveRequestedHeartbeat = (heartbeat?: HeartbeatConfig) =>
2187-requestedHeartbeat ? { ...heartbeat, ...requestedHeartbeat } : heartbeat;
21882220const isInterval = reason === "interval";
21892221const startedAt = Date.now();
21902222const now = startedAt;
@@ -2208,7 +2240,14 @@ export function startHeartbeatRunner(opts: {
22082240const res = await runOnce({
22092241cfg: state.cfg,
22102242agentId: targetAgent.agentId,
2211-heartbeat: resolveRequestedHeartbeat(targetAgent.heartbeat),
2243+heartbeat: resolveHeartbeatForWake({
2244+cfg: state.cfg,
2245+agentId: targetAgent.agentId,
2246+configuredHeartbeat: targetAgent.heartbeat,
2247+ requestedHeartbeat,
2248+source: params.source,
2249+mergeRequestedHeartbeat: true,
2250+}),
22122251source: params.source,
22132252 intent,
22142253 reason,
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。