diff --git a/src/agents/openclaw-tools.session-status.test.ts b/src/agents/openclaw-tools.session-status.test.ts index dd361b70e67..c6e12bb78b6 100644 --- a/src/agents/openclaw-tools.session-status.test.ts +++ b/src/agents/openclaw-tools.session-status.test.ts @@ -115,6 +115,33 @@ describe("session_status tool", () => { expect(details.statusText).not.toContain("OAuth/token status"); }); + it("includes ISO-8601 and Unix timestamps for scheduling", async () => { + loadSessionStoreMock.mockReset(); + updateSessionStoreMock.mockReset(); + loadSessionStoreMock.mockReturnValue({ + main: { + sessionId: "s1", + updatedAt: 10, + }, + }); + + const tool = createOpenClawTools({ agentSessionKey: "main" }).find( + (candidate) => candidate.name === "session_status", + ); + expect(tool).toBeDefined(); + if (!tool) { + throw new Error("missing session_status tool"); + } + + const result = await tool.execute("call-time", {}); + const details = result.details as { ok?: boolean; statusText?: string }; + expect(details.ok).toBe(true); + // ISO-8601 format: YYYY-MM-DDTHH:MM:SS.sssZ + expect(details.statusText).toMatch(/ISO-8601: \d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z/); + // Unix timestamp: 10-digit number + expect(details.statusText).toMatch(/Unix: \d{10}/); + }); + it("errors for unknown session keys", async () => { resetSessionStore({ main: { sessionId: "s1", updatedAt: 10 }, diff --git a/src/agents/system-prompt.test.ts b/src/agents/system-prompt.test.ts index 01cdfb2cc3a..11a9fd5d01b 100644 --- a/src/agents/system-prompt.test.ts +++ b/src/agents/system-prompt.test.ts @@ -363,7 +363,7 @@ describe("buildAgentSystemPrompt", () => { } }); - it("hints to use session_status for current date/time", () => { + it("hints to use session_status for current date/time with scheduling formats", () => { const prompt = buildAgentSystemPrompt({ workspaceDir: "/tmp/clawd", userTimezone: "America/Chicago", @@ -371,6 +371,9 @@ describe("buildAgentSystemPrompt", () => { expect(prompt).toContain("session_status"); expect(prompt).toContain("current date"); + expect(prompt).toContain("ISO-8601"); + expect(prompt).toContain("Unix"); + expect(prompt).toContain("scheduling"); }); // The system prompt intentionally does NOT include the current date/time. diff --git a/src/agents/system-prompt.ts b/src/agents/system-prompt.ts index 3b3453be6f7..42891ea2be0 100644 --- a/src/agents/system-prompt.ts +++ b/src/agents/system-prompt.ts @@ -497,7 +497,7 @@ export function buildAgentSystemPrompt(params: { : "", params.modelAliasLines && params.modelAliasLines.length > 0 && !isMinimal ? "" : "", userTimezone - ? "If you need the current date, time, or day of week, run session_status (📊 session_status)." + ? "If you need current date, time, or day of week (includes ISO-8601 and Unix for scheduling), run session_status (📊 session_status)." : "", "## Workspace", `Your working directory is: ${displayWorkspaceDir}`, diff --git a/src/agents/tools/session-status-tool.ts b/src/agents/tools/session-status-tool.ts index 2277b6e8ad2..8aad6369407 100644 --- a/src/agents/tools/session-status-tool.ts +++ b/src/agents/tools/session-status-tool.ts @@ -343,10 +343,13 @@ export function createSessionStatusTool(opts?: { const userTimezone = resolveUserTimezone(cfg.agents?.defaults?.userTimezone); const userTimeFormat = resolveUserTimeFormat(cfg.agents?.defaults?.timeFormat); - const userTime = formatUserTime(new Date(), userTimezone, userTimeFormat); + const now = new Date(); + const userTime = formatUserTime(now, userTimezone, userTimeFormat); + const iso = now.toISOString(); + const unix = Math.floor(now.getTime() / 1000); const timeLine = userTime - ? `🕒 Time: ${userTime} (${userTimezone})` - : `🕒 Time zone: ${userTimezone}`; + ? `🕒 Time: ${userTime} (${userTimezone})\n ISO-8601: ${iso} | Unix: ${unix}` + : `🕒 Time zone: ${userTimezone}\n ISO-8601: ${iso} | Unix: ${unix}`; const agentDefaults = cfg.agents?.defaults ?? {}; const defaultLabel = `${configured.provider}/${configured.model}`;