mirror of
https://github.com/openclaw/openclaw.git
synced 2026-05-08 17:38:27 +00:00
refactor: use compact formatZonedTimestamp for injection
Replace verbose formatUserTime (Wednesday, January 28th, 2026 — 8:30 PM) with the same formatZonedTimestamp used by channel envelopes (2026-01-28 20:30 EST). This: - Saves ~4 tokens per message (~7 vs ~11) - Uses globally unambiguous YYYY-MM-DD 24h format - Removes 12/24h config option (always 24h, agent-facing) - Anchors envelope detection to the actual format function — if channels change their timestamp format, our injection + detection change too - Adds test that compares injection output to formatZonedTimestamp directly Exported formatZonedTimestamp from auto-reply/envelope.ts for reuse.
This commit is contained in:
committed by
Tak Hoffman
parent
08886eaaa3
commit
76391bba3f
@@ -1,58 +1,56 @@
|
||||
import {
|
||||
formatUserTime,
|
||||
resolveUserTimeFormat,
|
||||
resolveUserTimezone,
|
||||
} from "../../agents/date-time.js";
|
||||
import { resolveUserTimezone } from "../../agents/date-time.js";
|
||||
import { formatZonedTimestamp } from "../../auto-reply/envelope.js";
|
||||
import type { MoltbotConfig } from "../../config/types.js";
|
||||
|
||||
/**
|
||||
* Envelope pattern used by channel plugins (Discord, Telegram, etc.):
|
||||
* [Channel sender 2026-01-28 20:31 EST] message text
|
||||
*
|
||||
* Messages arriving through channels already have timestamps.
|
||||
* We skip injection for those to avoid double-stamping.
|
||||
*/
|
||||
const ENVELOPE_PATTERN = /^\[[\w]+ .+ \d{4}-\d{2}-\d{2}/;
|
||||
|
||||
/**
|
||||
* Cron jobs inject "Current time: ..." into their messages.
|
||||
* Skip injection for those too.
|
||||
* Skip injection for those.
|
||||
*/
|
||||
const CRON_TIME_PATTERN = /Current time: /;
|
||||
|
||||
/**
|
||||
* Matches a leading `[... YYYY-MM-DD HH:MM ...]` envelope — either from
|
||||
* channel plugins or from a previous injection. Uses the same YYYY-MM-DD
|
||||
* HH:MM format as {@link formatZonedTimestamp}, so detection stays in sync
|
||||
* with the formatting.
|
||||
*/
|
||||
const TIMESTAMP_ENVELOPE_PATTERN = /^\[.*\d{4}-\d{2}-\d{2} \d{2}:\d{2}/;
|
||||
|
||||
export interface TimestampInjectionOptions {
|
||||
timezone?: string;
|
||||
timeFormat?: "12" | "24";
|
||||
now?: Date;
|
||||
}
|
||||
|
||||
/**
|
||||
* Injects a timestamp prefix into a message if one isn't already present.
|
||||
* Injects a compact timestamp prefix into a message if one isn't already
|
||||
* present. Uses the same `YYYY-MM-DD HH:MM TZ` format as channel envelope
|
||||
* timestamps ({@link formatZonedTimestamp}), keeping token cost low (~7
|
||||
* tokens) and format consistent across all agent contexts.
|
||||
*
|
||||
* Used by the gateway agent handler to give all agent contexts (TUI, web,
|
||||
* spawned subagents, sessions_send, heartbeats) date/time awareness without
|
||||
* modifying the system prompt (which is cached for stability).
|
||||
* Used by the gateway `agent` and `chat.send` handlers to give TUI, web,
|
||||
* spawned subagents, `sessions_send`, and heartbeat wake events date/time
|
||||
* awareness — without modifying the system prompt (which is cached).
|
||||
*
|
||||
* Channel messages (Discord, Telegram, etc.) already have timestamps via
|
||||
* envelope formatting and take a separate code path — they never reach
|
||||
* the agent handler, so there's no double-stamping risk.
|
||||
* these handlers, so there is no double-stamping risk. The detection
|
||||
* pattern is a safety net for edge cases.
|
||||
*
|
||||
* @see https://github.com/moltbot/moltbot/issues/3658
|
||||
*/
|
||||
export function injectTimestamp(message: string, opts?: TimestampInjectionOptions): string {
|
||||
if (!message.trim()) return message;
|
||||
|
||||
// Already has a channel envelope timestamp
|
||||
if (ENVELOPE_PATTERN.test(message)) return message;
|
||||
// Already has an envelope or injected timestamp
|
||||
if (TIMESTAMP_ENVELOPE_PATTERN.test(message)) return message;
|
||||
|
||||
// Already has a cron-injected timestamp
|
||||
if (CRON_TIME_PATTERN.test(message)) return message;
|
||||
|
||||
const now = opts?.now ?? new Date();
|
||||
const timezone = opts?.timezone ?? "UTC";
|
||||
const timeFormat = opts?.timeFormat ?? "12";
|
||||
|
||||
const formatted = formatUserTime(now, timezone, resolveUserTimeFormat(timeFormat));
|
||||
const formatted = formatZonedTimestamp(now, timezone);
|
||||
if (!formatted) return message;
|
||||
|
||||
return `[${formatted}] ${message}`;
|
||||
@@ -64,6 +62,5 @@ export function injectTimestamp(message: string, opts?: TimestampInjectionOption
|
||||
export function timestampOptsFromConfig(cfg: MoltbotConfig): TimestampInjectionOptions {
|
||||
return {
|
||||
timezone: resolveUserTimezone(cfg.agents?.defaults?.userTimezone),
|
||||
timeFormat: cfg.agents?.defaults?.timeFormat as "12" | "24" | undefined,
|
||||
};
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user