@cartisien/engram 0.1.0 → 0.2.0
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.
- package/README.md +165 -16
- package/dist/example/temporal-demo.js +91 -0
- package/dist/index.d.ts +111 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +391 -5
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Engram
|
|
2
2
|
|
|
3
|
-
> **Persistent memory for AI assistants.**
|
|
3
|
+
> **Persistent memory for AI assistants with temporal recall.**
|
|
4
4
|
|
|
5
5
|
```typescript
|
|
6
6
|
import { Engram } from '@cartisien/engram';
|
|
@@ -10,9 +10,9 @@ const memory = new Engram({ dbPath: './memory.db' });
|
|
|
10
10
|
// Store
|
|
11
11
|
await memory.remember('user_123', 'I ride a Triumph Bonneville', 'user');
|
|
12
12
|
|
|
13
|
-
// Recall
|
|
14
|
-
const
|
|
15
|
-
|
|
13
|
+
// Recall with temporal queries
|
|
14
|
+
const yesterday = await memory.recallByTime('user_123', 'yesterday');
|
|
15
|
+
const lastWeek = await memory.recallByTime('user_123', 'last week');
|
|
16
16
|
```
|
|
17
17
|
|
|
18
18
|
---
|
|
@@ -29,6 +29,7 @@ Engram gives your assistants **persistent, queryable memory** — backed by SQLi
|
|
|
29
29
|
|
|
30
30
|
- **Zero config:** Works out of the box
|
|
31
31
|
- **Fast:** SQLite with proper indexes
|
|
32
|
+
- **Temporal:** Natural language time queries ("yesterday", "last week", "3 days ago")
|
|
32
33
|
- **Portable:** Single file database
|
|
33
34
|
- **Typed:** Full TypeScript support
|
|
34
35
|
|
|
@@ -68,6 +69,56 @@ async function handleChat(sessionId: string, message: string) {
|
|
|
68
69
|
}
|
|
69
70
|
```
|
|
70
71
|
|
|
72
|
+
## Temporal Recall
|
|
73
|
+
|
|
74
|
+
Engram understands natural language time expressions. Ask for memories from any point in time:
|
|
75
|
+
|
|
76
|
+
```typescript
|
|
77
|
+
// Simple temporal queries
|
|
78
|
+
const yesterday = await memory.recallByTime('session_123', 'yesterday');
|
|
79
|
+
const lastWeek = await memory.recallByTime('session_123', 'last week');
|
|
80
|
+
const threeDaysAgo = await memory.recallByTime('session_123', '3 days ago');
|
|
81
|
+
|
|
82
|
+
// Combined with keyword search
|
|
83
|
+
const meetingsLastWeek = await memory.recallByTime(
|
|
84
|
+
'session_123',
|
|
85
|
+
'last week',
|
|
86
|
+
'meeting' // Only entries containing "meeting"
|
|
87
|
+
);
|
|
88
|
+
|
|
89
|
+
// Recent memories (last 7 days)
|
|
90
|
+
const recent = await memory.recallRecent('session_123', 7);
|
|
91
|
+
|
|
92
|
+
// Since a specific date
|
|
93
|
+
const sinceLaunch = await memory.recallSince('session_123', new Date('2024-01-01'));
|
|
94
|
+
|
|
95
|
+
// Daily summaries
|
|
96
|
+
const lastWeekByDay = await memory.dailySummary('session_123', 7);
|
|
97
|
+
// Returns: [{ date, entries: [...], count }, ...]
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
### Supported Temporal Expressions
|
|
101
|
+
|
|
102
|
+
| Expression | Meaning |
|
|
103
|
+
|------------|---------|
|
|
104
|
+
| `today` | From midnight to now |
|
|
105
|
+
| `yesterday` | Full previous day |
|
|
106
|
+
| `tomorrow` | Next day (useful for scheduled items) |
|
|
107
|
+
| `3 days ago` | Specific day 3 days back |
|
|
108
|
+
| `a week ago` | 7 days ago |
|
|
109
|
+
| `2 weeks ago` | 14 days ago |
|
|
110
|
+
| `last monday` | Most recent Monday |
|
|
111
|
+
| `last week` | Previous full week (Sun-Sat) |
|
|
112
|
+
| `last month` | Previous full month |
|
|
113
|
+
| `this week` | Current week (Sun-today) |
|
|
114
|
+
| `this month` | Current month |
|
|
115
|
+
| `last 3 days` | Last 72 hours |
|
|
116
|
+
| `last 7 days` | Last week (rolling) |
|
|
117
|
+
| `january 15` | Specific date |
|
|
118
|
+
| `3/15` | March 15 (current year) |
|
|
119
|
+
| `jan 15 to jan 20` | Date range |
|
|
120
|
+
| `recent`, `lately` | Last 7 days |
|
|
121
|
+
|
|
71
122
|
## API
|
|
72
123
|
|
|
73
124
|
### `new Engram(config?)`
|
|
@@ -93,7 +144,7 @@ await memory.remember('session_abc', 'User loves Thai food', 'user', {
|
|
|
93
144
|
|
|
94
145
|
### `recall(sessionId, query?, limit?, options?)`
|
|
95
146
|
|
|
96
|
-
Retrieve memories for a session.
|
|
147
|
+
Retrieve memories for a session. Supports temporal filtering via `options.temporalQuery`.
|
|
97
148
|
|
|
98
149
|
```typescript
|
|
99
150
|
// Recent memories
|
|
@@ -102,10 +153,78 @@ const recent = await memory.recall('session_abc', undefined, 10);
|
|
|
102
153
|
// Keyword search
|
|
103
154
|
const relevant = await memory.recall('session_abc', 'food preferences', 5);
|
|
104
155
|
|
|
105
|
-
//
|
|
156
|
+
// Temporal + keyword
|
|
157
|
+
const yesterdayMeetings = await memory.recall(
|
|
158
|
+
'session_abc',
|
|
159
|
+
'meeting',
|
|
160
|
+
10,
|
|
161
|
+
{ temporalQuery: 'yesterday' }
|
|
162
|
+
);
|
|
163
|
+
|
|
164
|
+
// Filtered by role
|
|
106
165
|
const userOnly = await memory.recall('session_abc', undefined, 10, { role: 'user' });
|
|
107
166
|
```
|
|
108
167
|
|
|
168
|
+
### `recallByTime(sessionId, temporalQuery, keyword?, limit?, options?)`
|
|
169
|
+
|
|
170
|
+
Recall memories by natural language time expression.
|
|
171
|
+
|
|
172
|
+
```typescript
|
|
173
|
+
const { entries, range } = await memory.recallByTime(
|
|
174
|
+
'session_abc',
|
|
175
|
+
'last week',
|
|
176
|
+
'project update' // optional keyword filter
|
|
177
|
+
);
|
|
178
|
+
|
|
179
|
+
console.log(`Found ${entries.length} entries from ${range.description}`);
|
|
180
|
+
console.log(`Range: ${range.start.toDateString()} to ${range.end.toDateString()}`);
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
### `recallRecent(sessionId, days?, keyword?, limit?, options?)`
|
|
184
|
+
|
|
185
|
+
Get memories from the last N days.
|
|
186
|
+
|
|
187
|
+
```typescript
|
|
188
|
+
const { entries, days, since } = await memory.recallRecent('session_abc', 7);
|
|
189
|
+
console.log(`${entries.length} entries in the last ${days} days`);
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
### `recallSince(sessionId, since, keyword?, limit?, options?)`
|
|
193
|
+
|
|
194
|
+
Get memories since a specific date.
|
|
195
|
+
|
|
196
|
+
```typescript
|
|
197
|
+
const { entries, count } = await memory.recallSince(
|
|
198
|
+
'session_abc',
|
|
199
|
+
new Date('2024-01-01')
|
|
200
|
+
);
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
### `recallBetween(sessionId, start, end, keyword?, limit?, options?)`
|
|
204
|
+
|
|
205
|
+
Get memories between two dates.
|
|
206
|
+
|
|
207
|
+
```typescript
|
|
208
|
+
const { entries, count } = await memory.recallBetween(
|
|
209
|
+
'session_abc',
|
|
210
|
+
new Date('2024-01-01'),
|
|
211
|
+
new Date('2024-01-31')
|
|
212
|
+
);
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
### `dailySummary(sessionId, days?)`
|
|
216
|
+
|
|
217
|
+
Get memories grouped by day.
|
|
218
|
+
|
|
219
|
+
```typescript
|
|
220
|
+
const summary = await memory.dailySummary('session_abc', 7);
|
|
221
|
+
// [
|
|
222
|
+
// { date: Date, entries: MemoryEntry[], count: 5 },
|
|
223
|
+
// { date: Date, entries: MemoryEntry[], count: 3 },
|
|
224
|
+
// ...
|
|
225
|
+
// ]
|
|
226
|
+
```
|
|
227
|
+
|
|
109
228
|
### `history(sessionId, limit?)`
|
|
110
229
|
|
|
111
230
|
Get chronological conversation history.
|
|
@@ -125,8 +244,14 @@ await memory.forget('session_abc');
|
|
|
125
244
|
// Delete specific entry
|
|
126
245
|
await memory.forget('session_abc', { id: 'entry_id' });
|
|
127
246
|
|
|
128
|
-
// Delete
|
|
247
|
+
// Delete before a date
|
|
129
248
|
await memory.forget('session_abc', { before: new Date('2024-01-01') });
|
|
249
|
+
|
|
250
|
+
// Delete in a date range
|
|
251
|
+
await memory.forget('session_abc', {
|
|
252
|
+
after: new Date('2024-01-01'),
|
|
253
|
+
before: new Date('2024-02-01')
|
|
254
|
+
});
|
|
130
255
|
```
|
|
131
256
|
|
|
132
257
|
### `stats(sessionId)`
|
|
@@ -135,7 +260,36 @@ Get memory statistics.
|
|
|
135
260
|
|
|
136
261
|
```typescript
|
|
137
262
|
const stats = await memory.stats('session_abc');
|
|
138
|
-
// { total: 42, byRole: { user: 21, assistant: 21 },
|
|
263
|
+
// { total: 42, byRole: { user: 21, assistant: 21 }, oldest: Date, newest: Date }
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
### `temporalStats(sessionId, days?)`
|
|
267
|
+
|
|
268
|
+
Get activity statistics grouped by day.
|
|
269
|
+
|
|
270
|
+
```typescript
|
|
271
|
+
const activity = await memory.temporalStats('session_abc', 30);
|
|
272
|
+
// [
|
|
273
|
+
// { date: '2024-01-15', count: 5, byRole: { user: 3, assistant: 2 } },
|
|
274
|
+
// ...
|
|
275
|
+
// ]
|
|
276
|
+
```
|
|
277
|
+
|
|
278
|
+
## The TemporalQuery Parser
|
|
279
|
+
|
|
280
|
+
You can use the temporal parser standalone:
|
|
281
|
+
|
|
282
|
+
```typescript
|
|
283
|
+
import { TemporalQuery } from '@cartisien/engram';
|
|
284
|
+
|
|
285
|
+
const parser = new TemporalQuery();
|
|
286
|
+
const range = parser.parse('last week');
|
|
287
|
+
|
|
288
|
+
if (range) {
|
|
289
|
+
console.log(range.description); // "last week"
|
|
290
|
+
console.log(range.start); // Sun, Jan 07 2024 00:00:00
|
|
291
|
+
console.log(range.end); // Sat, Jan 13 2024 23:59:59
|
|
292
|
+
}
|
|
139
293
|
```
|
|
140
294
|
|
|
141
295
|
## Philosophy
|
|
@@ -144,14 +298,9 @@ const stats = await memory.stats('session_abc');
|
|
|
144
298
|
|
|
145
299
|
Memory isn't storage. It's the substrate of self.
|
|
146
300
|
|
|
147
|
-
Engram doesn't just persist data. It gives your assistants **continuity** — the ability to learn, reference, and grow across conversations.
|
|
148
|
-
|
|
149
|
-
## Roadmap
|
|
301
|
+
Engram doesn't just persist data. It gives your assistants **continuity** — the ability to learn, reference, and grow across conversations. Time is not a sequence of moments to be archived, but a horizon of meaning that shifts with each recollection.
|
|
150
302
|
|
|
151
|
-
|
|
152
|
-
- **v0.2** 🚧 Semantic search with embeddings
|
|
153
|
-
- **v0.3** 📋 Multi-session context, memory consolidation
|
|
154
|
-
- **v0.4** 📋 Cloud sync, distributed memory
|
|
303
|
+
The Cartesian cogito assumed memory was given. We're making it so.
|
|
155
304
|
|
|
156
305
|
## The Trilogy
|
|
157
306
|
|
|
@@ -159,7 +308,7 @@ Engram is part of the **Cartisien Memory Suite**:
|
|
|
159
308
|
|
|
160
309
|
| Package | Purpose |
|
|
161
310
|
|---------|---------|
|
|
162
|
-
| `@cartisien/engram` | **This package** — persistent memory
|
|
311
|
+
| `@cartisien/engram` | **This package** — persistent memory with temporal recall |
|
|
163
312
|
| `@cartisien/extensa` | Vector infrastructure (coming soon) |
|
|
164
313
|
| `@cartisien/cogito` | Identity & state management (coming soon) |
|
|
165
314
|
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { Engram, TemporalQuery } from '../dist/index';
|
|
2
|
+
async function main() {
|
|
3
|
+
// Create in-memory instance for demo
|
|
4
|
+
const memory = new Engram({ dbPath: ':memory:' });
|
|
5
|
+
console.log('🧠 Engram Temporal Recall Demo\n');
|
|
6
|
+
// Seed some memories with different timestamps
|
|
7
|
+
const now = new Date();
|
|
8
|
+
// Create memories spread across different days
|
|
9
|
+
const memories = [
|
|
10
|
+
{ content: 'Discussed project roadmap for Q1', daysAgo: 0, role: 'user' },
|
|
11
|
+
{ content: 'Agreed on priorities: auth, billing, dashboard', daysAgo: 0, role: 'assistant' },
|
|
12
|
+
{ content: 'Need to fix the authentication bug', daysAgo: 1, role: 'user' },
|
|
13
|
+
{ content: 'Bug is in the JWT validation middleware', daysAgo: 1, role: 'assistant' },
|
|
14
|
+
{ content: 'Launched the new landing page', daysAgo: 2, role: 'user' },
|
|
15
|
+
{ content: 'Great work on the design! Conversion up 15%', daysAgo: 2, role: 'assistant' },
|
|
16
|
+
{ content: 'Weekly team meeting notes', daysAgo: 5, role: 'user' },
|
|
17
|
+
{ content: 'Reviewed sprint progress, on track for launch', daysAgo: 5, role: 'assistant' },
|
|
18
|
+
{ content: 'User feedback: need dark mode', daysAgo: 7, role: 'user' },
|
|
19
|
+
{ content: 'Added to backlog for next sprint', daysAgo: 7, role: 'assistant' },
|
|
20
|
+
];
|
|
21
|
+
// Store memories with adjusted timestamps
|
|
22
|
+
for (const m of memories) {
|
|
23
|
+
const timestamp = new Date(now);
|
|
24
|
+
timestamp.setDate(timestamp.getDate() - m.daysAgo);
|
|
25
|
+
timestamp.setHours(14, 30, 0, 0); // 2:30 PM for consistency
|
|
26
|
+
// @ts-ignore - manually setting timestamp for demo
|
|
27
|
+
const entry = await memory.remember('demo_session', m.content, m.role);
|
|
28
|
+
// Override timestamp for demo purposes
|
|
29
|
+
await memory['db'].run('UPDATE memories SET timestamp = ? WHERE id = ?', [timestamp.getTime(), entry.id]);
|
|
30
|
+
}
|
|
31
|
+
console.log('✅ Seeded 10 memories across the last 7 days\n');
|
|
32
|
+
// Demo 1: Yesterday's memories
|
|
33
|
+
console.log('📅 Yesterday:');
|
|
34
|
+
const yesterday = await memory.recallByTime('demo_session', 'yesterday');
|
|
35
|
+
console.log(` Found ${yesterday.entries.length} entries from ${yesterday.range.description}`);
|
|
36
|
+
for (const entry of yesterday.entries.reverse()) {
|
|
37
|
+
console.log(` • [${entry.role}] ${entry.content}`);
|
|
38
|
+
}
|
|
39
|
+
console.log();
|
|
40
|
+
// Demo 2: Last 3 days
|
|
41
|
+
console.log('📅 Last 3 days:');
|
|
42
|
+
const recent = await memory.recallRecent('demo_session', 3);
|
|
43
|
+
console.log(` Found ${recent.entries.length} entries`);
|
|
44
|
+
console.log(` Since: ${recent.since.toDateString()}\n`);
|
|
45
|
+
// Demo 3: Search within time range
|
|
46
|
+
console.log('🔍 "bug" mentions in the last week:');
|
|
47
|
+
const bugMentions = await memory.recallByTime('demo_session', 'last week', 'bug');
|
|
48
|
+
console.log(` Found ${bugMentions.entries.length} entries`);
|
|
49
|
+
for (const entry of bugMentions.entries) {
|
|
50
|
+
console.log(` • ${entry.timestamp.toDateString()}: ${entry.content}`);
|
|
51
|
+
}
|
|
52
|
+
console.log();
|
|
53
|
+
// Demo 4: Daily summary
|
|
54
|
+
console.log('📊 Daily Activity Summary:');
|
|
55
|
+
const summary = await memory.dailySummary('demo_session', 7);
|
|
56
|
+
for (const day of summary) {
|
|
57
|
+
console.log(` ${day.date.toDateString()}: ${day.count} entries`);
|
|
58
|
+
}
|
|
59
|
+
console.log();
|
|
60
|
+
// Demo 5: Temporal parser standalone
|
|
61
|
+
console.log('🔧 Temporal Parser Examples:');
|
|
62
|
+
const parser = new TemporalQuery();
|
|
63
|
+
const examples = [
|
|
64
|
+
'today',
|
|
65
|
+
'yesterday',
|
|
66
|
+
'3 days ago',
|
|
67
|
+
'last week',
|
|
68
|
+
'this week',
|
|
69
|
+
'last monday',
|
|
70
|
+
'recent',
|
|
71
|
+
];
|
|
72
|
+
for (const expr of examples) {
|
|
73
|
+
const range = parser.parse(expr);
|
|
74
|
+
if (range) {
|
|
75
|
+
console.log(` "${expr}" → ${range.start.toDateString()} to ${range.end.toDateString()}`);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
console.log();
|
|
79
|
+
// Demo 6: Temporal stats
|
|
80
|
+
console.log('📈 Temporal Statistics:');
|
|
81
|
+
const stats = await memory.temporalStats('demo_session', 7);
|
|
82
|
+
for (const day of stats.slice(0, 5)) {
|
|
83
|
+
const roles = Object.entries(day.byRole)
|
|
84
|
+
.map(([r, c]) => `${r}:${c}`)
|
|
85
|
+
.join(', ');
|
|
86
|
+
console.log(` ${day.date}: ${day.count} entries (${roles})`);
|
|
87
|
+
}
|
|
88
|
+
await memory.close();
|
|
89
|
+
console.log('\n✨ Demo complete!');
|
|
90
|
+
}
|
|
91
|
+
main().catch(console.error);
|
package/dist/index.d.ts
CHANGED
|
@@ -12,10 +12,44 @@ export interface RecallOptions {
|
|
|
12
12
|
after?: Date;
|
|
13
13
|
role?: 'user' | 'assistant' | 'system';
|
|
14
14
|
}
|
|
15
|
+
export interface TemporalRecallOptions extends RecallOptions {
|
|
16
|
+
/** Natural language time expression: 'yesterday', 'last week', '3 days ago', etc. */
|
|
17
|
+
temporalQuery?: string;
|
|
18
|
+
/** Timezone offset in minutes from UTC (default: local timezone) */
|
|
19
|
+
timezoneOffset?: number;
|
|
20
|
+
}
|
|
21
|
+
export interface TimeRange {
|
|
22
|
+
start: Date;
|
|
23
|
+
end: Date;
|
|
24
|
+
description: string;
|
|
25
|
+
}
|
|
15
26
|
export interface EngramConfig {
|
|
16
27
|
dbPath?: string;
|
|
17
28
|
maxContextLength?: number;
|
|
18
29
|
}
|
|
30
|
+
/**
|
|
31
|
+
* Temporal query parser for natural language time expressions
|
|
32
|
+
*/
|
|
33
|
+
export declare class TemporalQuery {
|
|
34
|
+
private referenceDate;
|
|
35
|
+
private timezoneOffset;
|
|
36
|
+
constructor(referenceDate?: Date, timezoneOffset?: number);
|
|
37
|
+
/**
|
|
38
|
+
* Parse a natural language time expression into a concrete time range
|
|
39
|
+
*
|
|
40
|
+
* Supports:
|
|
41
|
+
* - Relative: 'today', 'yesterday', 'tomorrow'
|
|
42
|
+
* - Days ago: '3 days ago', 'a week ago', '2 weeks ago'
|
|
43
|
+
* - Last: 'last monday', 'last week', 'last month'
|
|
44
|
+
* - This: 'this week', 'this month', 'this year'
|
|
45
|
+
* - Recent: 'recent', 'lately', 'recently' (last 7 days)
|
|
46
|
+
* - Between: 'january 15 to january 20', '3/1 to 3/15'
|
|
47
|
+
*/
|
|
48
|
+
parse(expression: string): TimeRange | null;
|
|
49
|
+
private parseDate;
|
|
50
|
+
private startOfDay;
|
|
51
|
+
private endOfDay;
|
|
52
|
+
}
|
|
19
53
|
/**
|
|
20
54
|
* Engram - Persistent memory for AI assistants
|
|
21
55
|
*
|
|
@@ -31,8 +65,9 @@ export interface EngramConfig {
|
|
|
31
65
|
* // Store a memory
|
|
32
66
|
* await memory.remember('user_123', 'Jeff loves Triumph motorcycles', 'user');
|
|
33
67
|
*
|
|
34
|
-
* // Retrieve
|
|
35
|
-
* const
|
|
68
|
+
* // Retrieve with temporal query
|
|
69
|
+
* const yesterday = await memory.recallByTime('user_123', 'yesterday');
|
|
70
|
+
* const lastWeek = await memory.recallByTime('user_123', 'last week');
|
|
36
71
|
* ```
|
|
37
72
|
*/
|
|
38
73
|
export declare class Engram {
|
|
@@ -49,10 +84,70 @@ export declare class Engram {
|
|
|
49
84
|
/**
|
|
50
85
|
* Recall memories for a session
|
|
51
86
|
*
|
|
52
|
-
*
|
|
53
|
-
*
|
|
87
|
+
* Supports temporal queries via options.temporalQuery:
|
|
88
|
+
* - 'yesterday', 'today', 'tomorrow'
|
|
89
|
+
* - '3 days ago', 'a week ago', '2 weeks ago'
|
|
90
|
+
* - 'last monday', 'last week', 'last month'
|
|
91
|
+
* - 'this week', 'this month'
|
|
92
|
+
* - 'last 3 days', 'last week'
|
|
93
|
+
* - 'january 15', '3/15', '2024-01-15'
|
|
94
|
+
* - 'jan 15 to jan 20', '3/1 to 3/15'
|
|
95
|
+
*/
|
|
96
|
+
recall(sessionId: string, query?: string, limit?: number, options?: TemporalRecallOptions): Promise<MemoryEntry[]>;
|
|
97
|
+
/**
|
|
98
|
+
* Recall memories by natural language time expression
|
|
99
|
+
*
|
|
100
|
+
* @example
|
|
101
|
+
* ```typescript
|
|
102
|
+
* // Get yesterday's memories
|
|
103
|
+
* const yesterday = await memory.recallByTime('session_123', 'yesterday');
|
|
104
|
+
*
|
|
105
|
+
* // Get last week's memories
|
|
106
|
+
* const lastWeek = await memory.recallByTime('session_123', 'last week');
|
|
107
|
+
*
|
|
108
|
+
* // Get memories from 3 days ago
|
|
109
|
+
* const threeDaysAgo = await memory.recallByTime('session_123', '3 days ago');
|
|
110
|
+
* ```
|
|
111
|
+
*/
|
|
112
|
+
recallByTime(sessionId: string, temporalQuery: string, query?: string, limit?: number, options?: Omit<TemporalRecallOptions, 'temporalQuery'>): Promise<{
|
|
113
|
+
entries: MemoryEntry[];
|
|
114
|
+
range: TimeRange;
|
|
115
|
+
}>;
|
|
116
|
+
/**
|
|
117
|
+
* Get memories from the last N days
|
|
118
|
+
*/
|
|
119
|
+
recallRecent(sessionId: string, days?: number, query?: string, limit?: number, options?: Omit<TemporalRecallOptions, 'after' | 'before'>): Promise<{
|
|
120
|
+
entries: MemoryEntry[];
|
|
121
|
+
days: number;
|
|
122
|
+
since: Date;
|
|
123
|
+
}>;
|
|
124
|
+
/**
|
|
125
|
+
* Get memories since a specific date
|
|
126
|
+
*/
|
|
127
|
+
recallSince(sessionId: string, since: Date, query?: string, limit?: number, options?: Omit<TemporalRecallOptions, 'after'>): Promise<{
|
|
128
|
+
entries: MemoryEntry[];
|
|
129
|
+
since: Date;
|
|
130
|
+
count: number;
|
|
131
|
+
}>;
|
|
132
|
+
/**
|
|
133
|
+
* Get memories between two dates
|
|
134
|
+
*/
|
|
135
|
+
recallBetween(sessionId: string, start: Date, end: Date, query?: string, limit?: number, options?: Omit<TemporalRecallOptions, 'after' | 'before'>): Promise<{
|
|
136
|
+
entries: MemoryEntry[];
|
|
137
|
+
start: Date;
|
|
138
|
+
end: Date;
|
|
139
|
+
count: number;
|
|
140
|
+
}>;
|
|
141
|
+
/**
|
|
142
|
+
* Get a daily summary of memories
|
|
143
|
+
*
|
|
144
|
+
* Returns memories grouped by day, useful for "what happened each day" views
|
|
54
145
|
*/
|
|
55
|
-
|
|
146
|
+
dailySummary(sessionId: string, days?: number): Promise<{
|
|
147
|
+
date: Date;
|
|
148
|
+
entries: MemoryEntry[];
|
|
149
|
+
count: number;
|
|
150
|
+
}[]>;
|
|
56
151
|
/**
|
|
57
152
|
* Get recent conversation history for a session
|
|
58
153
|
*/
|
|
@@ -62,6 +157,7 @@ export declare class Engram {
|
|
|
62
157
|
*/
|
|
63
158
|
forget(sessionId: string, options?: {
|
|
64
159
|
before?: Date;
|
|
160
|
+
after?: Date;
|
|
65
161
|
id?: string;
|
|
66
162
|
}): Promise<number>;
|
|
67
163
|
/**
|
|
@@ -73,6 +169,16 @@ export declare class Engram {
|
|
|
73
169
|
oldest: Date | null;
|
|
74
170
|
newest: Date | null;
|
|
75
171
|
}>;
|
|
172
|
+
/**
|
|
173
|
+
* Get temporal statistics for a session
|
|
174
|
+
*
|
|
175
|
+
* Returns memory counts grouped by day, useful for activity visualization
|
|
176
|
+
*/
|
|
177
|
+
temporalStats(sessionId: string, days?: number): Promise<{
|
|
178
|
+
date: string;
|
|
179
|
+
count: number;
|
|
180
|
+
byRole: Record<string, number>;
|
|
181
|
+
}[]>;
|
|
76
182
|
/**
|
|
77
183
|
* Close the database connection
|
|
78
184
|
*/
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,QAAQ,CAAC;IACtC,SAAS,EAAE,IAAI,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,IAAI,CAAC;IACd,KAAK,CAAC,EAAE,IAAI,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,GAAG,WAAW,GAAG,QAAQ,CAAC;CACxC;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,7 +1,251 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.Engram = void 0;
|
|
3
|
+
exports.Engram = exports.TemporalQuery = void 0;
|
|
4
4
|
const crypto_1 = require("crypto");
|
|
5
|
+
/**
|
|
6
|
+
* Temporal query parser for natural language time expressions
|
|
7
|
+
*/
|
|
8
|
+
class TemporalQuery {
|
|
9
|
+
referenceDate;
|
|
10
|
+
timezoneOffset;
|
|
11
|
+
constructor(referenceDate = new Date(), timezoneOffset = -referenceDate.getTimezoneOffset()) {
|
|
12
|
+
this.referenceDate = new Date(referenceDate);
|
|
13
|
+
this.timezoneOffset = timezoneOffset;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Parse a natural language time expression into a concrete time range
|
|
17
|
+
*
|
|
18
|
+
* Supports:
|
|
19
|
+
* - Relative: 'today', 'yesterday', 'tomorrow'
|
|
20
|
+
* - Days ago: '3 days ago', 'a week ago', '2 weeks ago'
|
|
21
|
+
* - Last: 'last monday', 'last week', 'last month'
|
|
22
|
+
* - This: 'this week', 'this month', 'this year'
|
|
23
|
+
* - Recent: 'recent', 'lately', 'recently' (last 7 days)
|
|
24
|
+
* - Between: 'january 15 to january 20', '3/1 to 3/15'
|
|
25
|
+
*/
|
|
26
|
+
parse(expression) {
|
|
27
|
+
const normalized = expression.toLowerCase().trim();
|
|
28
|
+
const now = new Date(this.referenceDate);
|
|
29
|
+
// Handle 'now', 'recent', 'lately', 'recently' → last 7 days
|
|
30
|
+
if (/^(now|recent|lately|recently)$/.test(normalized)) {
|
|
31
|
+
const end = new Date(now);
|
|
32
|
+
const start = new Date(now);
|
|
33
|
+
start.setDate(start.getDate() - 7);
|
|
34
|
+
return { start, end, description: 'last 7 days' };
|
|
35
|
+
}
|
|
36
|
+
// Handle 'today'
|
|
37
|
+
if (normalized === 'today') {
|
|
38
|
+
const start = this.startOfDay(now);
|
|
39
|
+
const end = new Date(now);
|
|
40
|
+
return { start, end, description: 'today' };
|
|
41
|
+
}
|
|
42
|
+
// Handle 'yesterday'
|
|
43
|
+
if (normalized === 'yesterday') {
|
|
44
|
+
const start = this.startOfDay(now);
|
|
45
|
+
start.setDate(start.getDate() - 1);
|
|
46
|
+
const end = this.endOfDay(start);
|
|
47
|
+
return { start, end, description: 'yesterday' };
|
|
48
|
+
}
|
|
49
|
+
// Handle 'tomorrow' (future, but useful for completeness)
|
|
50
|
+
if (normalized === 'tomorrow') {
|
|
51
|
+
const start = this.startOfDay(now);
|
|
52
|
+
start.setDate(start.getDate() + 1);
|
|
53
|
+
const end = this.endOfDay(start);
|
|
54
|
+
return { start, end, description: 'tomorrow' };
|
|
55
|
+
}
|
|
56
|
+
// Handle 'N days ago' / 'a week ago' / 'N weeks ago'
|
|
57
|
+
const daysAgoMatch = normalized.match(/^(?:(\d+)|a|one)\s+(day|week|month)s?\s+ago$/);
|
|
58
|
+
if (daysAgoMatch) {
|
|
59
|
+
const num = daysAgoMatch[1] ? parseInt(daysAgoMatch[1]) : 1;
|
|
60
|
+
const unit = daysAgoMatch[2];
|
|
61
|
+
const start = this.startOfDay(now);
|
|
62
|
+
const end = this.endOfDay(now);
|
|
63
|
+
if (unit === 'day') {
|
|
64
|
+
start.setDate(start.getDate() - num);
|
|
65
|
+
end.setDate(end.getDate() - num);
|
|
66
|
+
}
|
|
67
|
+
else if (unit === 'week') {
|
|
68
|
+
start.setDate(start.getDate() - (num * 7));
|
|
69
|
+
end.setDate(end.getDate() - ((num - 1) * 7) - 1);
|
|
70
|
+
}
|
|
71
|
+
else if (unit === 'month') {
|
|
72
|
+
start.setMonth(start.getMonth() - num);
|
|
73
|
+
start.setDate(1);
|
|
74
|
+
end.setMonth(end.getMonth() - num + 1);
|
|
75
|
+
end.setDate(0);
|
|
76
|
+
}
|
|
77
|
+
return { start, end, description: `${num} ${unit}${num > 1 ? 's' : ''} ago` };
|
|
78
|
+
}
|
|
79
|
+
// Handle 'last N days/weeks/months' (range ending now)
|
|
80
|
+
const lastNMatch = normalized.match(/^last\s+(?:(\d+)|a|one)\s+(day|week|month)s?$/);
|
|
81
|
+
if (lastNMatch) {
|
|
82
|
+
const num = lastNMatch[1] ? parseInt(lastNMatch[1]) : 1;
|
|
83
|
+
const unit = lastNMatch[2];
|
|
84
|
+
const start = new Date(now);
|
|
85
|
+
const end = new Date(now);
|
|
86
|
+
if (unit === 'day') {
|
|
87
|
+
start.setDate(start.getDate() - num);
|
|
88
|
+
}
|
|
89
|
+
else if (unit === 'week') {
|
|
90
|
+
start.setDate(start.getDate() - (num * 7));
|
|
91
|
+
}
|
|
92
|
+
else if (unit === 'month') {
|
|
93
|
+
start.setMonth(start.getMonth() - num);
|
|
94
|
+
}
|
|
95
|
+
return { start, end, description: `last ${num} ${unit}${num > 1 ? 's' : ''}` };
|
|
96
|
+
}
|
|
97
|
+
// Handle 'this week/month/year'
|
|
98
|
+
const thisMatch = normalized.match(/^this\s+(week|month|year)$/);
|
|
99
|
+
if (thisMatch) {
|
|
100
|
+
const unit = thisMatch[1];
|
|
101
|
+
const start = new Date(now);
|
|
102
|
+
const end = new Date(now);
|
|
103
|
+
if (unit === 'week') {
|
|
104
|
+
const dayOfWeek = start.getDay();
|
|
105
|
+
start.setDate(start.getDate() - dayOfWeek);
|
|
106
|
+
start.setHours(0, 0, 0, 0);
|
|
107
|
+
end.setDate(start.getDate() + 6);
|
|
108
|
+
end.setHours(23, 59, 59, 999);
|
|
109
|
+
}
|
|
110
|
+
else if (unit === 'month') {
|
|
111
|
+
start.setDate(1);
|
|
112
|
+
start.setHours(0, 0, 0, 0);
|
|
113
|
+
end.setMonth(end.getMonth() + 1);
|
|
114
|
+
end.setDate(0);
|
|
115
|
+
end.setHours(23, 59, 59, 999);
|
|
116
|
+
}
|
|
117
|
+
else if (unit === 'year') {
|
|
118
|
+
start.setMonth(0, 1);
|
|
119
|
+
start.setHours(0, 0, 0, 0);
|
|
120
|
+
end.setMonth(11, 31);
|
|
121
|
+
end.setHours(23, 59, 59, 999);
|
|
122
|
+
}
|
|
123
|
+
return { start, end, description: `this ${unit}` };
|
|
124
|
+
}
|
|
125
|
+
// Handle 'last week/month/year' (previous full period)
|
|
126
|
+
const lastPeriodMatch = normalized.match(/^last\s+(week|month|year)$/);
|
|
127
|
+
if (lastPeriodMatch) {
|
|
128
|
+
const unit = lastPeriodMatch[1];
|
|
129
|
+
const start = new Date(now);
|
|
130
|
+
const end = new Date(now);
|
|
131
|
+
if (unit === 'week') {
|
|
132
|
+
const dayOfWeek = start.getDay();
|
|
133
|
+
start.setDate(start.getDate() - dayOfWeek - 7);
|
|
134
|
+
start.setHours(0, 0, 0, 0);
|
|
135
|
+
end.setDate(start.getDate() + 6);
|
|
136
|
+
end.setHours(23, 59, 59, 999);
|
|
137
|
+
}
|
|
138
|
+
else if (unit === 'month') {
|
|
139
|
+
start.setMonth(start.getMonth() - 1);
|
|
140
|
+
start.setDate(1);
|
|
141
|
+
start.setHours(0, 0, 0, 0);
|
|
142
|
+
end.setDate(0);
|
|
143
|
+
end.setHours(23, 59, 59, 999);
|
|
144
|
+
}
|
|
145
|
+
else if (unit === 'year') {
|
|
146
|
+
start.setFullYear(start.getFullYear() - 1);
|
|
147
|
+
start.setMonth(0, 1);
|
|
148
|
+
start.setHours(0, 0, 0, 0);
|
|
149
|
+
end.setMonth(0, 0);
|
|
150
|
+
end.setHours(23, 59, 59, 999);
|
|
151
|
+
}
|
|
152
|
+
return { start, end, description: `last ${unit}` };
|
|
153
|
+
}
|
|
154
|
+
// Handle day names: 'monday', 'last monday', 'tuesday', etc.
|
|
155
|
+
const dayNames = ['sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday'];
|
|
156
|
+
const dayMatch = normalized.match(/^(?:last\s+)?(sunday|monday|tuesday|wednesday|thursday|friday|saturday)$/);
|
|
157
|
+
if (dayMatch) {
|
|
158
|
+
const targetDay = dayNames.indexOf(dayMatch[1]);
|
|
159
|
+
const isLast = normalized.startsWith('last ');
|
|
160
|
+
const start = this.startOfDay(now);
|
|
161
|
+
let daysDiff = start.getDay() - targetDay;
|
|
162
|
+
if (daysDiff <= 0) {
|
|
163
|
+
daysDiff += 7;
|
|
164
|
+
}
|
|
165
|
+
if (isLast && daysDiff === 0) {
|
|
166
|
+
daysDiff = 7;
|
|
167
|
+
}
|
|
168
|
+
start.setDate(start.getDate() - daysDiff);
|
|
169
|
+
const end = this.endOfDay(start);
|
|
170
|
+
return { start, end, description: isLast ? `last ${dayMatch[1]}` : dayMatch[1] };
|
|
171
|
+
}
|
|
172
|
+
// Handle date ranges: 'jan 15 to jan 20', '3/1 to 3/15', '2024-01-15 to 2024-01-20'
|
|
173
|
+
const rangeMatch = normalized.match(/^(.+?)\s+(?:to|through|until|-)\s+(.+)$/);
|
|
174
|
+
if (rangeMatch) {
|
|
175
|
+
const startDate = this.parseDate(rangeMatch[1]);
|
|
176
|
+
const endDate = this.parseDate(rangeMatch[2]);
|
|
177
|
+
if (startDate && endDate) {
|
|
178
|
+
return {
|
|
179
|
+
start: this.startOfDay(startDate),
|
|
180
|
+
end: this.endOfDay(endDate),
|
|
181
|
+
description: `${rangeMatch[1]} to ${rangeMatch[2]}`
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
// Try to parse as single date
|
|
186
|
+
const singleDate = this.parseDate(normalized);
|
|
187
|
+
if (singleDate) {
|
|
188
|
+
return {
|
|
189
|
+
start: this.startOfDay(singleDate),
|
|
190
|
+
end: this.endOfDay(singleDate),
|
|
191
|
+
description: normalized
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
return null;
|
|
195
|
+
}
|
|
196
|
+
parseDate(expr) {
|
|
197
|
+
const normalized = expr.trim().toLowerCase();
|
|
198
|
+
const now = new Date(this.referenceDate);
|
|
199
|
+
// Try various date formats
|
|
200
|
+
const formats = [
|
|
201
|
+
// MM/DD or MM/DD/YY or MM/DD/YYYY
|
|
202
|
+
{ regex: /^(\d{1,2})\/(\d{1,2})(?:\/(\d{2,4}))?$/, fn: (m) => {
|
|
203
|
+
const month = parseInt(m[1]) - 1;
|
|
204
|
+
const day = parseInt(m[2]);
|
|
205
|
+
let year = now.getFullYear();
|
|
206
|
+
if (m[3]) {
|
|
207
|
+
const y = parseInt(m[3]);
|
|
208
|
+
year = y < 100 ? (y < 50 ? 2000 + y : 1900 + y) : y;
|
|
209
|
+
}
|
|
210
|
+
return new Date(year, month, day);
|
|
211
|
+
} },
|
|
212
|
+
// Month name + day (e.g., "january 15" or "jan 15")
|
|
213
|
+
{ regex: /^(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)[a-z]*\s+(\d{1,2})(?:,?\s+(\d{4}))?$/i, fn: (m) => {
|
|
214
|
+
const months = ['jan', 'feb', 'mar', 'apr', 'may', 'jun', 'jul', 'aug', 'sep', 'oct', 'nov', 'dec'];
|
|
215
|
+
const month = months.indexOf(m[1].toLowerCase().slice(0, 3));
|
|
216
|
+
const day = parseInt(m[2]);
|
|
217
|
+
let year = now.getFullYear();
|
|
218
|
+
if (m[3])
|
|
219
|
+
year = parseInt(m[3]);
|
|
220
|
+
return new Date(year, month, day);
|
|
221
|
+
} },
|
|
222
|
+
// ISO date YYYY-MM-DD
|
|
223
|
+
{ regex: /^(\d{4})-(\d{2})-(\d{2})$/, fn: (m) => {
|
|
224
|
+
return new Date(parseInt(m[1]), parseInt(m[2]) - 1, parseInt(m[3]));
|
|
225
|
+
} }
|
|
226
|
+
];
|
|
227
|
+
for (const format of formats) {
|
|
228
|
+
const match = normalized.match(format.regex);
|
|
229
|
+
if (match) {
|
|
230
|
+
const date = format.fn(match);
|
|
231
|
+
if (!isNaN(date.getTime()))
|
|
232
|
+
return date;
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
return null;
|
|
236
|
+
}
|
|
237
|
+
startOfDay(date) {
|
|
238
|
+
const d = new Date(date);
|
|
239
|
+
d.setHours(0, 0, 0, 0);
|
|
240
|
+
return d;
|
|
241
|
+
}
|
|
242
|
+
endOfDay(date) {
|
|
243
|
+
const d = new Date(date);
|
|
244
|
+
d.setHours(23, 59, 59, 999);
|
|
245
|
+
return d;
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
exports.TemporalQuery = TemporalQuery;
|
|
5
249
|
/**
|
|
6
250
|
* Engram - Persistent memory for AI assistants
|
|
7
251
|
*
|
|
@@ -17,8 +261,9 @@ const crypto_1 = require("crypto");
|
|
|
17
261
|
* // Store a memory
|
|
18
262
|
* await memory.remember('user_123', 'Jeff loves Triumph motorcycles', 'user');
|
|
19
263
|
*
|
|
20
|
-
* // Retrieve
|
|
21
|
-
* const
|
|
264
|
+
* // Retrieve with temporal query
|
|
265
|
+
* const yesterday = await memory.recallByTime('user_123', 'yesterday');
|
|
266
|
+
* const lastWeek = await memory.recallByTime('user_123', 'last week');
|
|
22
267
|
* ```
|
|
23
268
|
*/
|
|
24
269
|
class Engram {
|
|
@@ -99,11 +344,26 @@ class Engram {
|
|
|
99
344
|
/**
|
|
100
345
|
* Recall memories for a session
|
|
101
346
|
*
|
|
102
|
-
*
|
|
103
|
-
*
|
|
347
|
+
* Supports temporal queries via options.temporalQuery:
|
|
348
|
+
* - 'yesterday', 'today', 'tomorrow'
|
|
349
|
+
* - '3 days ago', 'a week ago', '2 weeks ago'
|
|
350
|
+
* - 'last monday', 'last week', 'last month'
|
|
351
|
+
* - 'this week', 'this month'
|
|
352
|
+
* - 'last 3 days', 'last week'
|
|
353
|
+
* - 'january 15', '3/15', '2024-01-15'
|
|
354
|
+
* - 'jan 15 to jan 20', '3/1 to 3/15'
|
|
104
355
|
*/
|
|
105
356
|
async recall(sessionId, query, limit = 10, options = {}) {
|
|
106
357
|
await this.init();
|
|
358
|
+
// Handle temporal query if provided
|
|
359
|
+
if (options.temporalQuery) {
|
|
360
|
+
const temporal = new TemporalQuery(new Date(), options.timezoneOffset);
|
|
361
|
+
const range = temporal.parse(options.temporalQuery);
|
|
362
|
+
if (range) {
|
|
363
|
+
options.after = range.start;
|
|
364
|
+
options.before = range.end;
|
|
365
|
+
}
|
|
366
|
+
}
|
|
107
367
|
let sql = `
|
|
108
368
|
SELECT id, session_id, content, role, timestamp, metadata
|
|
109
369
|
FROM memories
|
|
@@ -142,6 +402,97 @@ class Engram {
|
|
|
142
402
|
metadata: row.metadata ? JSON.parse(row.metadata) : undefined
|
|
143
403
|
}));
|
|
144
404
|
}
|
|
405
|
+
/**
|
|
406
|
+
* Recall memories by natural language time expression
|
|
407
|
+
*
|
|
408
|
+
* @example
|
|
409
|
+
* ```typescript
|
|
410
|
+
* // Get yesterday's memories
|
|
411
|
+
* const yesterday = await memory.recallByTime('session_123', 'yesterday');
|
|
412
|
+
*
|
|
413
|
+
* // Get last week's memories
|
|
414
|
+
* const lastWeek = await memory.recallByTime('session_123', 'last week');
|
|
415
|
+
*
|
|
416
|
+
* // Get memories from 3 days ago
|
|
417
|
+
* const threeDaysAgo = await memory.recallByTime('session_123', '3 days ago');
|
|
418
|
+
* ```
|
|
419
|
+
*/
|
|
420
|
+
async recallByTime(sessionId, temporalQuery, query, limit = 50, options = {}) {
|
|
421
|
+
const temporal = new TemporalQuery(new Date(), options.timezoneOffset);
|
|
422
|
+
const range = temporal.parse(temporalQuery);
|
|
423
|
+
if (!range) {
|
|
424
|
+
throw new Error(`Unable to parse temporal query: "${temporalQuery}"`);
|
|
425
|
+
}
|
|
426
|
+
const entries = await this.recall(sessionId, query, limit, {
|
|
427
|
+
...options,
|
|
428
|
+
after: range.start,
|
|
429
|
+
before: range.end
|
|
430
|
+
});
|
|
431
|
+
return { entries, range };
|
|
432
|
+
}
|
|
433
|
+
/**
|
|
434
|
+
* Get memories from the last N days
|
|
435
|
+
*/
|
|
436
|
+
async recallRecent(sessionId, days = 7, query, limit = 50, options = {}) {
|
|
437
|
+
const since = new Date();
|
|
438
|
+
since.setDate(since.getDate() - days);
|
|
439
|
+
since.setHours(0, 0, 0, 0);
|
|
440
|
+
const entries = await this.recall(sessionId, query, limit, {
|
|
441
|
+
...options,
|
|
442
|
+
after: since
|
|
443
|
+
});
|
|
444
|
+
return { entries, days, since };
|
|
445
|
+
}
|
|
446
|
+
/**
|
|
447
|
+
* Get memories since a specific date
|
|
448
|
+
*/
|
|
449
|
+
async recallSince(sessionId, since, query, limit = 50, options = {}) {
|
|
450
|
+
const entries = await this.recall(sessionId, query, limit, {
|
|
451
|
+
...options,
|
|
452
|
+
after: since
|
|
453
|
+
});
|
|
454
|
+
return { entries, since, count: entries.length };
|
|
455
|
+
}
|
|
456
|
+
/**
|
|
457
|
+
* Get memories between two dates
|
|
458
|
+
*/
|
|
459
|
+
async recallBetween(sessionId, start, end, query, limit = 50, options = {}) {
|
|
460
|
+
const entries = await this.recall(sessionId, query, limit, {
|
|
461
|
+
...options,
|
|
462
|
+
after: start,
|
|
463
|
+
before: end
|
|
464
|
+
});
|
|
465
|
+
return { entries, start, end, count: entries.length };
|
|
466
|
+
}
|
|
467
|
+
/**
|
|
468
|
+
* Get a daily summary of memories
|
|
469
|
+
*
|
|
470
|
+
* Returns memories grouped by day, useful for "what happened each day" views
|
|
471
|
+
*/
|
|
472
|
+
async dailySummary(sessionId, days = 7) {
|
|
473
|
+
await this.init();
|
|
474
|
+
const since = new Date();
|
|
475
|
+
since.setDate(since.getDate() - days);
|
|
476
|
+
since.setHours(0, 0, 0, 0);
|
|
477
|
+
const entries = await this.recall(sessionId, undefined, 1000, { after: since });
|
|
478
|
+
// Group by day
|
|
479
|
+
const grouped = new Map();
|
|
480
|
+
for (const entry of entries) {
|
|
481
|
+
const dateKey = entry.timestamp.toISOString().split('T')[0];
|
|
482
|
+
if (!grouped.has(dateKey)) {
|
|
483
|
+
grouped.set(dateKey, []);
|
|
484
|
+
}
|
|
485
|
+
grouped.get(dateKey).push(entry);
|
|
486
|
+
}
|
|
487
|
+
// Convert to sorted array
|
|
488
|
+
return Array.from(grouped.entries())
|
|
489
|
+
.sort((a, b) => b[0].localeCompare(a[0])) // Descending date order
|
|
490
|
+
.map(([dateKey, dayEntries]) => ({
|
|
491
|
+
date: new Date(dateKey),
|
|
492
|
+
entries: dayEntries.sort((a, b) => b.timestamp.getTime() - a.timestamp.getTime()),
|
|
493
|
+
count: dayEntries.length
|
|
494
|
+
}));
|
|
495
|
+
}
|
|
145
496
|
/**
|
|
146
497
|
* Get recent conversation history for a session
|
|
147
498
|
*/
|
|
@@ -159,6 +510,10 @@ class Engram {
|
|
|
159
510
|
}
|
|
160
511
|
let sql = 'DELETE FROM memories WHERE session_id = ?';
|
|
161
512
|
const params = [sessionId];
|
|
513
|
+
if (options?.after) {
|
|
514
|
+
sql += ' AND timestamp >= ?';
|
|
515
|
+
params.push(options.after.getTime());
|
|
516
|
+
}
|
|
162
517
|
if (options?.before) {
|
|
163
518
|
sql += ' AND timestamp < ?';
|
|
164
519
|
params.push(options.before.getTime());
|
|
@@ -186,6 +541,37 @@ class Engram {
|
|
|
186
541
|
newest: range?.newest ? new Date(range.newest) : null
|
|
187
542
|
};
|
|
188
543
|
}
|
|
544
|
+
/**
|
|
545
|
+
* Get temporal statistics for a session
|
|
546
|
+
*
|
|
547
|
+
* Returns memory counts grouped by day, useful for activity visualization
|
|
548
|
+
*/
|
|
549
|
+
async temporalStats(sessionId, days = 30) {
|
|
550
|
+
await this.init();
|
|
551
|
+
const since = new Date();
|
|
552
|
+
since.setDate(since.getDate() - days);
|
|
553
|
+
const rows = await this.db.all(`SELECT
|
|
554
|
+
date(timestamp / 1000, 'unixepoch', 'localtime') as date,
|
|
555
|
+
role,
|
|
556
|
+
COUNT(*) as count
|
|
557
|
+
FROM memories
|
|
558
|
+
WHERE session_id = ? AND timestamp >= ?
|
|
559
|
+
GROUP BY date, role
|
|
560
|
+
ORDER BY date DESC`, [sessionId, since.getTime()]);
|
|
561
|
+
// Aggregate by date
|
|
562
|
+
const byDate = new Map();
|
|
563
|
+
for (const row of rows) {
|
|
564
|
+
if (!byDate.has(row.date)) {
|
|
565
|
+
byDate.set(row.date, { count: 0, byRole: {} });
|
|
566
|
+
}
|
|
567
|
+
const day = byDate.get(row.date);
|
|
568
|
+
day.count += row.count;
|
|
569
|
+
day.byRole[row.role] = row.count;
|
|
570
|
+
}
|
|
571
|
+
return Array.from(byDate.entries())
|
|
572
|
+
.sort((a, b) => b[0].localeCompare(a[0]))
|
|
573
|
+
.map(([date, stats]) => ({ date, ...stats }));
|
|
574
|
+
}
|
|
189
575
|
/**
|
|
190
576
|
* Close the database connection
|
|
191
577
|
*/
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AACA,mCAAoC;AAyBpC;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAa,MAAM;IACT,EAAE,CAAkB;IACpB,gBAAgB,CAAS;IACzB,MAAM,CAAS;IACf,WAAW,GAAY,KAAK,CAAC;IAErC,YAAY,SAAuB,EAAE;QACnC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,UAAU,CAAC;QAC1C,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,IAAI,IAAI,CAAC;IAC1D,CAAC;IAEO,KAAK,CAAC,IAAI;QAChB,IAAI,IAAI,CAAC,WAAW;YAAE,OAAO;QAE7B,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC;QAC7C,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;QAEnC,IAAI,CAAC,EAAE,GAAG,MAAM,IAAI,CAAC;YACnB,QAAQ,EAAE,IAAI,CAAC,MAAM;YACrB,MAAM,EAAE,OAAO,CAAC,QAAQ;SACzB,CAAC,CAAC;QAEH,wBAAwB;QACxB,MAAM,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;KAUlB,CAAC,CAAC;QAEH,wCAAwC;QACxC,MAAM,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC;;;KAGlB,CAAC,CAAC;QAEH,kCAAkC;QAClC,MAAM,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC;;;KAGlB,CAAC,CAAC;QAEH,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;IAC1B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,QAAQ,CACZ,SAAiB,EACjB,OAAe,EACf,OAAwC,MAAM,EAC9C,QAAkC;QAElC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAElB,MAAM,EAAE,GAAG,IAAA,mBAAU,EAAC,QAAQ,CAAC;aAC5B,MAAM,CAAC,GAAG,SAAS,IAAI,OAAO,IAAI,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;aAC/C,MAAM,CAAC,KAAK,CAAC;aACb,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAEhB,MAAM,WAAW,GAAG,IAAA,mBAAU,EAAC,QAAQ,CAAC;aACrC,MAAM,CAAC,OAAO,CAAC;aACf,MAAM,CAAC,KAAK,CAAC;aACb,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAEhB,MAAM,KAAK,GAAgB;YACzB,EAAE;YACF,SAAS;YACT,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,gBAAgB,CAAC;YAChD,IAAI;YACJ,SAAS,EAAE,IAAI,IAAI,EAAE;YACrB,QAAQ;SACT,CAAC;QAEF,MAAM,IAAI,CAAC,EAAE,CAAC,GAAG,CACf;oCAC8B,EAC9B;YACE,KAAK,CAAC,EAAE;YACR,KAAK,CAAC,SAAS;YACf,KAAK,CAAC,OAAO;YACb,KAAK,CAAC,IAAI;YACV,KAAK,CAAC,SAAS,CAAC,OAAO,EAAE;YACzB,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI;YAC1C,WAAW;SACZ,CACF,CAAC;QAEF,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,MAAM,CACV,SAAiB,EACjB,KAAc,EACd,QAAgB,EAAE,EAClB,UAAyB,EAAE;QAE3B,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAElB,IAAI,GAAG,GAAG;;;;KAIT,CAAC;QACF,MAAM,MAAM,GAAwB,CAAC,SAAS,CAAC,CAAC;QAEhD,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,GAAG,IAAI,eAAe,CAAC;YACvB,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC;QAED,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YAClB,GAAG,IAAI,qBAAqB,CAAC;YAC7B,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACvC,CAAC;QAED,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,GAAG,IAAI,qBAAqB,CAAC;YAC7B,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;QACxC,CAAC;QAED,4CAA4C;QAC5C,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;YAC1B,MAAM,QAAQ,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAC5E,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACxB,GAAG,IAAI,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,uBAAuB,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC;gBACjF,MAAM,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9C,CAAC;QACH,CAAC;QAED,GAAG,IAAI,kCAAkC,CAAC;QAC1C,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAEnB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAE5C,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAQ,EAAE,EAAE,CAAC,CAAC;YAC7B,EAAE,EAAE,GAAG,CAAC,EAAE;YACV,SAAS,EAAE,GAAG,CAAC,UAAU;YACzB,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,SAAS,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC;YAClC,QAAQ,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS;SAC9D,CAAC,CAAC,CAAC;IACN,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAO,CACX,SAAiB,EACjB,QAAgB,EAAE;QAElB,OAAO,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;IACtD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CACV,SAAiB,EACjB,OAAwC;QAExC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAElB,IAAI,OAAO,EAAE,EAAE,EAAE,CAAC;YAChB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,GAAG,CAC9B,sDAAsD,EACtD,CAAC,SAAS,EAAE,OAAO,CAAC,EAAE,CAAC,CACxB,CAAC;YACF,OAAO,MAAM,CAAC,OAAO,IAAI,CAAC,CAAC;QAC7B,CAAC;QAED,IAAI,GAAG,GAAG,2CAA2C,CAAC;QACtD,MAAM,MAAM,GAAwB,CAAC,SAAS,CAAC,CAAC;QAEhD,IAAI,OAAO,EAAE,MAAM,EAAE,CAAC;YACpB,GAAG,IAAI,oBAAoB,CAAC;YAC5B,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;QACxC,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAC9C,OAAO,MAAM,CAAC,OAAO,IAAI,CAAC,CAAC;IAC7B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK,CAAC,SAAiB;QAM3B,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAElB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,GAAG,CAChC,6DAA6D,EAC7D,CAAC,SAAS,CAAC,CACZ,CAAC;QACF,MAAM,KAAK,GAAG,QAAQ,EAAE,KAAK,IAAI,CAAC,CAAC;QAEnC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,GAAG,CAChC,iFAAiF,EACjF,CAAC,SAAS,CAAC,CACZ,CAAC;QACF,MAAM,MAAM,GAA2B,EAAE,CAAC;QAC1C,QAAQ,CAAC,OAAO,CAAC,CAAC,GAAQ,EAAE,EAAE;YAC5B,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC;QAC/B,CAAC,CAAC,CAAC;QAEH,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,GAAG,CAC7B,8FAA8F,EAC9F,CAAC,SAAS,CAAC,CACZ,CAAC;QAEF,OAAO;YACL,KAAK;YACL,MAAM;YACN,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI;YACrD,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI;SACtD,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;YACtB,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;QAC3B,CAAC;IACH,CAAC;CACF;AApPD,wBAoPC;AAED,kBAAe,MAAM,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED