|
1 | 1 | import { resolveAgentConfig } from "../agents/agent-scope.js"; |
2 | 2 | import type { OpenClawConfig } from "../config/config.js"; |
3 | 3 | import { resolveHeartbeatIntervalMs } from "../infra/heartbeat-summary.js"; |
4 | | -import { asFiniteNumber } from "../shared/number-coercion.js"; |
| 4 | +import { asFiniteNumber, timestampMsToIsoString } from "../shared/number-coercion.js"; |
5 | 5 | import { normalizeOptionalString as asString } from "../shared/string-coerce.js"; |
6 | 6 | import { isRecord } from "../utils.js"; |
7 | 7 | import { resolveCommitmentsConfig } from "./config.js"; |
@@ -179,13 +179,30 @@ export async function hydrateCommitmentExtractionItem(params: {
|
179 | 179 | } |
180 | 180 | |
181 | 181 | function formatExistingPending(item: CommitmentExtractionItem) { |
182 | | -return item.existingPending.map((commitment) => ({ |
183 | | -kind: commitment.kind, |
184 | | -reason: commitment.reason, |
185 | | -dedupeKey: commitment.dedupeKey, |
186 | | -earliest: new Date(commitment.earliestMs).toISOString(), |
187 | | -latest: new Date(commitment.latestMs).toISOString(), |
188 | | -})); |
| 182 | +return item.existingPending.flatMap((commitment) => { |
| 183 | +const earliest = timestampMsToIsoString(commitment.earliestMs); |
| 184 | +const latest = timestampMsToIsoString(commitment.latestMs); |
| 185 | +if (!earliest || !latest) { |
| 186 | +return []; |
| 187 | +} |
| 188 | +return [ |
| 189 | +{ |
| 190 | +kind: commitment.kind, |
| 191 | +reason: commitment.reason, |
| 192 | +dedupeKey: commitment.dedupeKey, |
| 193 | + earliest, |
| 194 | + latest, |
| 195 | +}, |
| 196 | +]; |
| 197 | +}); |
| 198 | +} |
| 199 | + |
| 200 | +function formatExtractionNow(valueMs: unknown): string { |
| 201 | +return ( |
| 202 | +timestampMsToIsoString(valueMs) ?? |
| 203 | +timestampMsToIsoString(Date.now()) ?? |
| 204 | +"1970-01-01T00:00:00.000Z" |
| 205 | +); |
189 | 206 | } |
190 | 207 | |
191 | 208 | export function buildCommitmentExtractionPrompt(params: { |
@@ -194,7 +211,7 @@ export function buildCommitmentExtractionPrompt(params: {
|
194 | 211 | }): string { |
195 | 212 | const items = params.items.map((item) => ({ |
196 | 213 | itemId: item.itemId, |
197 | | -now: new Date(item.nowMs).toISOString(), |
| 214 | +now: formatExtractionNow(item.nowMs), |
198 | 215 | timezone: item.timezone, |
199 | 216 | latestUserMessage: item.userText, |
200 | 217 | assistantResponse: item.assistantText ?? "", |
|