openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
72 lines (71 loc) • 3.48 kB
JavaScript
import { a as normalizeLowercaseStringOrEmpty, c as normalizeOptionalString } from "./string-coerce-mnp54Vah.js";
import { c as peekSystemEventEntries, t as consumeSelectedSystemEventEntries } from "./system-events-C5WI3S5a.js";
import { a as resolveUserTimezone } from "./date-time-CcWivhrg.js";
import { n as formatZonedTimestamp, r as resolveTimezone, t as formatUtcTimestamp } from "./format-datetime-DO2rqkXr.js";
import { t as buildChannelSummary } from "./channel-summary-CbJAF_yT.js";
import { i as isExecCompletionEvent } from "./heartbeat-events-filter-CaXkBMoX.js";
//#region src/auto-reply/reply/session-system-events.ts
function selectGenericSystemEvents(events) {
return events.filter((event) => !isExecCompletionEvent(event.text));
}
function compactSystemEvent(line) {
const trimmed = line.trim();
if (!trimmed) return null;
const lower = normalizeLowercaseStringOrEmpty(trimmed);
if (lower.includes("reason periodic")) return null;
if (lower.startsWith("read heartbeat.md")) return null;
if (lower.includes("heartbeat poll") || lower.includes("heartbeat wake")) return null;
if (trimmed.startsWith("Node:")) return trimmed.replace(/ · last input [^·]+/i, "").trim();
return trimmed;
}
function resolveSystemEventTimezone(cfg) {
const raw = normalizeOptionalString(cfg.agents?.defaults?.envelopeTimezone);
if (!raw) return { mode: "local" };
const lowered = normalizeLowercaseStringOrEmpty(raw);
if (lowered === "utc" || lowered === "gmt") return { mode: "utc" };
if (lowered === "local" || lowered === "host") return { mode: "local" };
if (lowered === "user") return {
mode: "iana",
timeZone: resolveUserTimezone(cfg.agents?.defaults?.userTimezone)
};
const explicit = resolveTimezone(raw);
return explicit ? {
mode: "iana",
timeZone: explicit
} : { mode: "local" };
}
function formatSystemEventTimestamp(ts, cfg) {
const date = new Date(ts);
if (Number.isNaN(date.getTime())) return "unknown-time";
const zone = resolveSystemEventTimezone(cfg);
if (zone.mode === "utc") return formatUtcTimestamp(date, { displaySeconds: true });
if (zone.mode === "local") return formatZonedTimestamp(date, { displaySeconds: true }) ?? "unknown-time";
return formatZonedTimestamp(date, {
timeZone: zone.timeZone,
displaySeconds: true
}) ?? "unknown-time";
}
/** Drain queued system events, format as `System:` lines, return the block text (or undefined). */
async function drainFormattedSystemEvents(params) {
const summaryLines = [];
const systemLines = [];
const queued = consumeSelectedSystemEventEntries(params.sessionKey, selectGenericSystemEvents(peekSystemEventEntries(params.sessionKey)));
for (const event of queued) {
const compacted = compactSystemEvent(event.text);
if (!compacted) continue;
const timestamp = `[${formatSystemEventTimestamp(event.ts, params.cfg)}]`;
let index = 0;
for (const subline of compacted.split("\n")) {
systemLines.push(`System: ${index === 0 ? `${timestamp} ` : ""}${subline}`);
index += 1;
}
}
if (params.isMainSession && params.isNewSession) {
const summary = await buildChannelSummary(params.cfg);
if (summary.length > 0) for (const line of summary) for (const subline of line.split("\n")) summaryLines.push(`System: ${subline}`);
}
if (summaryLines.length === 0 && systemLines.length === 0) return;
return summaryLines.length > 0 ? [...summaryLines, ...systemLines].join("\n") : systemLines.join("\n");
}
//#endregion
export { drainFormattedSystemEvents as t };