feat(agents): include full date with day of week in system prompt

Fixes #2108

The system prompt now displays the full current date and time when
userTime is available, including day of week (e.g., 'Monday, January 26th, 2026 — 15:30').
This eliminates day-of-week guessing errors where the agent would
confidently state the wrong day based on timestamp inference.

Changes:
- Modified buildTimeSection to accept and display userTime parameter
- Updated tests to verify userTime appears in system prompt
- Format: 'Current: <full date>' followed by 'Time zone: <timezone>'
This commit is contained in:
Episkey 2026-01-26 17:17:13 +08:00
parent a109b7f1a9
commit fb3d2bc86b
3 changed files with 13 additions and 2 deletions

View File

@ -12,6 +12,7 @@ Status: beta.
- macOS: finish Moltbot app rename for macOS sources, bundle identifiers, and shared kit paths. (#2844) Thanks @fal3. - macOS: finish Moltbot app rename for macOS sources, bundle identifiers, and shared kit paths. (#2844) Thanks @fal3.
- Branding: update launchd labels, mobile bundle IDs, and logging subsystems to bot.molt (legacy com.clawdbot migrations). Thanks @thewilloftheshadow. - Branding: update launchd labels, mobile bundle IDs, and logging subsystems to bot.molt (legacy com.clawdbot migrations). Thanks @thewilloftheshadow.
- Tools: add per-sender group tool policies and fix precedence. (#1757) Thanks @adam91holt. - Tools: add per-sender group tool policies and fix precedence. (#1757) Thanks @adam91holt.
- Agents: include full date with day of week in system prompt. (#2108)
- Agents: summarize dropped messages during compaction safeguard pruning. (#2509) Thanks @jogi47. - Agents: summarize dropped messages during compaction safeguard pruning. (#2509) Thanks @jogi47.
- Skills: add multi-image input support to Nano Banana Pro skill. (#1958) Thanks @tyler6204. - Skills: add multi-image input support to Nano Banana Pro skill. (#1958) Thanks @tyler6204.
- Agents: honor tools.exec.safeBins in exec allowlist checks. (#2281) - Agents: honor tools.exec.safeBins in exec allowlist checks. (#2281)

View File

@ -145,6 +145,7 @@ describe("buildAgentSystemPrompt", () => {
}); });
expect(prompt).toContain("## Current Date & Time"); expect(prompt).toContain("## Current Date & Time");
expect(prompt).toContain("Current: Monday, January 5th, 2026 — 3:26 PM");
expect(prompt).toContain("Time zone: America/Chicago"); expect(prompt).toContain("Time zone: America/Chicago");
}); });
@ -157,6 +158,7 @@ describe("buildAgentSystemPrompt", () => {
}); });
expect(prompt).toContain("## Current Date & Time"); expect(prompt).toContain("## Current Date & Time");
expect(prompt).toContain("Current: Monday, January 5th, 2026 — 15:26");
expect(prompt).toContain("Time zone: America/Chicago"); expect(prompt).toContain("Time zone: America/Chicago");
}); });

View File

@ -49,9 +49,15 @@ function buildUserIdentitySection(ownerLine: string | undefined, isMinimal: bool
return ["## User Identity", ownerLine, ""]; return ["## User Identity", ownerLine, ""];
} }
function buildTimeSection(params: { userTimezone?: string }) { function buildTimeSection(params: { userTimezone?: string; userTime?: string }) {
if (!params.userTimezone) return []; if (!params.userTimezone) return [];
return ["## Current Date & Time", `Time zone: ${params.userTimezone}`, ""]; const lines = ["## Current Date & Time"];
if (params.userTime) {
lines.push(`Current: ${params.userTime}`);
}
lines.push(`Time zone: ${params.userTimezone}`);
lines.push("");
return lines;
} }
function buildReplyTagsSection(isMinimal: boolean) { function buildReplyTagsSection(isMinimal: boolean) {
@ -294,6 +300,7 @@ export function buildAgentSystemPrompt(params: {
: undefined; : undefined;
const reasoningLevel = params.reasoningLevel ?? "off"; const reasoningLevel = params.reasoningLevel ?? "off";
const userTimezone = params.userTimezone?.trim(); const userTimezone = params.userTimezone?.trim();
const userTime = params.userTime?.trim();
const skillsPrompt = params.skillsPrompt?.trim(); const skillsPrompt = params.skillsPrompt?.trim();
const heartbeatPrompt = params.heartbeatPrompt?.trim(); const heartbeatPrompt = params.heartbeatPrompt?.trim();
const heartbeatPromptLine = heartbeatPrompt const heartbeatPromptLine = heartbeatPrompt
@ -445,6 +452,7 @@ export function buildAgentSystemPrompt(params: {
...buildUserIdentitySection(ownerLine, isMinimal), ...buildUserIdentitySection(ownerLine, isMinimal),
...buildTimeSection({ ...buildTimeSection({
userTimezone, userTimezone,
userTime,
}), }),
"## Workspace Files (injected)", "## Workspace Files (injected)",
"These user-editable files are loaded by Moltbot and included below in Project Context.", "These user-editable files are loaded by Moltbot and included below in Project Context.",