diff --git a/src/agents/current-time.test.ts b/src/agents/current-time.test.ts new file mode 100644 index 00000000000..3abaafed3da --- /dev/null +++ b/src/agents/current-time.test.ts @@ -0,0 +1,20 @@ +import { afterEach, describe, expect, it, vi } from "vitest"; +import { resolveCronStyleNow } from "./current-time.js"; + +describe("resolveCronStyleNow", () => { + afterEach(() => { + vi.restoreAllMocks(); + }); + + it("falls back when nowMs is outside Date range", () => { + vi.spyOn(Date, "now").mockReturnValue(Date.parse("2026-05-30T12:00:00.000Z")); + + const result = resolveCronStyleNow( + { agents: { defaults: { userTimezone: "UTC", timeFormat: "24" } } }, + 8_640_000_000_000_001, + ); + + expect(result.formattedTime).toBe("Saturday, May 30th, 2026 - 12:00"); + expect(result.timeLine).toContain("Reference UTC: 2026-05-30 12:00 UTC"); + }); +}); diff --git a/src/agents/current-time.ts b/src/agents/current-time.ts index f0de821e226..4d55a0a6527 100644 --- a/src/agents/current-time.ts +++ b/src/agents/current-time.ts @@ -1,3 +1,4 @@ +import { asDateTimestampMs } from "../shared/number-coercion.js"; import { type TimeFormatPreference, formatUserTime, @@ -23,9 +24,10 @@ type TimeConfigLike = { export function resolveCronStyleNow(cfg: TimeConfigLike, nowMs: number): CronStyleNow { const userTimezone = resolveUserTimezone(cfg.agents?.defaults?.userTimezone); const userTimeFormat = resolveUserTimeFormat(cfg.agents?.defaults?.timeFormat); - const formattedTime = - formatUserTime(new Date(nowMs), userTimezone, userTimeFormat) ?? new Date(nowMs).toISOString(); - const utcTime = new Date(nowMs).toISOString().replace("T", " ").slice(0, 16) + " UTC"; + const timestampMs = asDateTimestampMs(nowMs) ?? Date.now(); + const date = new Date(timestampMs); + const formattedTime = formatUserTime(date, userTimezone, userTimeFormat) ?? date.toISOString(); + const utcTime = date.toISOString().replace("T", " ").slice(0, 16) + " UTC"; const timeLine = `Current time: ${formattedTime} (${userTimezone})\nReference UTC: ${utcTime}`; return { userTimezone, formattedTime, timeLine }; }