@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 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 context = await memory.recall('user_123', 'What motorcycle?', 5);
15
- // [{ role: 'user', content: 'I ride a Triumph Bonneville', ... }]
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
- // Filtered
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 old entries
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. The Cartesian cogito assumed memory was given. We're making it so.
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
- - **v0.1** SQLite persistence, keyword search
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 SDK |
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 relevant memories
35
- * const context = await memory.recall('user_123', 'What does Jeff like?', 3);
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
- * Simple keyword-based retrieval for v0.1.
53
- * Semantic search coming in v0.2.
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
- recall(sessionId: string, query?: string, limit?: number, options?: RecallOptions): Promise<MemoryEntry[]>;
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
  */
@@ -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;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,MAAM;IACjB,OAAO,CAAC,EAAE,CAAkB;IAC5B,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,WAAW,CAAkB;gBAEzB,MAAM,GAAE,YAAiB;YAKvB,IAAI;IAuClB;;OAEG;IACG,QAAQ,CACZ,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,IAAI,GAAE,MAAM,GAAG,WAAW,GAAG,QAAiB,EAC9C,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACjC,OAAO,CAAC,WAAW,CAAC;IAuCvB;;;;;OAKG;IACG,MAAM,CACV,SAAS,EAAE,MAAM,EACjB,KAAK,CAAC,EAAE,MAAM,EACd,KAAK,GAAE,MAAW,EAClB,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,WAAW,EAAE,CAAC;IAiDzB;;OAEG;IACG,OAAO,CACX,SAAS,EAAE,MAAM,EACjB,KAAK,GAAE,MAAW,GACjB,OAAO,CAAC,WAAW,EAAE,CAAC;IAIzB;;OAEG;IACG,MAAM,CACV,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,IAAI,CAAC;QAAC,EAAE,CAAC,EAAE,MAAM,CAAA;KAAE,GACvC,OAAO,CAAC,MAAM,CAAC;IAuBlB;;OAEG;IACG,KAAK,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;QACtC,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC/B,MAAM,EAAE,IAAI,GAAG,IAAI,CAAC;QACpB,MAAM,EAAE,IAAI,GAAG,IAAI,CAAC;KACrB,CAAC;IA+BF;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAM7B;AAED,eAAe,MAAM,CAAC"}
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 relevant memories
21
- * const context = await memory.recall('user_123', 'What does Jeff like?', 3);
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
- * Simple keyword-based retrieval for v0.1.
103
- * Semantic search coming in v0.2.
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cartisien/engram",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "description": "Persistent memory for AI assistants. SQLite-backed conversational memory with semantic search.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",