mem-os-python 1.6.27__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- mem_os_python-1.6.27.dist-info/METADATA +1032 -0
- mem_os_python-1.6.27.dist-info/RECORD +253 -0
- mem_os_python-1.6.27.dist-info/WHEEL +4 -0
- mem_os_python-1.6.27.dist-info/entry_points.txt +2 -0
- mem_os_python-1.6.27.dist-info/licenses/LICENSE +21 -0
- memos/__init__.py +16 -0
- memos/_js/adapters/anthropic.d.ts +279 -0
- memos/_js/adapters/anthropic.d.ts.map +1 -0
- memos/_js/adapters/anthropic.js +348 -0
- memos/_js/adapters/anthropic.js.map +1 -0
- memos/_js/adapters/base.d.ts +10 -0
- memos/_js/adapters/base.d.ts.map +1 -0
- memos/_js/adapters/base.js +2 -0
- memos/_js/adapters/base.js.map +1 -0
- memos/_js/adapters/openai.d.ts +264 -0
- memos/_js/adapters/openai.d.ts.map +1 -0
- memos/_js/adapters/openai.js +342 -0
- memos/_js/adapters/openai.js.map +1 -0
- memos/_js/apps/explorer.d.ts +244 -0
- memos/_js/apps/explorer.d.ts.map +1 -0
- memos/_js/apps/explorer.js +738 -0
- memos/_js/apps/explorer.js.map +1 -0
- memos/_js/citations.d.ts +65 -0
- memos/_js/citations.d.ts.map +1 -0
- memos/_js/citations.js +143 -0
- memos/_js/citations.js.map +1 -0
- memos/_js/cli-browse.d.ts +3 -0
- memos/_js/cli-browse.d.ts.map +1 -0
- memos/_js/cli-browse.js +129 -0
- memos/_js/cli-browse.js.map +1 -0
- memos/_js/cli-completion.d.ts +31 -0
- memos/_js/cli-completion.d.ts.map +1 -0
- memos/_js/cli-completion.js +340 -0
- memos/_js/cli-completion.js.map +1 -0
- memos/_js/cli-help.d.ts +18 -0
- memos/_js/cli-help.d.ts.map +1 -0
- memos/_js/cli-help.js +357 -0
- memos/_js/cli-help.js.map +1 -0
- memos/_js/cli.d.ts +28 -0
- memos/_js/cli.d.ts.map +1 -0
- memos/_js/cli.js +2880 -0
- memos/_js/cli.js.map +1 -0
- memos/_js/compression.d.ts +25 -0
- memos/_js/compression.d.ts.map +1 -0
- memos/_js/compression.js +319 -0
- memos/_js/compression.js.map +1 -0
- memos/_js/confidence-machine.d.ts +99 -0
- memos/_js/confidence-machine.d.ts.map +1 -0
- memos/_js/confidence-machine.js +222 -0
- memos/_js/confidence-machine.js.map +1 -0
- memos/_js/context-pack.d.ts +506 -0
- memos/_js/context-pack.d.ts.map +1 -0
- memos/_js/context-pack.js +1435 -0
- memos/_js/context-pack.js.map +1 -0
- memos/_js/contradictions.d.ts +160 -0
- memos/_js/contradictions.d.ts.map +1 -0
- memos/_js/contradictions.js +255 -0
- memos/_js/contradictions.js.map +1 -0
- memos/_js/dashboard.d.ts +30 -0
- memos/_js/dashboard.d.ts.map +1 -0
- memos/_js/dashboard.js +302 -0
- memos/_js/dashboard.js.map +1 -0
- memos/_js/ebbinghaus.d.ts +29 -0
- memos/_js/ebbinghaus.d.ts.map +1 -0
- memos/_js/ebbinghaus.js +32 -0
- memos/_js/ebbinghaus.js.map +1 -0
- memos/_js/embedding-queue.d.ts +190 -0
- memos/_js/embedding-queue.d.ts.map +1 -0
- memos/_js/embedding-queue.js +316 -0
- memos/_js/embedding-queue.js.map +1 -0
- memos/_js/embeddings.d.ts +187 -0
- memos/_js/embeddings.d.ts.map +1 -0
- memos/_js/embeddings.js +633 -0
- memos/_js/embeddings.js.map +1 -0
- memos/_js/entity-extraction.d.ts +54 -0
- memos/_js/entity-extraction.d.ts.map +1 -0
- memos/_js/entity-extraction.js +325 -0
- memos/_js/entity-extraction.js.map +1 -0
- memos/_js/entity-index.d.ts +93 -0
- memos/_js/entity-index.d.ts.map +1 -0
- memos/_js/entity-index.js +165 -0
- memos/_js/entity-index.js.map +1 -0
- memos/_js/event-memory.d.ts +147 -0
- memos/_js/event-memory.d.ts.map +1 -0
- memos/_js/event-memory.js +290 -0
- memos/_js/event-memory.js.map +1 -0
- memos/_js/external-import.d.ts +98 -0
- memos/_js/external-import.d.ts.map +1 -0
- memos/_js/external-import.js +669 -0
- memos/_js/external-import.js.map +1 -0
- memos/_js/fidelity.d.ts +367 -0
- memos/_js/fidelity.d.ts.map +1 -0
- memos/_js/fidelity.js +911 -0
- memos/_js/fidelity.js.map +1 -0
- memos/_js/graph-expansion.d.ts +119 -0
- memos/_js/graph-expansion.d.ts.map +1 -0
- memos/_js/graph-expansion.js +213 -0
- memos/_js/graph-expansion.js.map +1 -0
- memos/_js/graph-mermaid.d.ts +13 -0
- memos/_js/graph-mermaid.d.ts.map +1 -0
- memos/_js/graph-mermaid.js +32 -0
- memos/_js/graph-mermaid.js.map +1 -0
- memos/_js/graph.d.ts +170 -0
- memos/_js/graph.d.ts.map +1 -0
- memos/_js/graph.js +482 -0
- memos/_js/graph.js.map +1 -0
- memos/_js/harness.d.ts +63 -0
- memos/_js/harness.d.ts.map +1 -0
- memos/_js/harness.js +93 -0
- memos/_js/harness.js.map +1 -0
- memos/_js/importance.d.ts +118 -0
- memos/_js/importance.d.ts.map +1 -0
- memos/_js/importance.js +144 -0
- memos/_js/importance.js.map +1 -0
- memos/_js/index.d.ts +51 -0
- memos/_js/index.d.ts.map +1 -0
- memos/_js/index.js +53 -0
- memos/_js/index.js.map +1 -0
- memos/_js/mcp.d.ts +58 -0
- memos/_js/mcp.d.ts.map +1 -0
- memos/_js/mcp.js +1853 -0
- memos/_js/mcp.js.map +1 -0
- memos/_js/memory.d.ts +1762 -0
- memos/_js/memory.d.ts.map +1 -0
- memos/_js/memory.js +6283 -0
- memos/_js/memory.js.map +1 -0
- memos/_js/procedural.d.ts +74 -0
- memos/_js/procedural.d.ts.map +1 -0
- memos/_js/procedural.js +125 -0
- memos/_js/procedural.js.map +1 -0
- memos/_js/project-config.d.ts +68 -0
- memos/_js/project-config.d.ts.map +1 -0
- memos/_js/project-config.js +59 -0
- memos/_js/project-config.js.map +1 -0
- memos/_js/proof-of-forgetting.d.ts +57 -0
- memos/_js/proof-of-forgetting.d.ts.map +1 -0
- memos/_js/proof-of-forgetting.js +80 -0
- memos/_js/proof-of-forgetting.js.map +1 -0
- memos/_js/provenance.d.ts +122 -0
- memos/_js/provenance.d.ts.map +1 -0
- memos/_js/provenance.js +182 -0
- memos/_js/provenance.js.map +1 -0
- memos/_js/quarantine-commands.d.ts +23 -0
- memos/_js/quarantine-commands.d.ts.map +1 -0
- memos/_js/quarantine-commands.js +42 -0
- memos/_js/quarantine-commands.js.map +1 -0
- memos/_js/quarantine.d.ts +120 -0
- memos/_js/quarantine.d.ts.map +1 -0
- memos/_js/quarantine.js +873 -0
- memos/_js/quarantine.js.map +1 -0
- memos/_js/redact.d.ts +12 -0
- memos/_js/redact.d.ts.map +1 -0
- memos/_js/redact.js +26 -0
- memos/_js/redact.js.map +1 -0
- memos/_js/repl.d.ts +57 -0
- memos/_js/repl.d.ts.map +1 -0
- memos/_js/repl.js +295 -0
- memos/_js/repl.js.map +1 -0
- memos/_js/rerank-local.d.ts +61 -0
- memos/_js/rerank-local.d.ts.map +1 -0
- memos/_js/rerank-local.js +210 -0
- memos/_js/rerank-local.js.map +1 -0
- memos/_js/retain-filter.d.ts +98 -0
- memos/_js/retain-filter.d.ts.map +1 -0
- memos/_js/retain-filter.js +232 -0
- memos/_js/retain-filter.js.map +1 -0
- memos/_js/retrieval.d.ts +265 -0
- memos/_js/retrieval.d.ts.map +1 -0
- memos/_js/retrieval.js +1018 -0
- memos/_js/retrieval.js.map +1 -0
- memos/_js/revert.d.ts +77 -0
- memos/_js/revert.d.ts.map +1 -0
- memos/_js/revert.js +252 -0
- memos/_js/revert.js.map +1 -0
- memos/_js/scope.d.ts +30 -0
- memos/_js/scope.d.ts.map +1 -0
- memos/_js/scope.js +71 -0
- memos/_js/scope.js.map +1 -0
- memos/_js/semantic-screen.d.ts +152 -0
- memos/_js/semantic-screen.d.ts.map +1 -0
- memos/_js/semantic-screen.js +290 -0
- memos/_js/semantic-screen.js.map +1 -0
- memos/_js/session-hooks.d.ts +127 -0
- memos/_js/session-hooks.d.ts.map +1 -0
- memos/_js/session-hooks.js +482 -0
- memos/_js/session-hooks.js.map +1 -0
- memos/_js/storage/sqlite.d.ts +427 -0
- memos/_js/storage/sqlite.d.ts.map +1 -0
- memos/_js/storage/sqlite.js +2428 -0
- memos/_js/storage/sqlite.js.map +1 -0
- memos/_js/sync.d.ts +213 -0
- memos/_js/sync.d.ts.map +1 -0
- memos/_js/sync.js +389 -0
- memos/_js/sync.js.map +1 -0
- memos/_js/tamper-log.d.ts +98 -0
- memos/_js/tamper-log.d.ts.map +1 -0
- memos/_js/tamper-log.js +327 -0
- memos/_js/tamper-log.js.map +1 -0
- memos/_js/temporal.d.ts +92 -0
- memos/_js/temporal.d.ts.map +1 -0
- memos/_js/temporal.js +536 -0
- memos/_js/temporal.js.map +1 -0
- memos/_js/time-travel.d.ts +38 -0
- memos/_js/time-travel.d.ts.map +1 -0
- memos/_js/time-travel.js +46 -0
- memos/_js/time-travel.js.map +1 -0
- memos/_js/timestamp-format.d.ts +18 -0
- memos/_js/timestamp-format.d.ts.map +1 -0
- memos/_js/timestamp-format.js +52 -0
- memos/_js/timestamp-format.js.map +1 -0
- memos/_js/triple-extraction.d.ts +31 -0
- memos/_js/triple-extraction.d.ts.map +1 -0
- memos/_js/triple-extraction.js +116 -0
- memos/_js/triple-extraction.js.map +1 -0
- memos/_js/types.d.ts +2474 -0
- memos/_js/types.d.ts.map +1 -0
- memos/_js/types.js +20 -0
- memos/_js/types.js.map +1 -0
- memos/_js/updater.d.ts +95 -0
- memos/_js/updater.d.ts.map +1 -0
- memos/_js/updater.js +268 -0
- memos/_js/updater.js.map +1 -0
- memos/_js/version.d.ts +17 -0
- memos/_js/version.d.ts.map +1 -0
- memos/_js/version.js +34 -0
- memos/_js/version.js.map +1 -0
- memos/_js/vision/clip-query-cache.d.ts +58 -0
- memos/_js/vision/clip-query-cache.d.ts.map +1 -0
- memos/_js/vision/clip-query-cache.js +79 -0
- memos/_js/vision/clip-query-cache.js.map +1 -0
- memos/_js/vision/clip.d.ts +113 -0
- memos/_js/vision/clip.d.ts.map +1 -0
- memos/_js/vision/clip.js +224 -0
- memos/_js/vision/clip.js.map +1 -0
- memos/_js/vision/fake-clip.d.ts +55 -0
- memos/_js/vision/fake-clip.d.ts.map +1 -0
- memos/_js/vision/fake-clip.js +122 -0
- memos/_js/vision/fake-clip.js.map +1 -0
- memos/_js/vision/index.d.ts +15 -0
- memos/_js/vision/index.d.ts.map +1 -0
- memos/_js/vision/index.js +13 -0
- memos/_js/vision/index.js.map +1 -0
- memos/_js/vision/store.d.ts +137 -0
- memos/_js/vision/store.d.ts.map +1 -0
- memos/_js/vision/store.js +383 -0
- memos/_js/vision/store.js.map +1 -0
- memos/adapters/__init__.py +0 -0
- memos/adapters/crewai.py +385 -0
- memos/adapters/langchain.py +301 -0
- memos/adapters/ollama.py +396 -0
- memos/server/__init__.py +0 -0
- memos/server/main.py +547 -0
- memos/server/routes.py +360 -0
memos/_js/temporal.js
ADDED
|
@@ -0,0 +1,536 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deterministic temporal parsing for MemOS — no LLM on any path.
|
|
3
|
+
*
|
|
4
|
+
* Why hand-rolled instead of `chrono`:
|
|
5
|
+
* - `npm install chrono` resolves to a *timezone-offset* library, not a
|
|
6
|
+
* date parser (the parser lives in `chrono-node`).
|
|
7
|
+
* - `chrono-node` (v2.10.1, evaluated 2026-09-19) is zero-dependency and
|
|
8
|
+
* dual CJS/ESM with types, but ships ~7MB of locale data and its
|
|
9
|
+
* weekday/time-of-day defaults ("at 3pm" at 18:00 silently rolls to
|
|
10
|
+
* tomorrow, multi-expression sentences need ad-hoc disambiguation)
|
|
11
|
+
* would still need a deterministic wrapper for MemOS's exact phrase
|
|
12
|
+
* set. A minimal hand-rolled parser is smaller, has zero dependencies,
|
|
13
|
+
* and every rule below is explicit and testable. Revisit if the phrase
|
|
14
|
+
* set grows beyond the documented grammar.
|
|
15
|
+
*
|
|
16
|
+
* Grammar (all case-insensitive, evaluated against an explicit `now`):
|
|
17
|
+
* - Relative: "in 2 hours", "in 3 days", "3 days later"
|
|
18
|
+
* - Day words: "today", "tonight" (= today 21:00), "tomorrow"
|
|
19
|
+
* - Weekdays: "Monday", "on Monday", "this Thursday", "next Friday",
|
|
20
|
+
* "last Friday"
|
|
21
|
+
* - Month/day: "Sept 24", "September 24th" (year-less → yearCertain=false)
|
|
22
|
+
* - ISO: "2026-09-24"
|
|
23
|
+
* - Times: "at 3pm", "at 2:30pm", "at 15:00", "noon", "midnight"
|
|
24
|
+
* (a bare time attaches to today, rolling to tomorrow when past)
|
|
25
|
+
* - Date+time adjacency merges: "tomorrow at 2pm", "at 3pm tomorrow"
|
|
26
|
+
*
|
|
27
|
+
* Deterministic rules (documented, no guessing):
|
|
28
|
+
* 1. When several temporal expressions occur, the LAST one wins — this
|
|
29
|
+
* mirrors how speakers refine ("tomorrow, on Monday" → Monday).
|
|
30
|
+
* 2. Adjacent date+date ("tomorrow on Monday") refines to the second date.
|
|
31
|
+
* 3. Adjacent date+time merges into one datetime.
|
|
32
|
+
* 4. Bare/"on" weekday = next occurrence strictly after today;
|
|
33
|
+
* "this <day>" = upcoming occurrence including today; "next <day>" =
|
|
34
|
+
* next occurrence strictly after today; "last <day>" = most recent
|
|
35
|
+
* past occurrence.
|
|
36
|
+
* 5. Day-grain results resolve to local start-of-day 00:00 (an all-day
|
|
37
|
+
* event starts when the day starts), except "tonight" → 21:00.
|
|
38
|
+
*
|
|
39
|
+
* @module @memos/temporal
|
|
40
|
+
*/
|
|
41
|
+
const MS_PER = {
|
|
42
|
+
second: 1000,
|
|
43
|
+
minute: 60_000,
|
|
44
|
+
hour: 3_600_000,
|
|
45
|
+
day: 86_400_000,
|
|
46
|
+
week: 604_800_000,
|
|
47
|
+
};
|
|
48
|
+
const UNIT_ALIASES = {
|
|
49
|
+
second: "second",
|
|
50
|
+
seconds: "second",
|
|
51
|
+
sec: "second",
|
|
52
|
+
secs: "second",
|
|
53
|
+
s: "second",
|
|
54
|
+
minute: "minute",
|
|
55
|
+
minutes: "minute",
|
|
56
|
+
min: "minute",
|
|
57
|
+
mins: "minute",
|
|
58
|
+
m: "minute",
|
|
59
|
+
hour: "hour",
|
|
60
|
+
hours: "hour",
|
|
61
|
+
hr: "hour",
|
|
62
|
+
hrs: "hour",
|
|
63
|
+
h: "hour",
|
|
64
|
+
day: "day",
|
|
65
|
+
days: "day",
|
|
66
|
+
d: "day",
|
|
67
|
+
week: "week",
|
|
68
|
+
weeks: "week",
|
|
69
|
+
w: "week",
|
|
70
|
+
month: "month",
|
|
71
|
+
months: "month",
|
|
72
|
+
year: "year",
|
|
73
|
+
years: "year",
|
|
74
|
+
y: "year",
|
|
75
|
+
};
|
|
76
|
+
const WEEKDAY_ALIASES = {
|
|
77
|
+
sun: 0,
|
|
78
|
+
sunday: 0,
|
|
79
|
+
mon: 1,
|
|
80
|
+
monday: 1,
|
|
81
|
+
tue: 2,
|
|
82
|
+
tues: 2,
|
|
83
|
+
tuesday: 2,
|
|
84
|
+
wed: 3,
|
|
85
|
+
wednes: 3,
|
|
86
|
+
wednesday: 3,
|
|
87
|
+
thu: 4,
|
|
88
|
+
thur: 4,
|
|
89
|
+
thurs: 4,
|
|
90
|
+
thursday: 4,
|
|
91
|
+
fri: 5,
|
|
92
|
+
friday: 5,
|
|
93
|
+
sat: 6,
|
|
94
|
+
satur: 6,
|
|
95
|
+
saturday: 6,
|
|
96
|
+
};
|
|
97
|
+
const MONTHS = {
|
|
98
|
+
jan: 0,
|
|
99
|
+
january: 0,
|
|
100
|
+
feb: 1,
|
|
101
|
+
february: 1,
|
|
102
|
+
mar: 2,
|
|
103
|
+
march: 2,
|
|
104
|
+
apr: 3,
|
|
105
|
+
april: 3,
|
|
106
|
+
may: 4,
|
|
107
|
+
jun: 5,
|
|
108
|
+
june: 5,
|
|
109
|
+
jul: 6,
|
|
110
|
+
july: 6,
|
|
111
|
+
aug: 7,
|
|
112
|
+
august: 7,
|
|
113
|
+
sep: 8,
|
|
114
|
+
sept: 8,
|
|
115
|
+
september: 8,
|
|
116
|
+
oct: 9,
|
|
117
|
+
october: 9,
|
|
118
|
+
nov: 10,
|
|
119
|
+
november: 10,
|
|
120
|
+
dec: 11,
|
|
121
|
+
december: 11,
|
|
122
|
+
};
|
|
123
|
+
const WEEKDAY_SRC = Object.keys(WEEKDAY_ALIASES)
|
|
124
|
+
.sort((a, b) => b.length - a.length)
|
|
125
|
+
.join("|");
|
|
126
|
+
const MONTH_SRC = Object.keys(MONTHS)
|
|
127
|
+
.sort((a, b) => b.length - a.length)
|
|
128
|
+
.join("|");
|
|
129
|
+
/**
|
|
130
|
+
* Master pattern. Alternation order is longest-first within each class so
|
|
131
|
+
* "September" wins over "sep", and classes are ordered so relative forms
|
|
132
|
+
* match before their weekday/day-word parts can fragment them.
|
|
133
|
+
*/
|
|
134
|
+
const MASTER = new RegExp([
|
|
135
|
+
// "in 2 hours" / "3 days later" (relative — also usable as duration)
|
|
136
|
+
String.raw `(?<relative>in\s+(?<rval>\d+)\s+(?<runit>seconds?|secs?|minutes?|mins?|hours?|hrs?|days?|weeks?|months?|years?)\b)`,
|
|
137
|
+
String.raw `(?<later>(?<lval>\d+)\s+(?<lunit>seconds?|secs?|minutes?|mins?|hours?|hrs?|days?|weeks?|months?|years?)\s+later\b)`,
|
|
138
|
+
// Day words
|
|
139
|
+
String.raw `(?<dayword>\b(?<dword>today|tonight|tomorrow)\b)`,
|
|
140
|
+
// Weekdays with optional on/this/next/last
|
|
141
|
+
String.raw `(?<weekday>\b(?:(?<wprefix>on|this|next|last)\s+)?(?<wday>${WEEKDAY_SRC})s?\b)`,
|
|
142
|
+
// Month day: "Sept 24", "September 24th"
|
|
143
|
+
String.raw `(?<monthday>\b(?<mname>${MONTH_SRC})\.?\s+(?<mday>\d{1,2})(?:st|nd|rd|th)?\b)`,
|
|
144
|
+
// ISO date
|
|
145
|
+
String.raw `(?<iso>\b(?<iyear>\d{4})-(?<imonth>\d{2})-(?<iday>\d{2})\b)`,
|
|
146
|
+
// Times: "at 3pm", "at 2:30pm", "at 15:00", "9am" (bare time with
|
|
147
|
+
// meridiem), "noon", "midnight". A bare time needs am/pm so plain
|
|
148
|
+
// numbers ("room 3") never parse as times.
|
|
149
|
+
String.raw `(?<time>(?:\bat\s+(?<thour>\d{1,2})(?::(?<tmin>\d{2}))?\s*(?<tmer>am|pm)?\b)|\b(?<thour2>\d{1,2})(?::(?<tmin2>\d{2}))?\s*(?<tmer2>am|pm)\b|\b(?<tword>noon|midnight)\b)`,
|
|
150
|
+
].join("|"), "gi");
|
|
151
|
+
function collectMatches(text) {
|
|
152
|
+
const out = [];
|
|
153
|
+
MASTER.lastIndex = 0;
|
|
154
|
+
let m;
|
|
155
|
+
while ((m = MASTER.exec(text)) !== null) {
|
|
156
|
+
const groups = m.groups ?? {};
|
|
157
|
+
const kind = [
|
|
158
|
+
"relative",
|
|
159
|
+
"later",
|
|
160
|
+
"dayword",
|
|
161
|
+
"weekday",
|
|
162
|
+
"monthday",
|
|
163
|
+
"iso",
|
|
164
|
+
"time",
|
|
165
|
+
].find((k) => groups[k] !== undefined);
|
|
166
|
+
if (!kind)
|
|
167
|
+
continue;
|
|
168
|
+
// Guard against zero-length matches (would loop forever).
|
|
169
|
+
if (m[0].length === 0) {
|
|
170
|
+
MASTER.lastIndex++;
|
|
171
|
+
continue;
|
|
172
|
+
}
|
|
173
|
+
out.push({
|
|
174
|
+
text: m[0],
|
|
175
|
+
start: m.index,
|
|
176
|
+
end: m.index + m[0].length,
|
|
177
|
+
kind,
|
|
178
|
+
groups,
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
return out;
|
|
182
|
+
}
|
|
183
|
+
/** Local start-of-day for the given date. */
|
|
184
|
+
function startOfDay(d) {
|
|
185
|
+
const c = new Date(d);
|
|
186
|
+
c.setHours(0, 0, 0, 0);
|
|
187
|
+
return c;
|
|
188
|
+
}
|
|
189
|
+
function addMonths(d, n) {
|
|
190
|
+
const c = new Date(d);
|
|
191
|
+
c.setMonth(c.getMonth() + n);
|
|
192
|
+
return c;
|
|
193
|
+
}
|
|
194
|
+
function addYears(d, n) {
|
|
195
|
+
const c = new Date(d);
|
|
196
|
+
c.setFullYear(c.getFullYear() + n);
|
|
197
|
+
return c;
|
|
198
|
+
}
|
|
199
|
+
function resolveRelative(value, unit, now) {
|
|
200
|
+
switch (unit) {
|
|
201
|
+
case "second":
|
|
202
|
+
return {
|
|
203
|
+
at: new Date(now.getTime() + value * MS_PER.second),
|
|
204
|
+
grain: "minute",
|
|
205
|
+
};
|
|
206
|
+
case "minute":
|
|
207
|
+
return {
|
|
208
|
+
at: new Date(now.getTime() + value * MS_PER.minute),
|
|
209
|
+
grain: "minute",
|
|
210
|
+
};
|
|
211
|
+
case "hour":
|
|
212
|
+
return {
|
|
213
|
+
at: new Date(now.getTime() + value * MS_PER.hour),
|
|
214
|
+
grain: "hour",
|
|
215
|
+
};
|
|
216
|
+
case "day":
|
|
217
|
+
return { at: new Date(now.getTime() + value * MS_PER.day), grain: "day" };
|
|
218
|
+
case "week":
|
|
219
|
+
return {
|
|
220
|
+
at: new Date(now.getTime() + value * MS_PER.week),
|
|
221
|
+
grain: "day",
|
|
222
|
+
};
|
|
223
|
+
case "month":
|
|
224
|
+
return { at: addMonths(now, value), grain: "day" };
|
|
225
|
+
case "year":
|
|
226
|
+
return { at: addYears(now, value), grain: "day" };
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
function resolveWeekday(dayIndex, prefix, now) {
|
|
230
|
+
const base = startOfDay(now);
|
|
231
|
+
const today = now.getDay();
|
|
232
|
+
let delta;
|
|
233
|
+
if (prefix === "last") {
|
|
234
|
+
// Most recent past occurrence (strictly before today).
|
|
235
|
+
delta = (today - dayIndex + 7) % 7;
|
|
236
|
+
if (delta === 0)
|
|
237
|
+
delta = 7;
|
|
238
|
+
return new Date(base.getTime() - delta * MS_PER.day);
|
|
239
|
+
}
|
|
240
|
+
if (prefix === "this") {
|
|
241
|
+
// Upcoming occurrence including today.
|
|
242
|
+
delta = (dayIndex - today + 7) % 7;
|
|
243
|
+
return new Date(base.getTime() + delta * MS_PER.day);
|
|
244
|
+
}
|
|
245
|
+
// Bare, "on", and "next": next occurrence strictly after today.
|
|
246
|
+
delta = (dayIndex - today + 7) % 7;
|
|
247
|
+
if (delta === 0)
|
|
248
|
+
delta = 7;
|
|
249
|
+
return new Date(base.getTime() + delta * MS_PER.day);
|
|
250
|
+
}
|
|
251
|
+
function resolveTime(hour, minute, now) {
|
|
252
|
+
const at = startOfDay(now);
|
|
253
|
+
at.setHours(hour, minute, 0, 0);
|
|
254
|
+
// A bare time that already passed today means tomorrow (deterministic).
|
|
255
|
+
if (at.getTime() <= now.getTime()) {
|
|
256
|
+
at.setTime(at.getTime() + MS_PER.day);
|
|
257
|
+
}
|
|
258
|
+
return { at, grain: minute === 0 ? "hour" : "minute" };
|
|
259
|
+
}
|
|
260
|
+
function matchToDate(m, now) {
|
|
261
|
+
const g = m.groups;
|
|
262
|
+
switch (m.kind) {
|
|
263
|
+
case "relative": {
|
|
264
|
+
const unit = UNIT_ALIASES[(g.runit ?? "").toLowerCase()];
|
|
265
|
+
if (!unit)
|
|
266
|
+
return null;
|
|
267
|
+
const r = resolveRelative(parseInt(g.rval ?? "0", 10), unit, now);
|
|
268
|
+
return { ...r, yearCertain: true, text: m.text };
|
|
269
|
+
}
|
|
270
|
+
case "later": {
|
|
271
|
+
const unit = UNIT_ALIASES[(g.lunit ?? "").toLowerCase()];
|
|
272
|
+
if (!unit)
|
|
273
|
+
return null;
|
|
274
|
+
const r = resolveRelative(parseInt(g.lval ?? "0", 10), unit, now);
|
|
275
|
+
return { ...r, yearCertain: true, text: m.text };
|
|
276
|
+
}
|
|
277
|
+
case "dayword": {
|
|
278
|
+
const word = (g.dword ?? "").toLowerCase();
|
|
279
|
+
if (word === "tonight") {
|
|
280
|
+
const at = startOfDay(now);
|
|
281
|
+
at.setHours(21, 0, 0, 0);
|
|
282
|
+
return { at, grain: "hour", yearCertain: true, text: m.text };
|
|
283
|
+
}
|
|
284
|
+
const at = startOfDay(now);
|
|
285
|
+
if (word === "tomorrow")
|
|
286
|
+
at.setTime(at.getTime() + MS_PER.day);
|
|
287
|
+
return { at, grain: "day", yearCertain: true, text: m.text };
|
|
288
|
+
}
|
|
289
|
+
case "weekday": {
|
|
290
|
+
const dayIndex = WEEKDAY_ALIASES[(g.wday ?? "").toLowerCase()];
|
|
291
|
+
if (dayIndex === undefined)
|
|
292
|
+
return null;
|
|
293
|
+
const at = resolveWeekday(dayIndex, g.wprefix?.toLowerCase(), now);
|
|
294
|
+
return { at, grain: "day", yearCertain: true, text: m.text };
|
|
295
|
+
}
|
|
296
|
+
case "monthday": {
|
|
297
|
+
const month = MONTHS[(g.mname ?? "").toLowerCase().replace(/\.$/, "")];
|
|
298
|
+
const day = parseInt(g.mday ?? "0", 10);
|
|
299
|
+
if (month === undefined || !(day >= 1 && day <= 31))
|
|
300
|
+
return null;
|
|
301
|
+
// Next occurrence on or after today (year-less → yearCertain=false).
|
|
302
|
+
let at = new Date(now.getFullYear(), month, day, 0, 0, 0, 0);
|
|
303
|
+
if (at.getTime() < startOfDay(now).getTime()) {
|
|
304
|
+
at = new Date(now.getFullYear() + 1, month, day, 0, 0, 0, 0);
|
|
305
|
+
}
|
|
306
|
+
return { at, grain: "day", yearCertain: false, text: m.text };
|
|
307
|
+
}
|
|
308
|
+
case "iso": {
|
|
309
|
+
const at = new Date(parseInt(g.iyear ?? "0", 10), parseInt(g.imonth ?? "1", 10) - 1, parseInt(g.iday ?? "1", 10), 0, 0, 0, 0);
|
|
310
|
+
return { at, grain: "day", yearCertain: true, text: m.text };
|
|
311
|
+
}
|
|
312
|
+
case "time": {
|
|
313
|
+
if (g.tword) {
|
|
314
|
+
const word = g.tword.toLowerCase();
|
|
315
|
+
if (word === "noon") {
|
|
316
|
+
const at = startOfDay(now);
|
|
317
|
+
at.setHours(12, 0, 0, 0);
|
|
318
|
+
if (at.getTime() <= now.getTime())
|
|
319
|
+
at.setTime(at.getTime() + MS_PER.day);
|
|
320
|
+
return { at, grain: "hour", yearCertain: true, text: m.text };
|
|
321
|
+
}
|
|
322
|
+
// "midnight" = the next 00:00 strictly after now.
|
|
323
|
+
const at = startOfDay(now);
|
|
324
|
+
at.setTime(at.getTime() + MS_PER.day);
|
|
325
|
+
return { at, grain: "hour", yearCertain: true, text: m.text };
|
|
326
|
+
}
|
|
327
|
+
let hour = parseInt(g.thour ?? g.thour2 ?? "0", 10);
|
|
328
|
+
const minute = parseInt(g.tmin ?? g.tmin2 ?? "0", 10);
|
|
329
|
+
const mer = (g.tmer ?? g.tmer2 ?? "").toLowerCase();
|
|
330
|
+
if (mer === "pm" && hour < 12)
|
|
331
|
+
hour += 12;
|
|
332
|
+
if (mer === "am" && hour === 12)
|
|
333
|
+
hour = 0;
|
|
334
|
+
const r = resolveTime(hour, minute, now);
|
|
335
|
+
return { ...r, yearCertain: true, text: m.text };
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
function isDateKind(kind) {
|
|
340
|
+
return (kind === "relative" ||
|
|
341
|
+
kind === "later" ||
|
|
342
|
+
kind === "dayword" ||
|
|
343
|
+
kind === "weekday" ||
|
|
344
|
+
kind === "monthday" ||
|
|
345
|
+
kind === "iso");
|
|
346
|
+
}
|
|
347
|
+
/**
|
|
348
|
+
* Parse the temporal expression(s) in free text.
|
|
349
|
+
*
|
|
350
|
+
* Deterministic given `now`: no system clock reads, no randomness, no LLM.
|
|
351
|
+
* When several expressions occur, the LAST one wins (speaker-refinement
|
|
352
|
+
* rule); adjacent date+time pairs merge ("tomorrow at 2pm"), and adjacent
|
|
353
|
+
* date+date pairs refine to the second ("tomorrow on Monday" → Monday).
|
|
354
|
+
*
|
|
355
|
+
* @param text — Free text possibly containing a temporal expression.
|
|
356
|
+
* @param now — Reference time; ALL resolution is relative to this.
|
|
357
|
+
* @returns The parsed expression, or null when none is found.
|
|
358
|
+
*/
|
|
359
|
+
export function parseTemporal(text, now) {
|
|
360
|
+
if (!text || typeof text !== "string")
|
|
361
|
+
return null;
|
|
362
|
+
const matches = collectMatches(text);
|
|
363
|
+
if (matches.length === 0)
|
|
364
|
+
return null;
|
|
365
|
+
// Fold: merge adjacent pairs, then take the last date-bearing result.
|
|
366
|
+
// "Adjacent" = separated by whitespace only.
|
|
367
|
+
const folded = [];
|
|
368
|
+
let i = 0;
|
|
369
|
+
while (i < matches.length) {
|
|
370
|
+
const m = matches[i];
|
|
371
|
+
const n = matches[i + 1];
|
|
372
|
+
const adjacent = n !== undefined && text.slice(m.end, n.start).trim() === "";
|
|
373
|
+
if (adjacent && n !== undefined) {
|
|
374
|
+
if (isDateKind(m.kind) && n.kind === "time") {
|
|
375
|
+
// "tomorrow at 2pm" — apply the time to the date.
|
|
376
|
+
const d = matchToDate(m, now);
|
|
377
|
+
if (d) {
|
|
378
|
+
const t = matchToDate(n, now);
|
|
379
|
+
if (t) {
|
|
380
|
+
const at = new Date(d.at);
|
|
381
|
+
at.setHours(t.at.getHours(), t.at.getMinutes(), 0, 0);
|
|
382
|
+
folded.push({
|
|
383
|
+
date: {
|
|
384
|
+
at,
|
|
385
|
+
grain: t.grain,
|
|
386
|
+
yearCertain: d.yearCertain,
|
|
387
|
+
text: `${m.text} ${n.text}`,
|
|
388
|
+
},
|
|
389
|
+
time: null,
|
|
390
|
+
});
|
|
391
|
+
i += 2;
|
|
392
|
+
continue;
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
else if (m.kind === "time" && isDateKind(n.kind)) {
|
|
397
|
+
// "at 3pm tomorrow".
|
|
398
|
+
const d = matchToDate(n, now);
|
|
399
|
+
if (d) {
|
|
400
|
+
const t = matchToDate(m, now);
|
|
401
|
+
if (t) {
|
|
402
|
+
const at = new Date(d.at);
|
|
403
|
+
at.setHours(t.at.getHours(), t.at.getMinutes(), 0, 0);
|
|
404
|
+
folded.push({
|
|
405
|
+
date: {
|
|
406
|
+
at,
|
|
407
|
+
grain: t.grain,
|
|
408
|
+
yearCertain: d.yearCertain,
|
|
409
|
+
text: `${m.text} ${n.text}`,
|
|
410
|
+
},
|
|
411
|
+
time: null,
|
|
412
|
+
});
|
|
413
|
+
i += 2;
|
|
414
|
+
continue;
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
else if (isDateKind(m.kind) && isDateKind(n.kind)) {
|
|
419
|
+
// Date refinement: "tomorrow on Monday" → the second date wins.
|
|
420
|
+
const d = matchToDate(n, now);
|
|
421
|
+
folded.push({ date: d, time: null });
|
|
422
|
+
i += 2;
|
|
423
|
+
continue;
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
if (isDateKind(m.kind)) {
|
|
427
|
+
folded.push({ date: matchToDate(m, now), time: null });
|
|
428
|
+
}
|
|
429
|
+
else {
|
|
430
|
+
folded.push({ date: null, time: m });
|
|
431
|
+
}
|
|
432
|
+
i += 1;
|
|
433
|
+
}
|
|
434
|
+
// Last date-bearing entry wins; a trailing lone time attaches to today.
|
|
435
|
+
for (let j = folded.length - 1; j >= 0; j--) {
|
|
436
|
+
const f = folded[j];
|
|
437
|
+
if (f.date) {
|
|
438
|
+
return {
|
|
439
|
+
at: f.date.at,
|
|
440
|
+
grain: f.date.grain,
|
|
441
|
+
text: f.date.text,
|
|
442
|
+
yearCertain: f.date.yearCertain,
|
|
443
|
+
};
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
// Only time matches (e.g. "at 3pm"): resolve against today.
|
|
447
|
+
for (let j = folded.length - 1; j >= 0; j--) {
|
|
448
|
+
const f = folded[j];
|
|
449
|
+
if (f.time) {
|
|
450
|
+
const t = matchToDate(f.time, now);
|
|
451
|
+
if (t) {
|
|
452
|
+
return {
|
|
453
|
+
at: t.at,
|
|
454
|
+
grain: t.grain,
|
|
455
|
+
text: t.text,
|
|
456
|
+
yearCertain: t.yearCertain,
|
|
457
|
+
};
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
}
|
|
461
|
+
return null;
|
|
462
|
+
}
|
|
463
|
+
const DURATION_RE = /\b(?<in>in\s+)?(?<val>\d+)\s+(?<unit>seconds?|secs?|minutes?|mins?|hours?|hrs?|days?|weeks?|months?|years?)\s+(?<later>later|from\s+now|hence)\b|\bin\s+(?<val2>\d+)\s+(?<unit2>seconds?|secs?|minutes?|mins?|hours?|hrs?|days?|weeks?|months?|years?)\b/i;
|
|
464
|
+
/**
|
|
465
|
+
* Parse a bare relative offset ("3 days later", "in 2 hours") as a
|
|
466
|
+
* DURATION — no anchor applied. Used for event updates ("moved 3 days
|
|
467
|
+
* later"), where the anchor is the event's current datetime, NOT now.
|
|
468
|
+
*
|
|
469
|
+
* @param text — Free text possibly containing a relative offset.
|
|
470
|
+
* @returns The duration, or null when no offset is found.
|
|
471
|
+
*/
|
|
472
|
+
export function parseDuration(text) {
|
|
473
|
+
if (!text || typeof text !== "string")
|
|
474
|
+
return null;
|
|
475
|
+
const m = DURATION_RE.exec(text);
|
|
476
|
+
if (!m || !m.groups)
|
|
477
|
+
return null;
|
|
478
|
+
const val = parseInt(m.groups.val ?? m.groups.val2 ?? "0", 10);
|
|
479
|
+
const unit = UNIT_ALIASES[(m.groups.unit ?? m.groups.unit2 ?? "").toLowerCase()];
|
|
480
|
+
if (!unit || !(val > 0))
|
|
481
|
+
return null;
|
|
482
|
+
const zero = {
|
|
483
|
+
years: 0,
|
|
484
|
+
months: 0,
|
|
485
|
+
weeks: 0,
|
|
486
|
+
days: 0,
|
|
487
|
+
hours: 0,
|
|
488
|
+
minutes: 0,
|
|
489
|
+
seconds: 0,
|
|
490
|
+
text: m[0].trim(),
|
|
491
|
+
};
|
|
492
|
+
switch (unit) {
|
|
493
|
+
case "second":
|
|
494
|
+
zero.seconds = val;
|
|
495
|
+
break;
|
|
496
|
+
case "minute":
|
|
497
|
+
zero.minutes = val;
|
|
498
|
+
break;
|
|
499
|
+
case "hour":
|
|
500
|
+
zero.hours = val;
|
|
501
|
+
break;
|
|
502
|
+
case "day":
|
|
503
|
+
zero.days = val;
|
|
504
|
+
break;
|
|
505
|
+
case "week":
|
|
506
|
+
zero.weeks = val;
|
|
507
|
+
break;
|
|
508
|
+
case "month":
|
|
509
|
+
zero.months = val;
|
|
510
|
+
break;
|
|
511
|
+
case "year":
|
|
512
|
+
zero.years = val;
|
|
513
|
+
break;
|
|
514
|
+
}
|
|
515
|
+
return zero;
|
|
516
|
+
}
|
|
517
|
+
/**
|
|
518
|
+
* Apply a duration to an anchor date (calendar-aware for months/years).
|
|
519
|
+
* Deterministic: same anchor + same duration = same result.
|
|
520
|
+
*/
|
|
521
|
+
export function addDuration(anchor, d) {
|
|
522
|
+
let at = new Date(anchor);
|
|
523
|
+
if (d.years)
|
|
524
|
+
at = addYears(at, d.years);
|
|
525
|
+
if (d.months)
|
|
526
|
+
at = addMonths(at, d.months);
|
|
527
|
+
const ms = d.weeks * MS_PER.week +
|
|
528
|
+
d.days * MS_PER.day +
|
|
529
|
+
d.hours * MS_PER.hour +
|
|
530
|
+
d.minutes * MS_PER.minute +
|
|
531
|
+
d.seconds * MS_PER.second;
|
|
532
|
+
if (ms)
|
|
533
|
+
at = new Date(at.getTime() + ms);
|
|
534
|
+
return at;
|
|
535
|
+
}
|
|
536
|
+
//# sourceMappingURL=temporal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"temporal.js","sourceRoot":"","sources":["../src/temporal.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Memory time-travel: point-in-time reconstruction.
|
|
3
|
+
*
|
|
4
|
+
* The tamper log records every mutation as a hash-chained entry, but only
|
|
5
|
+
* stores hashes — not full state. This module adds snapshot capture: on
|
|
6
|
+
* every logged mutation, the node's full state (content, tags, importance,
|
|
7
|
+
* metadata, etc.) is saved alongside the tamper-log sequence number.
|
|
8
|
+
*
|
|
9
|
+
* `replayAt(timestamp)` reconstructs what the agent believed at any moment
|
|
10
|
+
* by finding the latest snapshot for each node before the timestamp.
|
|
11
|
+
*
|
|
12
|
+
* "What did you know about my project last March?" — no competitor can
|
|
13
|
+
* answer this. The data is the moat.
|
|
14
|
+
*/
|
|
15
|
+
import type { MemoryNode } from "./types.js";
|
|
16
|
+
export interface NodeSnapshot {
|
|
17
|
+
/** Tamper-log sequence number this snapshot corresponds to. */
|
|
18
|
+
seq: number;
|
|
19
|
+
/** Unix ms when the snapshot was taken. */
|
|
20
|
+
ts: number;
|
|
21
|
+
/** The operation that created this snapshot. */
|
|
22
|
+
op: string;
|
|
23
|
+
/** Full node state at this point in time. */
|
|
24
|
+
node: MemoryNode;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Reconstruct the set of nodes as they existed at a given timestamp.
|
|
28
|
+
*
|
|
29
|
+
* For each node, finds the latest snapshot with ts <= target. Nodes with
|
|
30
|
+
* a "forget" op as their latest snapshot are excluded (they didn't exist
|
|
31
|
+
* at the target time).
|
|
32
|
+
*
|
|
33
|
+
* @param snapshots - All snapshots, ordered by seq.
|
|
34
|
+
* @param targetTs - The timestamp to reconstruct (Unix ms).
|
|
35
|
+
* @returns The nodes as they existed at targetTs.
|
|
36
|
+
*/
|
|
37
|
+
export declare function replayAt(snapshots: NodeSnapshot[], targetTs: number): MemoryNode[];
|
|
38
|
+
//# sourceMappingURL=time-travel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"time-travel.d.ts","sourceRoot":"","sources":["../src/time-travel.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,MAAM,WAAW,YAAY;IAC3B,+DAA+D;IAC/D,GAAG,EAAE,MAAM,CAAC;IACZ,2CAA2C;IAC3C,EAAE,EAAE,MAAM,CAAC;IACX,gDAAgD;IAChD,EAAE,EAAE,MAAM,CAAC;IACX,6CAA6C;IAC7C,IAAI,EAAE,UAAU,CAAC;CAClB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,QAAQ,CACtB,SAAS,EAAE,YAAY,EAAE,EACzB,QAAQ,EAAE,MAAM,GACf,UAAU,EAAE,CAqBd"}
|
memos/_js/time-travel.js
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Memory time-travel: point-in-time reconstruction.
|
|
3
|
+
*
|
|
4
|
+
* The tamper log records every mutation as a hash-chained entry, but only
|
|
5
|
+
* stores hashes — not full state. This module adds snapshot capture: on
|
|
6
|
+
* every logged mutation, the node's full state (content, tags, importance,
|
|
7
|
+
* metadata, etc.) is saved alongside the tamper-log sequence number.
|
|
8
|
+
*
|
|
9
|
+
* `replayAt(timestamp)` reconstructs what the agent believed at any moment
|
|
10
|
+
* by finding the latest snapshot for each node before the timestamp.
|
|
11
|
+
*
|
|
12
|
+
* "What did you know about my project last March?" — no competitor can
|
|
13
|
+
* answer this. The data is the moat.
|
|
14
|
+
*/
|
|
15
|
+
/**
|
|
16
|
+
* Reconstruct the set of nodes as they existed at a given timestamp.
|
|
17
|
+
*
|
|
18
|
+
* For each node, finds the latest snapshot with ts <= target. Nodes with
|
|
19
|
+
* a "forget" op as their latest snapshot are excluded (they didn't exist
|
|
20
|
+
* at the target time).
|
|
21
|
+
*
|
|
22
|
+
* @param snapshots - All snapshots, ordered by seq.
|
|
23
|
+
* @param targetTs - The timestamp to reconstruct (Unix ms).
|
|
24
|
+
* @returns The nodes as they existed at targetTs.
|
|
25
|
+
*/
|
|
26
|
+
export function replayAt(snapshots, targetTs) {
|
|
27
|
+
// Group by nodeId, find latest snapshot <= targetTs for each
|
|
28
|
+
const latest = new Map();
|
|
29
|
+
for (const snap of snapshots) {
|
|
30
|
+
if (snap.ts > targetTs)
|
|
31
|
+
continue;
|
|
32
|
+
const existing = latest.get(snap.node.id);
|
|
33
|
+
if (!existing || snap.seq > existing.seq) {
|
|
34
|
+
latest.set(snap.node.id, snap);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
// Exclude nodes whose latest snapshot is a deletion
|
|
38
|
+
const result = [];
|
|
39
|
+
for (const snap of latest.values()) {
|
|
40
|
+
if (snap.op !== "forget") {
|
|
41
|
+
result.push(snap.node);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return result;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=time-travel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"time-travel.js","sourceRoot":"","sources":["../src/time-travel.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAeH;;;;;;;;;;GAUG;AACH,MAAM,UAAU,QAAQ,CACtB,SAAyB,EACzB,QAAgB;IAEhB,6DAA6D;IAC7D,MAAM,MAAM,GAAG,IAAI,GAAG,EAAwB,CAAC;IAE/C,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;QAC7B,IAAI,IAAI,CAAC,EAAE,GAAG,QAAQ;YAAE,SAAS;QACjC,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC1C,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,GAAG,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC;YACzC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IAED,oDAAoD;IACpD,MAAM,MAAM,GAAiB,EAAE,CAAC;IAChC,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;QACnC,IAAI,IAAI,CAAC,EAAE,KAAK,QAAQ,EAAE,CAAC;YACzB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Human-readable timestamp formatting for recalled memories.
|
|
3
|
+
*
|
|
4
|
+
* From Honcho: LLMs reason better about time when they see explicit
|
|
5
|
+
* absolute + relative timestamps ("2026-09-28 — 6 days ago") instead
|
|
6
|
+
* of raw epoch milliseconds. The TimeQA step-back paper showed +12pts
|
|
7
|
+
* from better temporal grounding.
|
|
8
|
+
*
|
|
9
|
+
* Pure rendering helper — does not affect retrieval scoring.
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Format an epoch-ms timestamp as "YYYY-MM-DD — N days ago".
|
|
13
|
+
*
|
|
14
|
+
* @param epochMs - Timestamp in epoch milliseconds
|
|
15
|
+
* @param now - Reference time (defaults to Date.now())
|
|
16
|
+
*/
|
|
17
|
+
export declare function formatMemoryTimestamp(epochMs: number, now?: number): string;
|
|
18
|
+
//# sourceMappingURL=timestamp-format.d.ts.map
|