memoryAge.ts 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. /**
  2. * Days elapsed since mtime. Floor-rounded — 0 for today, 1 for
  3. * yesterday, 2+ for older. Negative inputs (future mtime, clock skew)
  4. * clamp to 0.
  5. */
  6. export function memoryAgeDays(mtimeMs: number): number {
  7. return Math.max(0, Math.floor((Date.now() - mtimeMs) / 86_400_000))
  8. }
  9. /**
  10. * Human-readable age string. Models are poor at date arithmetic —
  11. * a raw ISO timestamp doesn't trigger staleness reasoning the way
  12. * "47 days ago" does.
  13. */
  14. export function memoryAge(mtimeMs: number): string {
  15. const d = memoryAgeDays(mtimeMs)
  16. if (d === 0) return 'today'
  17. if (d === 1) return 'yesterday'
  18. return `${d} days ago`
  19. }
  20. /**
  21. * Plain-text staleness caveat for memories >1 day old. Returns ''
  22. * for fresh (today/yesterday) memories — warning there is noise.
  23. *
  24. * Use this when the consumer already provides its own wrapping
  25. * (e.g. messages.ts relevant_memories → wrapMessagesInSystemReminder).
  26. *
  27. * Motivated by user reports of stale code-state memories (file:line
  28. * citations to code that has since changed) being asserted as fact —
  29. * the citation makes the stale claim sound more authoritative, not less.
  30. */
  31. export function memoryFreshnessText(mtimeMs: number): string {
  32. const d = memoryAgeDays(mtimeMs)
  33. if (d <= 1) return ''
  34. return (
  35. `This memory is ${d} days old. ` +
  36. `Memories are point-in-time observations, not live state — ` +
  37. `claims about code behavior or file:line citations may be outdated. ` +
  38. `Verify against current code before asserting as fact.`
  39. )
  40. }
  41. /**
  42. * Per-memory staleness note wrapped in <system-reminder> tags.
  43. * Returns '' for memories ≤ 1 day old. Use this for callers that
  44. * don't add their own system-reminder wrapper (e.g. FileReadTool output).
  45. */
  46. export function memoryFreshnessNote(mtimeMs: number): string {
  47. const text = memoryFreshnessText(mtimeMs)
  48. if (!text) return ''
  49. return `<system-reminder>${text}</system-reminder>\n`
  50. }