@cartisien/engram 0.1.0 → 0.3.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 +84 -68
- package/dist/index.d.ts +75 -19
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +313 -60
- package/dist/index.js.map +1 -1
- package/package.json +4 -3
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Engram
|
|
2
2
|
|
|
3
|
-
> **Persistent memory for AI
|
|
3
|
+
> **Persistent semantic memory for AI agents.**
|
|
4
4
|
|
|
5
5
|
```typescript
|
|
6
6
|
import { Engram } from '@cartisien/engram';
|
|
@@ -8,11 +8,11 @@ import { Engram } from '@cartisien/engram';
|
|
|
8
8
|
const memory = new Engram({ dbPath: './memory.db' });
|
|
9
9
|
|
|
10
10
|
// Store
|
|
11
|
-
await memory.remember('user_123', '
|
|
11
|
+
await memory.remember('user_123', 'User prefers TypeScript and dark mode', 'user');
|
|
12
12
|
|
|
13
|
-
// Recall
|
|
14
|
-
const context = await memory.recall('user_123', '
|
|
15
|
-
// [{
|
|
13
|
+
// Recall semantically — finds the right memory even without exact keyword match
|
|
14
|
+
const context = await memory.recall('user_123', 'what are the user\'s preferences?', 5);
|
|
15
|
+
// [{ content: 'User prefers TypeScript and dark mode', similarity: 0.82, ... }]
|
|
16
16
|
```
|
|
17
17
|
|
|
18
18
|
---
|
|
@@ -21,15 +21,16 @@ const context = await memory.recall('user_123', 'What motorcycle?', 5);
|
|
|
21
21
|
|
|
22
22
|
AI assistants are amnesiacs. Every conversation starts fresh. Context windows fill up. Important details get lost.
|
|
23
23
|
|
|
24
|
-
|
|
24
|
+
Stuffing everything into the system prompt wastes tokens and still misses things. You need a retrieval layer — not a dump.
|
|
25
25
|
|
|
26
26
|
## The Solution
|
|
27
27
|
|
|
28
|
-
Engram gives your
|
|
28
|
+
Engram gives your agents **persistent, semantically searchable memory** — SQLite-backed, TypeScript-first, zero config.
|
|
29
29
|
|
|
30
|
-
- **
|
|
31
|
-
- **
|
|
32
|
-
- **
|
|
30
|
+
- **Semantic search:** Finds relevant memories by meaning, not just keywords (via local Ollama embeddings)
|
|
31
|
+
- **Zero config:** Works out of the box, falls back to keyword search without Ollama
|
|
32
|
+
- **Local-first:** Your data stays on your machine. No API keys, no cloud required
|
|
33
|
+
- **MCP-native:** Drop into Claude Desktop or Cursor via [`@cartisien/engram-mcp`](https://github.com/Cartisien/engram-mcp)
|
|
33
34
|
- **Typed:** Full TypeScript support
|
|
34
35
|
|
|
35
36
|
## Installation
|
|
@@ -38,32 +39,41 @@ Engram gives your assistants **persistent, queryable memory** — backed by SQLi
|
|
|
38
39
|
npm install @cartisien/engram
|
|
39
40
|
```
|
|
40
41
|
|
|
42
|
+
### Optional: Local Embeddings (Recommended)
|
|
43
|
+
|
|
44
|
+
For semantic search, install [Ollama](https://ollama.ai) and pull the embedding model:
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
ollama pull nomic-embed-text
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
Without Ollama, Engram falls back to keyword search automatically.
|
|
51
|
+
|
|
41
52
|
## Quick Start
|
|
42
53
|
|
|
43
54
|
```typescript
|
|
44
55
|
import { Engram } from '@cartisien/engram';
|
|
45
56
|
|
|
46
57
|
const memory = new Engram({
|
|
47
|
-
dbPath: './bot-memory.db'
|
|
58
|
+
dbPath: './bot-memory.db',
|
|
59
|
+
embeddingUrl: 'http://localhost:11434', // Ollama default
|
|
48
60
|
});
|
|
49
61
|
|
|
50
|
-
// In your chat handler
|
|
51
|
-
async function
|
|
52
|
-
// 1.
|
|
53
|
-
await memory.remember(sessionId, message, 'user');
|
|
54
|
-
|
|
55
|
-
// 2. Retrieve relevant context
|
|
62
|
+
// In your agent/chat handler
|
|
63
|
+
async function handleMessage(sessionId: string, message: string) {
|
|
64
|
+
// 1. Recall relevant context semantically
|
|
56
65
|
const context = await memory.recall(sessionId, message, 5);
|
|
57
|
-
|
|
58
|
-
//
|
|
66
|
+
|
|
67
|
+
// 2. Build prompt with memory
|
|
59
68
|
const prompt = buildPrompt(context, message);
|
|
60
|
-
|
|
61
|
-
//
|
|
62
|
-
const response = await
|
|
63
|
-
|
|
64
|
-
//
|
|
65
|
-
await memory.remember(sessionId,
|
|
66
|
-
|
|
69
|
+
|
|
70
|
+
// 3. Get AI response
|
|
71
|
+
const response = await llm.chat(prompt);
|
|
72
|
+
|
|
73
|
+
// 4. Store both sides
|
|
74
|
+
await memory.remember(sessionId, message, 'user');
|
|
75
|
+
await memory.remember(sessionId, response, 'assistant');
|
|
76
|
+
|
|
67
77
|
return response;
|
|
68
78
|
}
|
|
69
79
|
```
|
|
@@ -72,43 +82,36 @@ async function handleChat(sessionId: string, message: string) {
|
|
|
72
82
|
|
|
73
83
|
### `new Engram(config?)`
|
|
74
84
|
|
|
75
|
-
Create a memory instance.
|
|
76
|
-
|
|
77
85
|
```typescript
|
|
78
86
|
const memory = new Engram({
|
|
79
|
-
dbPath: './memory.db',
|
|
80
|
-
maxContextLength: 4000
|
|
87
|
+
dbPath: './memory.db', // SQLite file path (default: ':memory:')
|
|
88
|
+
maxContextLength: 4000, // Max chars per entry (default: 4000)
|
|
89
|
+
embeddingUrl: 'http://localhost:11434', // Ollama base URL
|
|
90
|
+
embeddingModel: 'nomic-embed-text', // Embedding model
|
|
91
|
+
semanticSearch: true, // Enable semantic search (default: true)
|
|
81
92
|
});
|
|
82
93
|
```
|
|
83
94
|
|
|
84
95
|
### `remember(sessionId, content, role?, metadata?)`
|
|
85
96
|
|
|
86
|
-
Store a memory
|
|
97
|
+
Store a memory. Embedding is generated automatically.
|
|
87
98
|
|
|
88
99
|
```typescript
|
|
89
|
-
await memory.remember('session_abc', 'User loves Thai food', 'user'
|
|
90
|
-
source: 'preference_extraction'
|
|
91
|
-
});
|
|
100
|
+
await memory.remember('session_abc', 'User loves Thai food', 'user');
|
|
92
101
|
```
|
|
93
102
|
|
|
94
103
|
### `recall(sessionId, query?, limit?, options?)`
|
|
95
104
|
|
|
96
|
-
Retrieve memories
|
|
105
|
+
Retrieve relevant memories. Uses semantic search when available, keyword fallback otherwise. Returns entries sorted by similarity score.
|
|
97
106
|
|
|
98
107
|
```typescript
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
// Keyword search
|
|
103
|
-
const relevant = await memory.recall('session_abc', 'food preferences', 5);
|
|
104
|
-
|
|
105
|
-
// Filtered
|
|
106
|
-
const userOnly = await memory.recall('session_abc', undefined, 10, { role: 'user' });
|
|
108
|
+
const results = await memory.recall('session_abc', 'food preferences', 5);
|
|
109
|
+
// [{ content: '...', similarity: 0.84, ... }]
|
|
107
110
|
```
|
|
108
111
|
|
|
109
112
|
### `history(sessionId, limit?)`
|
|
110
113
|
|
|
111
|
-
|
|
114
|
+
Chronological conversation history.
|
|
112
115
|
|
|
113
116
|
```typescript
|
|
114
117
|
const chat = await memory.history('session_abc', 20);
|
|
@@ -119,56 +122,69 @@ const chat = await memory.history('session_abc', 20);
|
|
|
119
122
|
Delete memories.
|
|
120
123
|
|
|
121
124
|
```typescript
|
|
122
|
-
//
|
|
123
|
-
await memory.forget('session_abc');
|
|
124
|
-
|
|
125
|
-
// Delete specific entry
|
|
126
|
-
await memory.forget('session_abc', { id: 'entry_id' });
|
|
127
|
-
|
|
128
|
-
// Delete old entries
|
|
129
|
-
await memory.forget('session_abc', { before: new Date('2024-01-01') });
|
|
125
|
+
await memory.forget('session_abc'); // all
|
|
126
|
+
await memory.forget('session_abc', { id: 'entry_id' }); // one
|
|
127
|
+
await memory.forget('session_abc', { before: new Date() }); // old entries
|
|
130
128
|
```
|
|
131
129
|
|
|
132
130
|
### `stats(sessionId)`
|
|
133
131
|
|
|
134
|
-
Get memory statistics.
|
|
135
|
-
|
|
136
132
|
```typescript
|
|
137
133
|
const stats = await memory.stats('session_abc');
|
|
138
|
-
// { total: 42, byRole: { user: 21, assistant: 21 }, ... }
|
|
134
|
+
// { total: 42, byRole: { user: 21, assistant: 21 }, withEmbeddings: 42, ... }
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
## MCP Server
|
|
138
|
+
|
|
139
|
+
Use Engram directly in Claude Desktop, Cursor, or any MCP client:
|
|
140
|
+
|
|
141
|
+
```bash
|
|
142
|
+
npx -y @cartisien/engram-mcp
|
|
139
143
|
```
|
|
140
144
|
|
|
145
|
+
```json
|
|
146
|
+
{
|
|
147
|
+
"mcpServers": {
|
|
148
|
+
"engram": {
|
|
149
|
+
"command": "npx",
|
|
150
|
+
"args": ["-y", "@cartisien/engram-mcp"]
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
→ [`@cartisien/engram-mcp`](https://github.com/Cartisien/engram-mcp) on GitHub
|
|
157
|
+
|
|
141
158
|
## Philosophy
|
|
142
159
|
|
|
143
|
-
> *"The trace precedes presence."*
|
|
160
|
+
> *"The trace precedes presence."*
|
|
144
161
|
|
|
145
162
|
Memory isn't storage. It's the substrate of self.
|
|
146
163
|
|
|
147
|
-
Engram doesn't just persist data
|
|
164
|
+
Engram doesn't just persist data — it gives your agents **continuity**. The ability to learn, reference, and grow across conversations.
|
|
148
165
|
|
|
149
166
|
## Roadmap
|
|
150
167
|
|
|
151
168
|
- **v0.1** ✅ SQLite persistence, keyword search
|
|
152
|
-
- **v0.2**
|
|
153
|
-
- **v0.3**
|
|
154
|
-
- **v0.4** 📋
|
|
155
|
-
|
|
156
|
-
## The Trilogy
|
|
169
|
+
- **v0.2** ✅ Semantic search via local Ollama embeddings
|
|
170
|
+
- **v0.3** 🚧 Graph memory — entity relationships, connected context
|
|
171
|
+
- **v0.4** 📋 Memory consolidation, long-term summarization
|
|
157
172
|
|
|
158
|
-
|
|
173
|
+
## The Cartisien Memory Suite
|
|
159
174
|
|
|
160
175
|
| Package | Purpose |
|
|
161
176
|
|---------|---------|
|
|
162
|
-
| `@cartisien/engram` |
|
|
163
|
-
| `@cartisien/
|
|
164
|
-
| `@cartisien/
|
|
177
|
+
| [`@cartisien/engram`](https://github.com/Cartisien/engram) | Persistent memory SDK — **this package** |
|
|
178
|
+
| [`@cartisien/engram-mcp`](https://github.com/Cartisien/engram-mcp) | MCP server for Claude Desktop / Cursor |
|
|
179
|
+
| `@cartisien/extensa` | Vector infrastructure *(coming soon)* |
|
|
180
|
+
| `@cartisien/cogito` | Agent identity & lifecycle *(coming soon)* |
|
|
165
181
|
|
|
166
182
|
*Res cogitans meets res extensa.*
|
|
167
183
|
|
|
168
184
|
## License
|
|
169
185
|
|
|
170
|
-
MIT © Cartisien Interactive
|
|
186
|
+
MIT © [Cartisien Interactive](https://cartisien.com)
|
|
171
187
|
|
|
172
188
|
---
|
|
173
189
|
|
|
174
|
-
**Built
|
|
190
|
+
**Built for people who think forgetting is a bug.**
|
package/dist/index.d.ts
CHANGED
|
@@ -5,34 +5,60 @@ export interface MemoryEntry {
|
|
|
5
5
|
role: 'user' | 'assistant' | 'system';
|
|
6
6
|
timestamp: Date;
|
|
7
7
|
metadata?: Record<string, unknown>;
|
|
8
|
+
similarity?: number;
|
|
9
|
+
}
|
|
10
|
+
export interface GraphNode {
|
|
11
|
+
entity: string;
|
|
12
|
+
type?: string;
|
|
13
|
+
}
|
|
14
|
+
export interface GraphEdge {
|
|
15
|
+
from: string;
|
|
16
|
+
relation: string;
|
|
17
|
+
to: string;
|
|
18
|
+
confidence?: number;
|
|
19
|
+
}
|
|
20
|
+
export interface GraphResult {
|
|
21
|
+
entity: string;
|
|
22
|
+
relationships: Array<{
|
|
23
|
+
type: 'outgoing' | 'incoming';
|
|
24
|
+
relation: string;
|
|
25
|
+
target: string;
|
|
26
|
+
confidence?: number;
|
|
27
|
+
}>;
|
|
28
|
+
relatedMemories: MemoryEntry[];
|
|
8
29
|
}
|
|
9
30
|
export interface RecallOptions {
|
|
10
31
|
limit?: number;
|
|
11
32
|
before?: Date;
|
|
12
33
|
after?: Date;
|
|
13
34
|
role?: 'user' | 'assistant' | 'system';
|
|
35
|
+
includeGraph?: boolean;
|
|
14
36
|
}
|
|
15
37
|
export interface EngramConfig {
|
|
16
38
|
dbPath?: string;
|
|
17
39
|
maxContextLength?: number;
|
|
40
|
+
embeddingUrl?: string;
|
|
41
|
+
embeddingModel?: string;
|
|
42
|
+
semanticSearch?: boolean;
|
|
43
|
+
graphMemory?: boolean;
|
|
44
|
+
graphModel?: string;
|
|
18
45
|
}
|
|
19
46
|
/**
|
|
20
|
-
* Engram - Persistent memory for AI
|
|
47
|
+
* Engram - Persistent semantic memory for AI agents
|
|
21
48
|
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
49
|
+
* v0.3 adds graph memory — entity relationships extracted from memories
|
|
50
|
+
* using a local LLM, enabling richer contextual recall.
|
|
24
51
|
*
|
|
25
52
|
* @example
|
|
26
53
|
* ```typescript
|
|
27
54
|
* import { Engram } from '@cartisien/engram';
|
|
28
55
|
*
|
|
29
|
-
* const memory = new Engram({ dbPath: './memory.db' });
|
|
30
|
-
*
|
|
31
|
-
* // Store a memory
|
|
32
|
-
* await memory.remember('user_123', 'Jeff loves Triumph motorcycles', 'user');
|
|
56
|
+
* const memory = new Engram({ dbPath: './memory.db', graphMemory: true });
|
|
33
57
|
*
|
|
34
|
-
*
|
|
35
|
-
* const context = await memory.recall('
|
|
58
|
+
* await memory.remember('session_1', 'Jeff is building GovScout in React 19', 'user');
|
|
59
|
+
* const context = await memory.recall('session_1', 'what is Jeff building?', 5);
|
|
60
|
+
* const graph = await memory.graph('session_1', 'GovScout');
|
|
61
|
+
* // → { entity: 'GovScout', relationships: [{ relation: 'built_with', target: 'React 19' }], ... }
|
|
36
62
|
* ```
|
|
37
63
|
*/
|
|
38
64
|
export declare class Engram {
|
|
@@ -40,42 +66,72 @@ export declare class Engram {
|
|
|
40
66
|
private maxContextLength;
|
|
41
67
|
private dbPath;
|
|
42
68
|
private initialized;
|
|
69
|
+
private embeddingUrl;
|
|
70
|
+
private embeddingModel;
|
|
71
|
+
private semanticSearch;
|
|
72
|
+
private graphMemory;
|
|
73
|
+
private graphModel;
|
|
43
74
|
constructor(config?: EngramConfig);
|
|
44
75
|
private init;
|
|
76
|
+
/**
|
|
77
|
+
* Fetch embedding vector from Ollama
|
|
78
|
+
*/
|
|
79
|
+
private embed;
|
|
80
|
+
/**
|
|
81
|
+
* Extract entity-relationship triples from text using a local LLM
|
|
82
|
+
*/
|
|
83
|
+
private extractGraph;
|
|
84
|
+
/**
|
|
85
|
+
* Upsert a graph node
|
|
86
|
+
*/
|
|
87
|
+
private upsertNode;
|
|
88
|
+
/**
|
|
89
|
+
* Store a graph edge
|
|
90
|
+
*/
|
|
91
|
+
private storeEdge;
|
|
92
|
+
/**
|
|
93
|
+
* Cosine similarity between two vectors
|
|
94
|
+
*/
|
|
95
|
+
private cosineSimilarity;
|
|
45
96
|
/**
|
|
46
97
|
* Store a memory entry
|
|
47
98
|
*/
|
|
48
99
|
remember(sessionId: string, content: string, role?: 'user' | 'assistant' | 'system', metadata?: Record<string, unknown>): Promise<MemoryEntry>;
|
|
49
100
|
/**
|
|
50
|
-
* Recall memories
|
|
51
|
-
*
|
|
52
|
-
* Simple keyword-based retrieval for v0.1.
|
|
53
|
-
* Semantic search coming in v0.2.
|
|
101
|
+
* Recall memories with optional graph traversal
|
|
54
102
|
*/
|
|
55
103
|
recall(sessionId: string, query?: string, limit?: number, options?: RecallOptions): Promise<MemoryEntry[]>;
|
|
56
104
|
/**
|
|
57
|
-
*
|
|
105
|
+
* Augment recall results with graph-connected memories
|
|
106
|
+
*/
|
|
107
|
+
private augmentWithGraph;
|
|
108
|
+
/**
|
|
109
|
+
* v0.3: Query the knowledge graph for an entity
|
|
110
|
+
*/
|
|
111
|
+
graph(sessionId: string, entity: string): Promise<GraphResult>;
|
|
112
|
+
/**
|
|
113
|
+
* Get recent conversation history
|
|
58
114
|
*/
|
|
59
115
|
history(sessionId: string, limit?: number): Promise<MemoryEntry[]>;
|
|
60
116
|
/**
|
|
61
|
-
*
|
|
117
|
+
* Delete memories
|
|
62
118
|
*/
|
|
63
119
|
forget(sessionId: string, options?: {
|
|
64
120
|
before?: Date;
|
|
65
121
|
id?: string;
|
|
66
122
|
}): Promise<number>;
|
|
67
123
|
/**
|
|
68
|
-
*
|
|
124
|
+
* Memory statistics
|
|
69
125
|
*/
|
|
70
126
|
stats(sessionId: string): Promise<{
|
|
71
127
|
total: number;
|
|
72
128
|
byRole: Record<string, number>;
|
|
73
129
|
oldest: Date | null;
|
|
74
130
|
newest: Date | null;
|
|
131
|
+
withEmbeddings: number;
|
|
132
|
+
graphNodes?: number;
|
|
133
|
+
graphEdges?: number;
|
|
75
134
|
}>;
|
|
76
|
-
/**
|
|
77
|
-
* Close the database connection
|
|
78
|
-
*/
|
|
79
135
|
close(): Promise<void>;
|
|
80
136
|
}
|
|
81
137
|
export default Engram;
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -3,22 +3,21 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.Engram = void 0;
|
|
4
4
|
const crypto_1 = require("crypto");
|
|
5
5
|
/**
|
|
6
|
-
* Engram - Persistent memory for AI
|
|
6
|
+
* Engram - Persistent semantic memory for AI agents
|
|
7
7
|
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
8
|
+
* v0.3 adds graph memory — entity relationships extracted from memories
|
|
9
|
+
* using a local LLM, enabling richer contextual recall.
|
|
10
10
|
*
|
|
11
11
|
* @example
|
|
12
12
|
* ```typescript
|
|
13
13
|
* import { Engram } from '@cartisien/engram';
|
|
14
14
|
*
|
|
15
|
-
* const memory = new Engram({ dbPath: './memory.db' });
|
|
15
|
+
* const memory = new Engram({ dbPath: './memory.db', graphMemory: true });
|
|
16
16
|
*
|
|
17
|
-
*
|
|
18
|
-
* await memory.
|
|
19
|
-
*
|
|
20
|
-
* //
|
|
21
|
-
* const context = await memory.recall('user_123', 'What does Jeff like?', 3);
|
|
17
|
+
* await memory.remember('session_1', 'Jeff is building GovScout in React 19', 'user');
|
|
18
|
+
* const context = await memory.recall('session_1', 'what is Jeff building?', 5);
|
|
19
|
+
* const graph = await memory.graph('session_1', 'GovScout');
|
|
20
|
+
* // → { entity: 'GovScout', relationships: [{ relation: 'built_with', target: 'React 19' }], ... }
|
|
22
21
|
* ```
|
|
23
22
|
*/
|
|
24
23
|
class Engram {
|
|
@@ -26,9 +25,19 @@ class Engram {
|
|
|
26
25
|
maxContextLength;
|
|
27
26
|
dbPath;
|
|
28
27
|
initialized = false;
|
|
28
|
+
embeddingUrl;
|
|
29
|
+
embeddingModel;
|
|
30
|
+
semanticSearch;
|
|
31
|
+
graphMemory;
|
|
32
|
+
graphModel;
|
|
29
33
|
constructor(config = {}) {
|
|
30
34
|
this.dbPath = config.dbPath || ':memory:';
|
|
31
35
|
this.maxContextLength = config.maxContextLength || 4000;
|
|
36
|
+
this.embeddingUrl = config.embeddingUrl || 'http://192.168.68.73:11434';
|
|
37
|
+
this.embeddingModel = config.embeddingModel || 'nomic-embed-text';
|
|
38
|
+
this.semanticSearch = config.semanticSearch !== false;
|
|
39
|
+
this.graphMemory = config.graphMemory === true;
|
|
40
|
+
this.graphModel = config.graphModel || 'qwen2.5:32b';
|
|
32
41
|
}
|
|
33
42
|
async init() {
|
|
34
43
|
if (this.initialized)
|
|
@@ -39,7 +48,7 @@ class Engram {
|
|
|
39
48
|
filename: this.dbPath,
|
|
40
49
|
driver: sqlite3.Database
|
|
41
50
|
});
|
|
42
|
-
//
|
|
51
|
+
// Memories table
|
|
43
52
|
await this.db.exec(`
|
|
44
53
|
CREATE TABLE IF NOT EXISTS memories (
|
|
45
54
|
id TEXT PRIMARY KEY,
|
|
@@ -48,21 +57,146 @@ class Engram {
|
|
|
48
57
|
role TEXT CHECK(role IN ('user', 'assistant', 'system')),
|
|
49
58
|
timestamp INTEGER NOT NULL,
|
|
50
59
|
metadata TEXT,
|
|
51
|
-
content_hash TEXT NOT NULL
|
|
60
|
+
content_hash TEXT NOT NULL,
|
|
61
|
+
embedding TEXT
|
|
52
62
|
);
|
|
53
63
|
`);
|
|
54
|
-
//
|
|
64
|
+
// Add embedding column if upgrading from v0.1
|
|
65
|
+
try {
|
|
66
|
+
await this.db.exec(`ALTER TABLE memories ADD COLUMN embedding TEXT`);
|
|
67
|
+
}
|
|
68
|
+
catch { /* already exists */ }
|
|
69
|
+
// v0.3: Graph tables
|
|
55
70
|
await this.db.exec(`
|
|
56
|
-
CREATE
|
|
57
|
-
|
|
71
|
+
CREATE TABLE IF NOT EXISTS graph_nodes (
|
|
72
|
+
id TEXT PRIMARY KEY,
|
|
73
|
+
session_id TEXT NOT NULL,
|
|
74
|
+
entity TEXT NOT NULL,
|
|
75
|
+
type TEXT,
|
|
76
|
+
created_at INTEGER NOT NULL
|
|
77
|
+
);
|
|
78
|
+
CREATE UNIQUE INDEX IF NOT EXISTS idx_node_entity
|
|
79
|
+
ON graph_nodes(session_id, entity);
|
|
58
80
|
`);
|
|
59
|
-
// Create index for content search
|
|
60
81
|
await this.db.exec(`
|
|
61
|
-
CREATE
|
|
62
|
-
|
|
82
|
+
CREATE TABLE IF NOT EXISTS graph_edges (
|
|
83
|
+
id TEXT PRIMARY KEY,
|
|
84
|
+
session_id TEXT NOT NULL,
|
|
85
|
+
from_entity TEXT NOT NULL,
|
|
86
|
+
relation TEXT NOT NULL,
|
|
87
|
+
to_entity TEXT NOT NULL,
|
|
88
|
+
confidence REAL DEFAULT 1.0,
|
|
89
|
+
memory_id TEXT,
|
|
90
|
+
created_at INTEGER NOT NULL
|
|
91
|
+
);
|
|
92
|
+
CREATE INDEX IF NOT EXISTS idx_edge_from
|
|
93
|
+
ON graph_edges(session_id, from_entity);
|
|
94
|
+
CREATE INDEX IF NOT EXISTS idx_edge_to
|
|
95
|
+
ON graph_edges(session_id, to_entity);
|
|
96
|
+
`);
|
|
97
|
+
await this.db.exec(`
|
|
98
|
+
CREATE INDEX IF NOT EXISTS idx_session_timestamp
|
|
99
|
+
ON memories(session_id, timestamp DESC);
|
|
63
100
|
`);
|
|
64
101
|
this.initialized = true;
|
|
65
102
|
}
|
|
103
|
+
/**
|
|
104
|
+
* Fetch embedding vector from Ollama
|
|
105
|
+
*/
|
|
106
|
+
async embed(text) {
|
|
107
|
+
try {
|
|
108
|
+
const response = await fetch(`${this.embeddingUrl}/api/embeddings`, {
|
|
109
|
+
method: 'POST',
|
|
110
|
+
headers: { 'Content-Type': 'application/json' },
|
|
111
|
+
body: JSON.stringify({ model: this.embeddingModel, prompt: text }),
|
|
112
|
+
signal: AbortSignal.timeout(5000)
|
|
113
|
+
});
|
|
114
|
+
if (!response.ok)
|
|
115
|
+
return null;
|
|
116
|
+
const data = await response.json();
|
|
117
|
+
return data.embedding ?? null;
|
|
118
|
+
}
|
|
119
|
+
catch {
|
|
120
|
+
return null;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Extract entity-relationship triples from text using a local LLM
|
|
125
|
+
*/
|
|
126
|
+
async extractGraph(text) {
|
|
127
|
+
const prompt = `Extract entity-relationship triples from this text. Return ONLY a JSON array of objects with keys: "from", "relation", "to". Be concise. Max 5 triples. If nothing to extract, return [].
|
|
128
|
+
|
|
129
|
+
Text: "${text}"
|
|
130
|
+
|
|
131
|
+
JSON array:`;
|
|
132
|
+
try {
|
|
133
|
+
const response = await fetch(`${this.embeddingUrl}/api/generate`, {
|
|
134
|
+
method: 'POST',
|
|
135
|
+
headers: { 'Content-Type': 'application/json' },
|
|
136
|
+
body: JSON.stringify({
|
|
137
|
+
model: this.graphModel,
|
|
138
|
+
prompt,
|
|
139
|
+
stream: false,
|
|
140
|
+
options: { temperature: 0, num_predict: 200 }
|
|
141
|
+
}),
|
|
142
|
+
signal: AbortSignal.timeout(15000)
|
|
143
|
+
});
|
|
144
|
+
if (!response.ok)
|
|
145
|
+
return [];
|
|
146
|
+
const data = await response.json();
|
|
147
|
+
const raw = data.response.trim();
|
|
148
|
+
// Extract JSON array from response
|
|
149
|
+
const match = raw.match(/\[[\s\S]*\]/);
|
|
150
|
+
if (!match)
|
|
151
|
+
return [];
|
|
152
|
+
const triples = JSON.parse(match[0]);
|
|
153
|
+
return triples
|
|
154
|
+
.filter(t => t.from && t.relation && t.to)
|
|
155
|
+
.map(t => ({
|
|
156
|
+
from: t.from.toLowerCase().trim(),
|
|
157
|
+
relation: t.relation.toLowerCase().trim(),
|
|
158
|
+
to: t.to.toLowerCase().trim(),
|
|
159
|
+
confidence: 0.9
|
|
160
|
+
}));
|
|
161
|
+
}
|
|
162
|
+
catch {
|
|
163
|
+
return [];
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Upsert a graph node
|
|
168
|
+
*/
|
|
169
|
+
async upsertNode(sessionId, entity, type) {
|
|
170
|
+
const id = (0, crypto_1.createHash)('sha256').update(`${sessionId}:${entity}`).digest('hex').slice(0, 16);
|
|
171
|
+
await this.db.run(`INSERT OR IGNORE INTO graph_nodes (id, session_id, entity, type, created_at)
|
|
172
|
+
VALUES (?, ?, ?, ?, ?)`, [id, sessionId, entity, type || null, Date.now()]);
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Store a graph edge
|
|
176
|
+
*/
|
|
177
|
+
async storeEdge(sessionId, edge, memoryId) {
|
|
178
|
+
const id = (0, crypto_1.createHash)('sha256')
|
|
179
|
+
.update(`${sessionId}:${edge.from}:${edge.relation}:${edge.to}`)
|
|
180
|
+
.digest('hex').slice(0, 16);
|
|
181
|
+
await this.upsertNode(sessionId, edge.from);
|
|
182
|
+
await this.upsertNode(sessionId, edge.to);
|
|
183
|
+
await this.db.run(`INSERT OR REPLACE INTO graph_edges
|
|
184
|
+
(id, session_id, from_entity, relation, to_entity, confidence, memory_id, created_at)
|
|
185
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?)`, [id, sessionId, edge.from, edge.relation, edge.to, edge.confidence ?? 1.0, memoryId, Date.now()]);
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Cosine similarity between two vectors
|
|
189
|
+
*/
|
|
190
|
+
cosineSimilarity(a, b) {
|
|
191
|
+
let dot = 0, magA = 0, magB = 0;
|
|
192
|
+
for (let i = 0; i < a.length; i++) {
|
|
193
|
+
dot += a[i] * b[i];
|
|
194
|
+
magA += a[i] * a[i];
|
|
195
|
+
magB += b[i] * b[i];
|
|
196
|
+
}
|
|
197
|
+
const denom = Math.sqrt(magA) * Math.sqrt(magB);
|
|
198
|
+
return denom === 0 ? 0 : dot / denom;
|
|
199
|
+
}
|
|
66
200
|
/**
|
|
67
201
|
* Store a memory entry
|
|
68
202
|
*/
|
|
@@ -70,44 +204,40 @@ class Engram {
|
|
|
70
204
|
await this.init();
|
|
71
205
|
const id = (0, crypto_1.createHash)('sha256')
|
|
72
206
|
.update(`${sessionId}:${content}:${Date.now()}`)
|
|
73
|
-
.digest('hex')
|
|
74
|
-
|
|
75
|
-
const
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
207
|
+
.digest('hex').slice(0, 16);
|
|
208
|
+
const contentHash = (0, crypto_1.createHash)('sha256').update(content).digest('hex').slice(0, 16);
|
|
209
|
+
const truncated = content.slice(0, this.maxContextLength);
|
|
210
|
+
// Fetch embedding
|
|
211
|
+
let embeddingJson = null;
|
|
212
|
+
if (this.semanticSearch) {
|
|
213
|
+
const vector = await this.embed(truncated);
|
|
214
|
+
if (vector)
|
|
215
|
+
embeddingJson = JSON.stringify(vector);
|
|
216
|
+
}
|
|
79
217
|
const entry = {
|
|
80
|
-
id,
|
|
81
|
-
|
|
82
|
-
content: content.slice(0, this.maxContextLength),
|
|
83
|
-
role,
|
|
84
|
-
timestamp: new Date(),
|
|
85
|
-
metadata
|
|
218
|
+
id, sessionId, content: truncated, role,
|
|
219
|
+
timestamp: new Date(), metadata
|
|
86
220
|
};
|
|
87
|
-
await this.db.run(`INSERT INTO memories (id, session_id, content, role, timestamp, metadata, content_hash)
|
|
88
|
-
VALUES (?, ?, ?, ?, ?, ?, ?)`, [
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
221
|
+
await this.db.run(`INSERT INTO memories (id, session_id, content, role, timestamp, metadata, content_hash, embedding)
|
|
222
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?)`, [id, sessionId, truncated, role, entry.timestamp.getTime(),
|
|
223
|
+
metadata ? JSON.stringify(metadata) : null, contentHash, embeddingJson]);
|
|
224
|
+
// v0.3: Extract graph relationships
|
|
225
|
+
if (this.graphMemory) {
|
|
226
|
+
const edges = await this.extractGraph(truncated);
|
|
227
|
+
for (const edge of edges) {
|
|
228
|
+
await this.storeEdge(sessionId, edge, id);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
97
231
|
return entry;
|
|
98
232
|
}
|
|
99
233
|
/**
|
|
100
|
-
* Recall memories
|
|
101
|
-
*
|
|
102
|
-
* Simple keyword-based retrieval for v0.1.
|
|
103
|
-
* Semantic search coming in v0.2.
|
|
234
|
+
* Recall memories with optional graph traversal
|
|
104
235
|
*/
|
|
105
236
|
async recall(sessionId, query, limit = 10, options = {}) {
|
|
106
237
|
await this.init();
|
|
107
238
|
let sql = `
|
|
108
|
-
SELECT id, session_id, content, role, timestamp, metadata
|
|
109
|
-
FROM memories
|
|
110
|
-
WHERE session_id = ?
|
|
239
|
+
SELECT id, session_id, content, role, timestamp, metadata, embedding
|
|
240
|
+
FROM memories WHERE session_id = ?
|
|
111
241
|
`;
|
|
112
242
|
const params = [sessionId];
|
|
113
243
|
if (options.role) {
|
|
@@ -122,7 +252,43 @@ class Engram {
|
|
|
122
252
|
sql += ` AND timestamp <= ?`;
|
|
123
253
|
params.push(options.before.getTime());
|
|
124
254
|
}
|
|
125
|
-
//
|
|
255
|
+
// Semantic search
|
|
256
|
+
if (query && query.trim() && this.semanticSearch) {
|
|
257
|
+
const queryVector = await this.embed(query);
|
|
258
|
+
if (queryVector) {
|
|
259
|
+
sql += ` ORDER BY timestamp DESC`;
|
|
260
|
+
const rows = await this.db.all(sql, params);
|
|
261
|
+
const scored = rows
|
|
262
|
+
.map((row) => {
|
|
263
|
+
let similarity = 0;
|
|
264
|
+
if (row.embedding) {
|
|
265
|
+
try {
|
|
266
|
+
const vec = JSON.parse(row.embedding);
|
|
267
|
+
similarity = this.cosineSimilarity(queryVector, vec);
|
|
268
|
+
}
|
|
269
|
+
catch { /* skip */ }
|
|
270
|
+
}
|
|
271
|
+
return { row, similarity };
|
|
272
|
+
})
|
|
273
|
+
.sort((a, b) => b.similarity - a.similarity)
|
|
274
|
+
.slice(0, limit);
|
|
275
|
+
const results = scored.map(({ row, similarity }) => ({
|
|
276
|
+
id: row.id,
|
|
277
|
+
sessionId: row.session_id,
|
|
278
|
+
content: row.content,
|
|
279
|
+
role: row.role,
|
|
280
|
+
timestamp: new Date(row.timestamp),
|
|
281
|
+
metadata: row.metadata ? JSON.parse(row.metadata) : undefined,
|
|
282
|
+
similarity
|
|
283
|
+
}));
|
|
284
|
+
// v0.3: Augment with graph-connected memories
|
|
285
|
+
if (this.graphMemory && options.includeGraph !== false) {
|
|
286
|
+
return this.augmentWithGraph(sessionId, results, limit);
|
|
287
|
+
}
|
|
288
|
+
return results;
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
// Keyword fallback
|
|
126
292
|
if (query && query.trim()) {
|
|
127
293
|
const keywords = query.toLowerCase().split(/\s+/).filter(k => k.length > 2);
|
|
128
294
|
if (keywords.length > 0) {
|
|
@@ -143,13 +309,97 @@ class Engram {
|
|
|
143
309
|
}));
|
|
144
310
|
}
|
|
145
311
|
/**
|
|
146
|
-
*
|
|
312
|
+
* Augment recall results with graph-connected memories
|
|
313
|
+
*/
|
|
314
|
+
async augmentWithGraph(sessionId, results, limit) {
|
|
315
|
+
// Collect memory IDs that appear in graph edges
|
|
316
|
+
const seenIds = new Set(results.map(r => r.id));
|
|
317
|
+
const graphMemoryIds = new Set();
|
|
318
|
+
for (const result of results.slice(0, 3)) { // Only expand top 3
|
|
319
|
+
const edges = await this.db.all(`SELECT memory_id FROM graph_edges WHERE session_id = ? AND memory_id IS NOT NULL
|
|
320
|
+
AND (from_entity IN (
|
|
321
|
+
SELECT from_entity FROM graph_edges WHERE memory_id = ?
|
|
322
|
+
UNION SELECT to_entity FROM graph_edges WHERE memory_id = ?
|
|
323
|
+
))
|
|
324
|
+
LIMIT 5`, [sessionId, result.id, result.id]);
|
|
325
|
+
for (const edge of edges) {
|
|
326
|
+
if (edge.memory_id && !seenIds.has(edge.memory_id)) {
|
|
327
|
+
graphMemoryIds.add(edge.memory_id);
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
if (graphMemoryIds.size === 0)
|
|
332
|
+
return results;
|
|
333
|
+
// Fetch connected memories
|
|
334
|
+
const placeholders = Array.from(graphMemoryIds).map(() => '?').join(',');
|
|
335
|
+
const connectedRows = await this.db.all(`SELECT id, session_id, content, role, timestamp, metadata FROM memories
|
|
336
|
+
WHERE id IN (${placeholders})`, Array.from(graphMemoryIds));
|
|
337
|
+
const connected = connectedRows.map((row) => ({
|
|
338
|
+
id: row.id,
|
|
339
|
+
sessionId: row.session_id,
|
|
340
|
+
content: row.content,
|
|
341
|
+
role: row.role,
|
|
342
|
+
timestamp: new Date(row.timestamp),
|
|
343
|
+
metadata: row.metadata ? JSON.parse(row.metadata) : undefined,
|
|
344
|
+
similarity: 0 // Graph-connected, not vector-matched
|
|
345
|
+
}));
|
|
346
|
+
return [...results, ...connected].slice(0, limit);
|
|
347
|
+
}
|
|
348
|
+
/**
|
|
349
|
+
* v0.3: Query the knowledge graph for an entity
|
|
350
|
+
*/
|
|
351
|
+
async graph(sessionId, entity) {
|
|
352
|
+
await this.init();
|
|
353
|
+
const ent = entity.toLowerCase().trim();
|
|
354
|
+
// Outgoing edges
|
|
355
|
+
const outgoing = await this.db.all(`SELECT relation, to_entity, confidence, memory_id FROM graph_edges
|
|
356
|
+
WHERE session_id = ? AND from_entity = ?`, [sessionId, ent]);
|
|
357
|
+
// Incoming edges
|
|
358
|
+
const incoming = await this.db.all(`SELECT relation, from_entity, confidence, memory_id FROM graph_edges
|
|
359
|
+
WHERE session_id = ? AND to_entity = ?`, [sessionId, ent]);
|
|
360
|
+
const relationships = [
|
|
361
|
+
...outgoing.map((e) => ({
|
|
362
|
+
type: 'outgoing',
|
|
363
|
+
relation: e.relation,
|
|
364
|
+
target: e.to_entity,
|
|
365
|
+
confidence: e.confidence
|
|
366
|
+
})),
|
|
367
|
+
...incoming.map((e) => ({
|
|
368
|
+
type: 'incoming',
|
|
369
|
+
relation: e.relation,
|
|
370
|
+
target: e.from_entity,
|
|
371
|
+
confidence: e.confidence
|
|
372
|
+
}))
|
|
373
|
+
];
|
|
374
|
+
// Get source memories
|
|
375
|
+
const memoryIds = [
|
|
376
|
+
...outgoing.map((e) => e.memory_id),
|
|
377
|
+
...incoming.map((e) => e.memory_id)
|
|
378
|
+
].filter(Boolean);
|
|
379
|
+
let relatedMemories = [];
|
|
380
|
+
if (memoryIds.length > 0) {
|
|
381
|
+
const placeholders = memoryIds.map(() => '?').join(',');
|
|
382
|
+
const rows = await this.db.all(`SELECT id, session_id, content, role, timestamp, metadata
|
|
383
|
+
FROM memories WHERE id IN (${placeholders})`, memoryIds);
|
|
384
|
+
relatedMemories = rows.map((row) => ({
|
|
385
|
+
id: row.id,
|
|
386
|
+
sessionId: row.session_id,
|
|
387
|
+
content: row.content,
|
|
388
|
+
role: row.role,
|
|
389
|
+
timestamp: new Date(row.timestamp),
|
|
390
|
+
metadata: row.metadata ? JSON.parse(row.metadata) : undefined
|
|
391
|
+
}));
|
|
392
|
+
}
|
|
393
|
+
return { entity: ent, relationships, relatedMemories };
|
|
394
|
+
}
|
|
395
|
+
/**
|
|
396
|
+
* Get recent conversation history
|
|
147
397
|
*/
|
|
148
398
|
async history(sessionId, limit = 20) {
|
|
149
399
|
return this.recall(sessionId, undefined, limit, {});
|
|
150
400
|
}
|
|
151
401
|
/**
|
|
152
|
-
*
|
|
402
|
+
* Delete memories
|
|
153
403
|
*/
|
|
154
404
|
async forget(sessionId, options) {
|
|
155
405
|
await this.init();
|
|
@@ -167,28 +417,31 @@ class Engram {
|
|
|
167
417
|
return result.changes || 0;
|
|
168
418
|
}
|
|
169
419
|
/**
|
|
170
|
-
*
|
|
420
|
+
* Memory statistics
|
|
171
421
|
*/
|
|
172
422
|
async stats(sessionId) {
|
|
173
423
|
await this.init();
|
|
174
424
|
const totalRow = await this.db.get('SELECT COUNT(*) as count FROM memories WHERE session_id = ?', [sessionId]);
|
|
175
|
-
const total = totalRow?.count || 0;
|
|
176
425
|
const roleRows = await this.db.all('SELECT role, COUNT(*) as count FROM memories WHERE session_id = ? GROUP BY role', [sessionId]);
|
|
177
426
|
const byRole = {};
|
|
178
|
-
roleRows.forEach((row) => {
|
|
179
|
-
byRole[row.role] = row.count;
|
|
180
|
-
});
|
|
427
|
+
roleRows.forEach((row) => { byRole[row.role] = row.count; });
|
|
181
428
|
const range = await this.db.get('SELECT MIN(timestamp) as oldest, MAX(timestamp) as newest FROM memories WHERE session_id = ?', [sessionId]);
|
|
182
|
-
|
|
183
|
-
|
|
429
|
+
const embRow = await this.db.get('SELECT COUNT(*) as count FROM memories WHERE session_id = ? AND embedding IS NOT NULL', [sessionId]);
|
|
430
|
+
const stats = {
|
|
431
|
+
total: totalRow?.count || 0,
|
|
184
432
|
byRole,
|
|
185
433
|
oldest: range?.oldest ? new Date(range.oldest) : null,
|
|
186
|
-
newest: range?.newest ? new Date(range.newest) : null
|
|
434
|
+
newest: range?.newest ? new Date(range.newest) : null,
|
|
435
|
+
withEmbeddings: embRow?.count || 0
|
|
187
436
|
};
|
|
437
|
+
if (this.graphMemory) {
|
|
438
|
+
const nodeRow = await this.db.get('SELECT COUNT(*) as count FROM graph_nodes WHERE session_id = ?', [sessionId]);
|
|
439
|
+
const edgeRow = await this.db.get('SELECT COUNT(*) as count FROM graph_edges WHERE session_id = ?', [sessionId]);
|
|
440
|
+
stats.graphNodes = nodeRow?.count || 0;
|
|
441
|
+
stats.graphEdges = edgeRow?.count || 0;
|
|
442
|
+
}
|
|
443
|
+
return stats;
|
|
188
444
|
}
|
|
189
|
-
/**
|
|
190
|
-
* Close the database connection
|
|
191
|
-
*/
|
|
192
445
|
async close() {
|
|
193
446
|
if (this.db) {
|
|
194
447
|
await this.db.close();
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
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.
|
|
3
|
+
"version": "0.3.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",
|
|
@@ -26,8 +26,9 @@
|
|
|
26
26
|
"sqlite3": "^5.1.7"
|
|
27
27
|
},
|
|
28
28
|
"devDependencies": {
|
|
29
|
-
"@types/sqlite3": "^3.1.11",
|
|
30
29
|
"@types/node": "^20.11.0",
|
|
30
|
+
"@types/sqlite3": "^3.1.11",
|
|
31
|
+
"ts-node": "^10.9.2",
|
|
31
32
|
"typescript": "^5.3.3"
|
|
32
33
|
},
|
|
33
34
|
"files": [
|
|
@@ -37,7 +38,7 @@
|
|
|
37
38
|
],
|
|
38
39
|
"repository": {
|
|
39
40
|
"type": "git",
|
|
40
|
-
"url": "https://github.com/cartisien/engram.git"
|
|
41
|
+
"url": "git+https://github.com/cartisien/engram.git"
|
|
41
42
|
},
|
|
42
43
|
"engines": {
|
|
43
44
|
"node": ">=18.0.0"
|