@poprobertdaniel/openclaw-memory 0.1.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/LICENSE +21 -0
- package/README.md +410 -0
- package/dist/chunk-CRPEAZ44.cjs +1881 -0
- package/dist/chunk-CRPEAZ44.cjs.map +1 -0
- package/dist/chunk-JNWCMHOB.js +309 -0
- package/dist/chunk-JNWCMHOB.js.map +1 -0
- package/dist/chunk-JSQBXYDM.js +1881 -0
- package/dist/chunk-JSQBXYDM.js.map +1 -0
- package/dist/chunk-NHFPLDZK.js +236 -0
- package/dist/chunk-NHFPLDZK.js.map +1 -0
- package/dist/chunk-NMUPGLJW.cjs +752 -0
- package/dist/chunk-NMUPGLJW.cjs.map +1 -0
- package/dist/chunk-RFLG2CCR.js +752 -0
- package/dist/chunk-RFLG2CCR.js.map +1 -0
- package/dist/chunk-VXULEX3A.cjs +236 -0
- package/dist/chunk-VXULEX3A.cjs.map +1 -0
- package/dist/chunk-ZY2C2CJQ.cjs +309 -0
- package/dist/chunk-ZY2C2CJQ.cjs.map +1 -0
- package/dist/cli/index.cjs +764 -0
- package/dist/cli/index.cjs.map +1 -0
- package/dist/cli/index.d.cts +1 -0
- package/dist/cli/index.d.ts +1 -0
- package/dist/cli/index.js +764 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/index.cjs +48 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +790 -0
- package/dist/index.d.ts +790 -0
- package/dist/index.js +48 -0
- package/dist/index.js.map +1 -0
- package/dist/memory-service-6WDMF6KX.cjs +9 -0
- package/dist/memory-service-6WDMF6KX.cjs.map +1 -0
- package/dist/memory-service-GKEG6J2D.js +9 -0
- package/dist/memory-service-GKEG6J2D.js.map +1 -0
- package/dist/server-BTbRv-yX.d.cts +1199 -0
- package/dist/server-BTbRv-yX.d.ts +1199 -0
- package/dist/server.cjs +9 -0
- package/dist/server.cjs.map +1 -0
- package/dist/server.d.cts +2 -0
- package/dist/server.d.ts +2 -0
- package/dist/server.js +9 -0
- package/dist/server.js.map +1 -0
- package/docker/full.yml +45 -0
- package/docker/standard.yml +26 -0
- package/package.json +109 -0
- package/skill/SKILL.md +139 -0
- package/templates/.env.example +42 -0
- package/templates/docker-compose.full.yml +45 -0
- package/templates/docker-compose.standard.yml +26 -0
- package/templates/openclaw-memory.config.ts +49 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 OpenClaw
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,410 @@
|
|
|
1
|
+
<div align="center">
|
|
2
|
+
|
|
3
|
+
# 🧠 openclaw-memory
|
|
4
|
+
|
|
5
|
+
**Triple-layer memory for AI agents.**
|
|
6
|
+
Local cache · Semantic search · Knowledge graph
|
|
7
|
+
|
|
8
|
+
[](https://www.npmjs.com/package/openclaw-memory)
|
|
9
|
+
[](https://opensource.org/licenses/MIT)
|
|
10
|
+
[](https://www.typescriptlang.org/)
|
|
11
|
+
[](https://bun.sh/)
|
|
12
|
+
|
|
13
|
+
[Quick Start](#quick-start) · [Architecture](#architecture) · [API](#api-reference) · [Configuration](#configuration) · [Contributing](#contributing)
|
|
14
|
+
|
|
15
|
+
</div>
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
Give your AI agents a brain that survives between sessions.
|
|
20
|
+
|
|
21
|
+
openclaw-memory is a standalone memory service with three storage layers — **SQLite** for instant local lookups, **Qdrant** for semantic vector search, and **PostgreSQL + Apache AGE** for knowledge graph traversal. Store memories, search by meaning, and traverse entity relationships through one unified API.
|
|
22
|
+
|
|
23
|
+
Start with zero dependencies (SQLite only). Scale to vectors and graphs when ready.
|
|
24
|
+
|
|
25
|
+
```ts
|
|
26
|
+
import { MemoryService } from 'openclaw-memory';
|
|
27
|
+
|
|
28
|
+
const memory = new MemoryService({ tier: 'lite' });
|
|
29
|
+
await memory.init();
|
|
30
|
+
|
|
31
|
+
// Store a memory
|
|
32
|
+
await memory.store({
|
|
33
|
+
agentId: 'assistant',
|
|
34
|
+
scope: 'user',
|
|
35
|
+
content: 'Alice leads the payments team. She reports to VP Bob Chen.',
|
|
36
|
+
tags: ['org', 'people'],
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
// Search
|
|
40
|
+
const results = await memory.search({
|
|
41
|
+
agentId: 'assistant',
|
|
42
|
+
query: 'who leads payments?',
|
|
43
|
+
});
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## Architecture
|
|
47
|
+
|
|
48
|
+
```
|
|
49
|
+
┌─────────────────────────────────────────────────────────┐
|
|
50
|
+
│ openclaw-memory │
|
|
51
|
+
│ │
|
|
52
|
+
│ ┌─────────────┐ ┌──────────────┐ ┌───────────────┐ │
|
|
53
|
+
│ │ Memory API │ │ Entity │ │ Conversation │ │
|
|
54
|
+
│ │ store() │ │ Extractor │ │ Summarizer │ │
|
|
55
|
+
│ │ search() │ │ │ │ │ │
|
|
56
|
+
│ │ delete() │ │ LLM-powered │ │ Session → │ │
|
|
57
|
+
│ │ list() │ │ extraction │ │ memory │ │
|
|
58
|
+
│ │ │ │ of people, │ │ │ │
|
|
59
|
+
│ │ │ │ projects, │ │ │ │
|
|
60
|
+
│ │ │ │ decisions │ │ │ │
|
|
61
|
+
│ └──────┬───────┘ └──────┬───────┘ └──────┬────────┘ │
|
|
62
|
+
│ │ │ │ │
|
|
63
|
+
│ ───────┴─────────────────┴─────────────────┴────────── │
|
|
64
|
+
│ Storage Orchestrator │
|
|
65
|
+
│ (triple-write, fan-out read, merge/rank) │
|
|
66
|
+
│ ────────────────────────────────────────────────────── │
|
|
67
|
+
│ │ │ │ │
|
|
68
|
+
│ ┌──────┴───────┐ ┌──────┴──────┐ ┌──────┴────────┐ │
|
|
69
|
+
│ │ SQLite │ │ Qdrant │ │ PostgreSQL │ │
|
|
70
|
+
│ │ │ │ │ │ + Apache AGE │ │
|
|
71
|
+
│ │ • FTS5 │ │ • Vectors │ │ │ │
|
|
72
|
+
│ │ • Key-value │ │ • Semantic │ │ • Entities │ │
|
|
73
|
+
│ │ • Metadata │ │ search │ │ • Relations │ │
|
|
74
|
+
│ │ • Tags │ │ • Cosine │ │ • Cypher │ │
|
|
75
|
+
│ │ │ │ sim │ │ queries │ │
|
|
76
|
+
│ └──────────────┘ └─────────────┘ └───────────────┘ │
|
|
77
|
+
│ │
|
|
78
|
+
│ Lite ▲ Standard ▲ Full ▲ │
|
|
79
|
+
│ (zero deps) (+ Qdrant) (+ Postgres/AGE) │
|
|
80
|
+
└─────────────────────────────────────────────────────────┘
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
## Quick Start
|
|
84
|
+
|
|
85
|
+
### 1. Install
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
bun add openclaw-memory
|
|
89
|
+
# or
|
|
90
|
+
npm install openclaw-memory
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
### 2. Initialize
|
|
94
|
+
|
|
95
|
+
```bash
|
|
96
|
+
# Interactive setup wizard
|
|
97
|
+
npx openclaw-memory init
|
|
98
|
+
|
|
99
|
+
# Or start immediately with defaults (Lite mode)
|
|
100
|
+
npx openclaw-memory start
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
### 3. Use the CLI
|
|
104
|
+
|
|
105
|
+
```bash
|
|
106
|
+
# Store a memory
|
|
107
|
+
openclaw-memory store "Decided to use Bun for the API gateway" \
|
|
108
|
+
--agent my-agent --scope global --tags decisions,infrastructure
|
|
109
|
+
|
|
110
|
+
# Search memories
|
|
111
|
+
openclaw-memory search "API gateway decision" --agent my-agent
|
|
112
|
+
|
|
113
|
+
# Check status
|
|
114
|
+
openclaw-memory status
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
### 4. Or use the programmatic API
|
|
118
|
+
|
|
119
|
+
```ts
|
|
120
|
+
import { MemoryService } from 'openclaw-memory';
|
|
121
|
+
|
|
122
|
+
const memory = new MemoryService({
|
|
123
|
+
tier: 'lite',
|
|
124
|
+
sqlite: { path: './agent-memory.db' },
|
|
125
|
+
});
|
|
126
|
+
await memory.init();
|
|
127
|
+
|
|
128
|
+
await memory.store({
|
|
129
|
+
agentId: 'architect',
|
|
130
|
+
scope: 'global',
|
|
131
|
+
content: 'Performance benchmarks showed 3x improvement with Bun.',
|
|
132
|
+
tags: ['decisions', 'infrastructure'],
|
|
133
|
+
});
|
|
134
|
+
|
|
135
|
+
const results = await memory.search({
|
|
136
|
+
agentId: 'architect',
|
|
137
|
+
query: 'deployment performance',
|
|
138
|
+
limit: 5,
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
await memory.close();
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
## Features
|
|
145
|
+
|
|
146
|
+
### 🗂 Three-Tier Storage
|
|
147
|
+
|
|
148
|
+
Choose your complexity level:
|
|
149
|
+
|
|
150
|
+
| Tier | Layers | Dependencies | Best For |
|
|
151
|
+
|------|--------|-------------|----------|
|
|
152
|
+
| **Lite** | SQLite only | None | CLI tools, local agents, prototyping |
|
|
153
|
+
| **Standard** | SQLite + Qdrant | Qdrant | Production agents needing semantic recall |
|
|
154
|
+
| **Full** | SQLite + Qdrant + Postgres/AGE | Qdrant + PostgreSQL | Multi-agent systems, knowledge-heavy domains |
|
|
155
|
+
|
|
156
|
+
Upgrade tiers without changing your code — the API is identical.
|
|
157
|
+
|
|
158
|
+
### 🔍 Semantic Search
|
|
159
|
+
|
|
160
|
+
Find memories by meaning, not just keywords. Requires Standard tier or above.
|
|
161
|
+
|
|
162
|
+
```ts
|
|
163
|
+
await memory.store({
|
|
164
|
+
agentId: 'a', scope: 'global',
|
|
165
|
+
content: 'The board approved a $2M budget for cloud migration',
|
|
166
|
+
});
|
|
167
|
+
await memory.store({
|
|
168
|
+
agentId: 'a', scope: 'global',
|
|
169
|
+
content: 'We decided to move from AWS to GCP next quarter',
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
// Finds both — understands "infrastructure spending" relates to cloud migration
|
|
173
|
+
const results = await memory.search({
|
|
174
|
+
agentId: 'a',
|
|
175
|
+
query: 'cloud infrastructure spending',
|
|
176
|
+
});
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
### 🕸 Knowledge Graph
|
|
180
|
+
|
|
181
|
+
Auto-extract entities and relationships from stored memories. Requires Full tier.
|
|
182
|
+
|
|
183
|
+
```ts
|
|
184
|
+
await memory.store({
|
|
185
|
+
agentId: 'a', scope: 'global',
|
|
186
|
+
content: 'Alice Chen (VP Engineering) approved the Kubernetes migration. Bob Smith will execute it.',
|
|
187
|
+
});
|
|
188
|
+
|
|
189
|
+
// Entities extracted automatically:
|
|
190
|
+
// Alice Chen (Person, VP Engineering)
|
|
191
|
+
// Bob Smith (Person)
|
|
192
|
+
// Kubernetes Migration (Project)
|
|
193
|
+
//
|
|
194
|
+
// Relationships created:
|
|
195
|
+
// Alice Chen -[DECIDED]-> Kubernetes Migration
|
|
196
|
+
// Bob Smith -[WORKS_ON]-> Kubernetes Migration
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
### 🤖 Multi-Agent Scoping
|
|
200
|
+
|
|
201
|
+
Isolate or share memories between agents.
|
|
202
|
+
|
|
203
|
+
```ts
|
|
204
|
+
// Each agent has its own namespace
|
|
205
|
+
await memory.store({ agentId: 'research-agent', scope: 'agent', content: '...' });
|
|
206
|
+
await memory.store({ agentId: 'coding-agent', scope: 'agent', content: '...' });
|
|
207
|
+
|
|
208
|
+
// Search within scope
|
|
209
|
+
const mine = await memory.search({ agentId: 'coding-agent', query: 'deployment' });
|
|
210
|
+
|
|
211
|
+
// Or search across all agents
|
|
212
|
+
const all = await memory.search({ agentId: 'hub', query: 'deployment', crossAgent: true });
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
### ⚡ Graceful Degradation
|
|
216
|
+
|
|
217
|
+
If a layer goes down at runtime, operations gracefully fall back:
|
|
218
|
+
|
|
219
|
+
- Full tier, AGE goes down → writes to SQLite ✓ + Qdrant ✓ + AGE queued for retry
|
|
220
|
+
- Standard tier, Qdrant goes down → writes to SQLite ✓ + Qdrant queued for retry
|
|
221
|
+
- Failed writes are automatically retried via a sync queue
|
|
222
|
+
|
|
223
|
+
### 🏷 Tags & Filtering
|
|
224
|
+
|
|
225
|
+
```ts
|
|
226
|
+
await memory.store({
|
|
227
|
+
agentId: 'a', scope: 'global',
|
|
228
|
+
content: 'Switched from REST to gRPC for inter-service communication',
|
|
229
|
+
tags: ['architecture', 'decisions', 'api-gateway'],
|
|
230
|
+
});
|
|
231
|
+
|
|
232
|
+
const decisions = await memory.list({
|
|
233
|
+
agentId: 'a',
|
|
234
|
+
tags: 'decisions',
|
|
235
|
+
});
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
## CLI Reference
|
|
239
|
+
|
|
240
|
+
```
|
|
241
|
+
openclaw-memory init # Interactive setup wizard
|
|
242
|
+
openclaw-memory start [--bg] [--port] # Start HTTP server
|
|
243
|
+
openclaw-memory stop # Stop running server
|
|
244
|
+
openclaw-memory status # Health check all layers
|
|
245
|
+
openclaw-memory store <content> # Store a memory
|
|
246
|
+
openclaw-memory search <query> # Search memories
|
|
247
|
+
openclaw-memory search <query> --recall # Format for LLM context injection
|
|
248
|
+
openclaw-memory migrate --paths <files> # Import from markdown files
|
|
249
|
+
openclaw-memory infra up [--tier] # Docker compose up
|
|
250
|
+
openclaw-memory infra down # Docker compose down
|
|
251
|
+
openclaw-memory infra status # Show container status
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
## HTTP API
|
|
255
|
+
|
|
256
|
+
When running as a server (`openclaw-memory start`), the following endpoints are available:
|
|
257
|
+
|
|
258
|
+
| Method | Path | Description |
|
|
259
|
+
|--------|------|-------------|
|
|
260
|
+
| `POST` | `/api/memories` | Store a new memory |
|
|
261
|
+
| `GET` | `/api/memories/:id` | Get a memory by ID |
|
|
262
|
+
| `PUT` | `/api/memories/:id` | Update a memory |
|
|
263
|
+
| `DELETE` | `/api/memories/:id` | Delete a memory |
|
|
264
|
+
| `GET` | `/api/memories` | List memories (with filters) |
|
|
265
|
+
| `POST` | `/api/search` | Smart search (auto-selects layers) |
|
|
266
|
+
| `POST` | `/api/search/semantic` | Force Qdrant semantic search |
|
|
267
|
+
| `POST` | `/api/search/graph` | Force AGE graph traversal |
|
|
268
|
+
| `POST` | `/api/search/fulltext` | Force SQLite FTS search |
|
|
269
|
+
| `POST` | `/api/conversations/log` | Append conversation entry |
|
|
270
|
+
| `POST` | `/api/conversations/summarize` | Summarize a session |
|
|
271
|
+
| `GET` | `/api/entities/:type` | List entities by type |
|
|
272
|
+
| `GET` | `/api/entities/:type/:id` | Get entity with relationships |
|
|
273
|
+
| `GET` | `/api/entities/:type/:id/related` | Related entities (graph traversal) |
|
|
274
|
+
| `POST` | `/api/entities/extract` | Manual entity extraction |
|
|
275
|
+
| `GET` | `/api/health` | Health check |
|
|
276
|
+
| `POST` | `/api/sync/retry` | Retry failed L2/L3 syncs |
|
|
277
|
+
| `GET` | `/api/sync/queue` | View pending sync queue |
|
|
278
|
+
| `POST` | `/api/admin/migrate-markdown` | Migrate from markdown files |
|
|
279
|
+
|
|
280
|
+
All endpoints accept/return JSON. Authentication via `Authorization: Bearer <token>` header.
|
|
281
|
+
|
|
282
|
+
## Configuration
|
|
283
|
+
|
|
284
|
+
### Config File
|
|
285
|
+
|
|
286
|
+
Create `openclaw-memory.config.ts` in your project root:
|
|
287
|
+
|
|
288
|
+
```ts
|
|
289
|
+
import { defineConfig } from 'openclaw-memory';
|
|
290
|
+
|
|
291
|
+
export default defineConfig({
|
|
292
|
+
tier: 'standard',
|
|
293
|
+
port: 7777,
|
|
294
|
+
auth: {
|
|
295
|
+
token: process.env.MEMORY_AUTH_TOKEN,
|
|
296
|
+
},
|
|
297
|
+
sqlite: {
|
|
298
|
+
path: '~/.openclaw-memory/memory.sqlite',
|
|
299
|
+
},
|
|
300
|
+
qdrant: {
|
|
301
|
+
url: 'http://localhost:6333',
|
|
302
|
+
collection: 'openclaw_memories',
|
|
303
|
+
},
|
|
304
|
+
embedding: {
|
|
305
|
+
apiKey: process.env.OPENAI_API_KEY,
|
|
306
|
+
model: 'text-embedding-3-small',
|
|
307
|
+
dimensions: 1536,
|
|
308
|
+
},
|
|
309
|
+
extraction: {
|
|
310
|
+
apiKey: process.env.OPENAI_API_KEY,
|
|
311
|
+
model: 'gpt-4o-mini',
|
|
312
|
+
enabled: true,
|
|
313
|
+
},
|
|
314
|
+
});
|
|
315
|
+
```
|
|
316
|
+
|
|
317
|
+
### Environment Variables
|
|
318
|
+
|
|
319
|
+
```bash
|
|
320
|
+
# Tier
|
|
321
|
+
OPENCLAW_MEMORY_TIER=lite
|
|
322
|
+
|
|
323
|
+
# Server
|
|
324
|
+
OPENCLAW_MEMORY_PORT=7777
|
|
325
|
+
|
|
326
|
+
# Auth
|
|
327
|
+
MEMORY_AUTH_TOKEN=my-secret
|
|
328
|
+
|
|
329
|
+
# SQLite
|
|
330
|
+
SQLITE_PATH=~/.openclaw-memory/memory.sqlite
|
|
331
|
+
|
|
332
|
+
# Qdrant (Standard/Full)
|
|
333
|
+
QDRANT_URL=http://localhost:6333
|
|
334
|
+
|
|
335
|
+
# Embedding (any OpenAI-compatible API)
|
|
336
|
+
OPENAI_API_KEY=sk-...
|
|
337
|
+
EMBEDDING_MODEL=text-embedding-3-small
|
|
338
|
+
|
|
339
|
+
# PostgreSQL + AGE (Full)
|
|
340
|
+
PGHOST=localhost
|
|
341
|
+
PGPORT=5432
|
|
342
|
+
PGUSER=openclaw
|
|
343
|
+
PGPASSWORD=secret
|
|
344
|
+
PGDATABASE=agent_memory
|
|
345
|
+
```
|
|
346
|
+
|
|
347
|
+
### Docker Compose
|
|
348
|
+
|
|
349
|
+
For Standard and Full tiers, use the included Docker templates:
|
|
350
|
+
|
|
351
|
+
```bash
|
|
352
|
+
# Start infrastructure
|
|
353
|
+
openclaw-memory infra up --tier standard
|
|
354
|
+
|
|
355
|
+
# Or manually
|
|
356
|
+
docker compose -f node_modules/openclaw-memory/docker/standard.yml up -d
|
|
357
|
+
docker compose -f node_modules/openclaw-memory/docker/full.yml up -d
|
|
358
|
+
```
|
|
359
|
+
|
|
360
|
+
## Comparison
|
|
361
|
+
|
|
362
|
+
| Feature | openclaw-memory | Mem0 | Zep | LangChain Memory | Letta/MemGPT |
|
|
363
|
+
|---------|----------------|------|-----|------------------|--------------|
|
|
364
|
+
| Language | TypeScript/Bun | Python | Python/TS client | Python | Python |
|
|
365
|
+
| Local-first | ✅ SQLite | ❌ Cloud | ❌ Server | ✅ In-memory | ❌ Server |
|
|
366
|
+
| Vector search | ✅ Qdrant | ✅ Various | ✅ Built-in | ✅ Various | ✅ Built-in |
|
|
367
|
+
| Knowledge graph | ✅ Apache AGE | ❌ | ❌ | ❌ | Partial |
|
|
368
|
+
| Entity extraction | ✅ Auto | ❌ | ❌ | ❌ | Partial |
|
|
369
|
+
| Multi-agent | ✅ Scoped | ✅ Users | ✅ Sessions | ❌ | ✅ Agents |
|
|
370
|
+
| Tiered modes | ✅ Lite→Full | ❌ | ❌ | ❌ | ❌ |
|
|
371
|
+
| Self-hosted | ✅ Always | Paid plan | ✅ | N/A | ✅ |
|
|
372
|
+
| License | MIT | Apache 2.0 | Apache 2.0 | MIT | Apache 2.0 |
|
|
373
|
+
|
|
374
|
+
## Contributing
|
|
375
|
+
|
|
376
|
+
```bash
|
|
377
|
+
# Clone
|
|
378
|
+
git clone https://github.com/openclaw/openclaw-memory.git
|
|
379
|
+
cd openclaw-memory
|
|
380
|
+
|
|
381
|
+
# Install
|
|
382
|
+
bun install
|
|
383
|
+
|
|
384
|
+
# Run with hot reload
|
|
385
|
+
bun run dev
|
|
386
|
+
|
|
387
|
+
# Build
|
|
388
|
+
bun run build
|
|
389
|
+
|
|
390
|
+
# Type check
|
|
391
|
+
bun run typecheck
|
|
392
|
+
```
|
|
393
|
+
|
|
394
|
+
### Guidelines
|
|
395
|
+
|
|
396
|
+
- TypeScript strict mode — no `any` unless absolutely necessary
|
|
397
|
+
- Conventional commits — `feat:`, `fix:`, `docs:`, `chore:`
|
|
398
|
+
- PR reviews — all changes go through PR review
|
|
399
|
+
|
|
400
|
+
## License
|
|
401
|
+
|
|
402
|
+
MIT © [OpenClaw](https://github.com/openclaw)
|
|
403
|
+
|
|
404
|
+
---
|
|
405
|
+
|
|
406
|
+
<div align="center">
|
|
407
|
+
|
|
408
|
+
**Built for [OpenClaw](https://openclaw.dev) · Works with any agent framework**
|
|
409
|
+
|
|
410
|
+
</div>
|