openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
77 lines (76 loc) • 3.94 kB
JavaScript
import { l as normalizeOptionalString } from "./string-coerce-1VuiLaaR.mjs";
import { n as normalizeAgentId } from "./agent-id-D1-Q6vR4.mjs";
import { C as tryResolveAmbientOwnerAgentId, D as withAgentRosterFactsBatch, r as resolveAgentConfig } from "./agent-scope-config-CDYpzA0r.mjs";
import "./session-key-C09ow4h0.mjs";
import { i as listAgentIds, n as listAgentEntries } from "./agent-roster-BXD1uMJD.mjs";
import { t as parseDurationMs } from "./parse-duration-C4JaJvt9.mjs";
import "./heartbeat-BjLIgeQc.mjs";
//#region src/infra/heartbeat-agent-resolution.ts
function tryResolveAmbientHeartbeatAgentId(cfg) {
return tryResolveAmbientOwnerAgentId(cfg, cfg.agents?.defaults?.heartbeat?.agentId);
}
//#endregion
//#region src/infra/heartbeat-config.ts
/** Pure heartbeat enrollment and configuration shared by scheduling, health, and Doctor. */
const DEFAULT_HEARTBEAT_TIMEOUT_SECONDS = 600;
function resolveHeartbeatConfig(cfg, agentId) {
const defaults = cfg.agents?.defaults?.heartbeat;
if (!agentId) return defaults;
const overrides = resolveAgentConfig(cfg, agentId)?.heartbeat;
return defaults || overrides ? {
...defaults,
...overrides
} : void 0;
}
function resolveHeartbeatForWake(params) {
const configuredHeartbeat = params.configuredHeartbeat ?? resolveHeartbeatConfig(params.cfg, params.agentId);
const heartbeat = params.requestedHeartbeat ? {
...configuredHeartbeat,
...params.requestedHeartbeat
} : configuredHeartbeat;
if (heartbeat && params.source === "cron" && params.requestedHeartbeat?.target === "last") {
delete heartbeat.to;
delete heartbeat.accountId;
}
return heartbeat;
}
/** Resolve the cadence owned by the effective heartbeat configuration. */
function resolveHeartbeatIntervalMs(cfg, overrideEvery, heartbeat) {
const raw = overrideEvery ?? heartbeat?.every ?? cfg.agents?.defaults?.heartbeat?.every ?? "30m";
const trimmed = normalizeOptionalString(raw);
if (!trimmed) return null;
try {
const intervalMs = parseDurationMs(trimmed, { defaultUnit: "m" });
return intervalMs > 0 ? intervalMs : null;
} catch {
return null;
}
}
function resolveHeartbeatTimeoutOverrideSeconds(cfg, heartbeat) {
if (typeof heartbeat?.timeoutSeconds === "number") return heartbeat.timeoutSeconds;
const agentDefaultTimeoutSeconds = cfg.agents?.defaults?.timeoutSeconds;
if (typeof agentDefaultTimeoutSeconds === "number" && Number.isFinite(agentDefaultTimeoutSeconds)) return agentDefaultTimeoutSeconds === 0 ? 0 : Math.max(1, Math.floor(agentDefaultTimeoutSeconds));
const intervalMs = resolveHeartbeatIntervalMs(cfg, void 0, heartbeat);
if (!intervalMs) return DEFAULT_HEARTBEAT_TIMEOUT_SECONDS;
return Math.max(1, Math.min(DEFAULT_HEARTBEAT_TIMEOUT_SECONDS, Math.ceil(intervalMs / 1e3)));
}
function resolveHeartbeatAgentIds(cfg) {
const explicitAgents = listAgentEntries(cfg).filter((entry) => entry.heartbeat);
if (explicitAgents.length > 0) return explicitAgents.map((entry) => normalizeAgentId(entry.id)).filter(Boolean);
const configuredAgentId = normalizeOptionalString(cfg.agents?.defaults?.heartbeat?.agentId);
if (configuredAgentId) return [normalizeAgentId(configuredAgentId)];
if (cfg.agents?.defaults?.heartbeat) return listAgentIds(cfg);
const agentId = tryResolveAmbientHeartbeatAgentId(cfg);
return agentId ? [agentId] : [];
}
function resolveHeartbeatAgents(cfg) {
return withAgentRosterFactsBatch(cfg, () => resolveHeartbeatAgentIds(cfg).map((agentId) => ({
agentId,
heartbeat: resolveHeartbeatConfig(cfg, agentId)
})));
}
function isHeartbeatOwnerUnresolved(cfg) {
return listAgentIds(cfg).length > 1 && resolveHeartbeatAgentIds(cfg).length === 0;
}
//#endregion
export { resolveHeartbeatForWake as a, tryResolveAmbientHeartbeatAgentId as c, resolveHeartbeatConfig as i, resolveHeartbeatAgentIds as n, resolveHeartbeatIntervalMs as o, resolveHeartbeatAgents as r, resolveHeartbeatTimeoutOverrideSeconds as s, isHeartbeatOwnerUnresolved as t };