Gateway: inject timestamps into agent/chat.send (#3705) (thanks @conroywhitney, @CashWilliams)

main
Tak Hoffman 2026-01-31 09:24:27 -06:00
parent 8a5b139a9f
commit 9c29853014
2 changed files with 16 additions and 7 deletions

View File

@ -18,6 +18,7 @@ Docs: https://docs.openclaw.ai
- Auth: switch Kimi Coding to built-in provider; normalize OAuth profile email. - Auth: switch Kimi Coding to built-in provider; normalize OAuth profile email.
- Auth: add MiniMax OAuth plugin + onboarding option. (#4521) Thanks @Maosghoul. - Auth: add MiniMax OAuth plugin + onboarding option. (#4521) Thanks @Maosghoul.
- Agents: update pi SDK/API usage and dependencies. - Agents: update pi SDK/API usage and dependencies.
- Gateway: inject timestamps into agent and chat.send messages. (#3705) Thanks @conroywhitney, @CashWilliams.
- Web UI: refresh sessions after chat commands and improve session display names. - Web UI: refresh sessions after chat commands and improve session display names.
- Build: move TypeScript builds to `tsdown` + `tsgo` (faster builds, CI typechecks), update tsconfig target, and clean up lint rules. - Build: move TypeScript builds to `tsdown` + `tsgo` (faster builds, CI typechecks), update tsconfig target, and clean up lint rules.
- Build: align npm tar override and bin metadata so the `openclaw` CLI entrypoint is preserved in npm publishes. - Build: align npm tar override and bin metadata so the `openclaw` CLI entrypoint is preserved in npm publishes.

View File

@ -1,6 +1,6 @@
import { resolveUserTimezone } from "../../agents/date-time.js"; import { resolveUserTimezone } from "../../agents/date-time.js";
import { formatZonedTimestamp } from "../../auto-reply/envelope.js"; import { formatZonedTimestamp } from "../../auto-reply/envelope.js";
import type { MoltbotConfig } from "../../config/types.js"; import type { OpenClawConfig } from "../../config/types.js";
/** /**
* Cron jobs inject "Current time: ..." into their messages. * Cron jobs inject "Current time: ..." into their messages.
@ -39,19 +39,27 @@ export interface TimestampInjectionOptions {
* @see https://github.com/moltbot/moltbot/issues/3658 * @see https://github.com/moltbot/moltbot/issues/3658
*/ */
export function injectTimestamp(message: string, opts?: TimestampInjectionOptions): string { export function injectTimestamp(message: string, opts?: TimestampInjectionOptions): string {
if (!message.trim()) return message; if (!message.trim()) {
return message;
}
// Already has an envelope or injected timestamp // Already has an envelope or injected timestamp
if (TIMESTAMP_ENVELOPE_PATTERN.test(message)) return message; if (TIMESTAMP_ENVELOPE_PATTERN.test(message)) {
return message;
}
// Already has a cron-injected timestamp // Already has a cron-injected timestamp
if (CRON_TIME_PATTERN.test(message)) return message; if (CRON_TIME_PATTERN.test(message)) {
return message;
}
const now = opts?.now ?? new Date(); const now = opts?.now ?? new Date();
const timezone = opts?.timezone ?? "UTC"; const timezone = opts?.timezone ?? "UTC";
const formatted = formatZonedTimestamp(now, timezone); const formatted = formatZonedTimestamp(now, timezone);
if (!formatted) return message; if (!formatted) {
return message;
}
// 3-letter DOW: small models (8B) can't reliably derive day-of-week from // 3-letter DOW: small models (8B) can't reliably derive day-of-week from
// a date, and may treat a bare "Wed" as a typo. Costs ~1 token. // a date, and may treat a bare "Wed" as a typo. Costs ~1 token.
@ -63,9 +71,9 @@ export function injectTimestamp(message: string, opts?: TimestampInjectionOption
} }
/** /**
* Build TimestampInjectionOptions from a MoltbotConfig. * Build TimestampInjectionOptions from an OpenClawConfig.
*/ */
export function timestampOptsFromConfig(cfg: MoltbotConfig): TimestampInjectionOptions { export function timestampOptsFromConfig(cfg: OpenClawConfig): TimestampInjectionOptions {
return { return {
timezone: resolveUserTimezone(cfg.agents?.defaults?.userTimezone), timezone: resolveUserTimezone(cfg.agents?.defaults?.userTimezone),
}; };